OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/bigint_operations.h" | |
6 #include "vm/dart_api_message.h" | 5 #include "vm/dart_api_message.h" |
7 #include "vm/object.h" | 6 #include "vm/object.h" |
8 #include "vm/snapshot_ids.h" | 7 #include "vm/snapshot_ids.h" |
9 #include "vm/symbols.h" | 8 #include "vm/symbols.h" |
10 #include "vm/unicode.h" | 9 #include "vm/unicode.h" |
11 | 10 |
12 namespace dart { | 11 namespace dart { |
13 | 12 |
14 static const int kNumInitialReferences = 4; | 13 static const int kNumInitialReferences = 4; |
15 | 14 |
(...skipping 865 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
881 | 880 |
882 bool ApiMessageWriter::WriteCObject(Dart_CObject* object) { | 881 bool ApiMessageWriter::WriteCObject(Dart_CObject* object) { |
883 if (IsCObjectMarked(object)) { | 882 if (IsCObjectMarked(object)) { |
884 intptr_t object_id = GetMarkedCObjectMark(object); | 883 intptr_t object_id = GetMarkedCObjectMark(object); |
885 WriteIndexedObject(kMaxPredefinedObjectIds + object_id); | 884 WriteIndexedObject(kMaxPredefinedObjectIds + object_id); |
886 return true; | 885 return true; |
887 } | 886 } |
888 | 887 |
889 Dart_CObject_Type type = object->type; | 888 Dart_CObject_Type type = object->type; |
890 if (type == Dart_CObject_kArray) { | 889 if (type == Dart_CObject_kArray) { |
891 const intptr_t array_length = object->value.as_array.length; | |
892 if (array_length < 0 || | |
893 array_length > Array::kMaxElements) { | |
894 return false; | |
895 } | |
896 | |
897 // Write out the serialization header value for this object. | 890 // Write out the serialization header value for this object. |
898 WriteInlinedHeader(object); | 891 WriteInlinedHeader(object); |
899 // Write out the class and tags information. | 892 // Write out the class and tags information. |
900 WriteIndexedObject(kArrayCid); | 893 WriteIndexedObject(kArrayCid); |
901 WriteIntptrValue(0); | 894 WriteIntptrValue(0); |
902 // Write out the length information. | 895 |
903 WriteSmi(array_length); | 896 WriteSmi(object->value.as_array.length); |
904 // Write out the type arguments. | 897 // Write out the type arguments. |
905 WriteNullObject(); | 898 WriteNullObject(); |
906 // Write out array elements. | 899 // Write out array elements. |
907 for (int i = 0; i < array_length; i++) { | 900 for (int i = 0; i < object->value.as_array.length; i++) { |
908 bool success = WriteCObjectRef(object->value.as_array.values[i]); | 901 bool success = WriteCObjectRef(object->value.as_array.values[i]); |
909 if (!success) return false; | 902 if (!success) return false; |
910 } | 903 } |
911 return true; | 904 return true; |
912 } | 905 } |
913 return WriteCObjectInlined(object, type); | 906 return WriteCObjectInlined(object, type); |
914 } | 907 } |
915 | 908 |
916 | 909 |
917 bool ApiMessageWriter::WriteCObjectRef(Dart_CObject* object) { | 910 bool ApiMessageWriter::WriteCObjectRef(Dart_CObject* object) { |
918 if (IsCObjectMarked(object)) { | 911 if (IsCObjectMarked(object)) { |
919 intptr_t object_id = GetMarkedCObjectMark(object); | 912 intptr_t object_id = GetMarkedCObjectMark(object); |
920 WriteIndexedObject(kMaxPredefinedObjectIds + object_id); | 913 WriteIndexedObject(kMaxPredefinedObjectIds + object_id); |
921 return true; | 914 return true; |
922 } | 915 } |
923 | 916 |
924 Dart_CObject_Type type = object->type; | 917 Dart_CObject_Type type = object->type; |
925 if (type == Dart_CObject_kArray) { | 918 if (type == Dart_CObject_kArray) { |
926 const intptr_t array_length = object->value.as_array.length; | |
927 if (array_length < 0 || | |
928 array_length > Array::kMaxElements) { | |
929 return false; | |
930 } | |
931 // Write out the serialization header value for this object. | 919 // Write out the serialization header value for this object. |
932 WriteInlinedHeader(object); | 920 WriteInlinedHeader(object); |
933 // Write out the class information. | 921 // Write out the class information. |
934 WriteIndexedObject(kArrayCid); | 922 WriteIndexedObject(kArrayCid); |
935 // Write out the length information. | 923 // Write out the length information. |
936 WriteSmi(array_length); | 924 WriteSmi(object->value.as_array.length); |
937 // Add object to forward list so that this object is serialized later. | 925 // Add object to forward list so that this object is serialized later. |
938 AddToForwardList(object); | 926 AddToForwardList(object); |
939 return true; | 927 return true; |
940 } | 928 } |
941 return WriteCObjectInlined(object, type); | 929 return WriteCObjectInlined(object, type); |
942 } | 930 } |
943 | 931 |
944 | 932 |
945 bool ApiMessageWriter::WriteForwardedCObject(Dart_CObject* object) { | 933 bool ApiMessageWriter::WriteForwardedCObject(Dart_CObject* object) { |
946 ASSERT(IsCObjectMarked(object)); | 934 ASSERT(IsCObjectMarked(object)); |
947 Dart_CObject_Type type = | 935 Dart_CObject_Type type = |
948 static_cast<Dart_CObject_Type>(object->type & kDartCObjectTypeMask); | 936 static_cast<Dart_CObject_Type>(object->type & kDartCObjectTypeMask); |
949 ASSERT(type == Dart_CObject_kArray); | 937 ASSERT(type == Dart_CObject_kArray); |
950 const intptr_t array_length = object->value.as_array.length; | |
951 if (array_length < 0 || | |
952 array_length > Array::kMaxElements) { | |
953 return false; | |
954 } | |
955 | 938 |
956 // Write out the serialization header value for this object. | 939 // Write out the serialization header value for this object. |
957 intptr_t object_id = GetMarkedCObjectMark(object); | 940 intptr_t object_id = GetMarkedCObjectMark(object); |
958 WriteInlinedObjectHeader(kMaxPredefinedObjectIds + object_id); | 941 WriteInlinedObjectHeader(kMaxPredefinedObjectIds + object_id); |
959 // Write out the class and tags information. | 942 // Write out the class and tags information. |
960 WriteIndexedObject(kArrayCid); | 943 WriteIndexedObject(kArrayCid); |
961 WriteIntptrValue(0); | 944 WriteIntptrValue(0); |
962 // Write out the length information. | 945 |
963 WriteSmi(array_length); | 946 WriteSmi(object->value.as_array.length); |
964 // Write out the type arguments. | 947 // Write out the type arguments. |
965 WriteNullObject(); | 948 WriteNullObject(); |
966 // Write out array elements. | 949 // Write out array elements. |
967 for (int i = 0; i < array_length; i++) { | 950 for (int i = 0; i < object->value.as_array.length; i++) { |
968 bool success = WriteCObjectRef(object->value.as_array.values[i]); | 951 bool success = WriteCObjectRef(object->value.as_array.values[i]); |
969 if (!success) return false; | 952 if (!success) return false; |
970 } | 953 } |
971 return true; | 954 return true; |
972 } | 955 } |
973 | 956 |
974 | 957 |
975 bool ApiMessageWriter::WriteCObjectInlined(Dart_CObject* object, | 958 bool ApiMessageWriter::WriteCObjectInlined(Dart_CObject* object, |
976 Dart_CObject_Type type) { | 959 Dart_CObject_Type type) { |
977 switch (type) { | 960 switch (type) { |
978 case Dart_CObject_kNull: | 961 case Dart_CObject_kNull: |
979 WriteNullObject(); | 962 WriteNullObject(); |
980 break; | 963 break; |
981 case Dart_CObject_kBool: | 964 case Dart_CObject_kBool: |
982 if (object->value.as_bool) { | 965 if (object->value.as_bool) { |
983 WriteVMIsolateObject(kTrueValue); | 966 WriteVMIsolateObject(kTrueValue); |
984 } else { | 967 } else { |
985 WriteVMIsolateObject(kFalseValue); | 968 WriteVMIsolateObject(kFalseValue); |
986 } | 969 } |
987 break; | 970 break; |
988 case Dart_CObject_kInt32: | 971 case Dart_CObject_kInt32: |
989 WriteInt32(object); | 972 WriteInt32(object); |
990 break; | 973 break; |
991 case Dart_CObject_kInt64: | 974 case Dart_CObject_kInt64: |
992 WriteInt64(object); | 975 WriteInt64(object); |
993 break; | 976 break; |
994 case Dart_CObject_kBigint: { | 977 case Dart_CObject_kBigint: { |
995 char* hex_string = object->value.as_bigint; | |
996 const intptr_t chunk_len = | |
997 BigintOperations::ComputeChunkLength(hex_string); | |
998 if (chunk_len < 0 || | |
999 chunk_len > Bigint::kMaxElements) { | |
1000 return false; | |
1001 } | |
1002 // Write out the serialization header value for this object. | 978 // Write out the serialization header value for this object. |
1003 WriteInlinedHeader(object); | 979 WriteInlinedHeader(object); |
1004 // Write out the class and tags information. | 980 // Write out the class and tags information. |
1005 WriteIndexedObject(kBigintCid); | 981 WriteIndexedObject(kBigintCid); |
1006 WriteIntptrValue(0); | 982 WriteIntptrValue(0); |
1007 // Write hex string length and content | 983 // Write hex string length and content |
| 984 char* hex_string = object->value.as_bigint; |
1008 intptr_t len = strlen(hex_string); | 985 intptr_t len = strlen(hex_string); |
1009 WriteIntptrValue(len); | 986 WriteIntptrValue(len); |
1010 for (intptr_t i = 0; i < len; i++) { | 987 for (intptr_t i = 0; i < len; i++) { |
1011 Write<uint8_t>(hex_string[i]); | 988 Write<uint8_t>(hex_string[i]); |
1012 } | 989 } |
1013 break; | 990 break; |
1014 } | 991 } |
1015 case Dart_CObject_kDouble: | 992 case Dart_CObject_kDouble: |
1016 // Write out the serialization header value for this object. | 993 // Write out the serialization header value for this object. |
1017 WriteInlinedHeader(object); | 994 WriteInlinedHeader(object); |
1018 // Write out the class and tags information. | 995 // Write out the class and tags information. |
1019 WriteIndexedObject(kDoubleCid); | 996 WriteIndexedObject(kDoubleCid); |
1020 WriteIntptrValue(0); | 997 WriteIntptrValue(0); |
1021 // Write double value. | 998 // Write double value. |
1022 Write<double>(object->value.as_double); | 999 Write<double>(object->value.as_double); |
1023 break; | 1000 break; |
1024 case Dart_CObject_kString: { | 1001 case Dart_CObject_kString: { |
1025 const uint8_t* utf8_str = | 1002 const uint8_t* utf8_str = |
1026 reinterpret_cast<const uint8_t*>(object->value.as_string); | 1003 reinterpret_cast<const uint8_t*>(object->value.as_string); |
1027 intptr_t utf8_len = strlen(object->value.as_string); | 1004 intptr_t utf8_len = strlen(object->value.as_string); |
1028 if (!Utf8::IsValid(utf8_str, utf8_len)) { | 1005 if (!Utf8::IsValid(utf8_str, utf8_len)) { |
1029 return false; | 1006 return false; |
1030 } | 1007 } |
1031 | 1008 |
1032 Utf8::Type type; | 1009 Utf8::Type type; |
1033 intptr_t len = Utf8::CodeUnitCount(utf8_str, utf8_len, &type); | 1010 intptr_t len = Utf8::CodeUnitCount(utf8_str, utf8_len, &type); |
1034 ASSERT(len > 0); | |
1035 if (len > String::kMaxElements) { | |
1036 return false; | |
1037 } | |
1038 | 1011 |
1039 // Write out the serialization header value for this object. | 1012 // Write out the serialization header value for this object. |
1040 WriteInlinedHeader(object); | 1013 WriteInlinedHeader(object); |
1041 // Write out the class and tags information. | 1014 // Write out the class and tags information. |
1042 WriteIndexedObject(type == Utf8::kLatin1 ? kOneByteStringCid | 1015 WriteIndexedObject(type == Utf8::kLatin1 ? kOneByteStringCid |
1043 : kTwoByteStringCid); | 1016 : kTwoByteStringCid); |
1044 WriteIntptrValue(0); | 1017 WriteIntptrValue(0); |
1045 // Write string length, hash and content | 1018 // Write string length, hash and content |
1046 WriteSmi(len); | 1019 WriteSmi(len); |
1047 WriteSmi(0); // TODO(sgjesse): Hash - not written. | 1020 WriteSmi(0); // TODO(sgjesse): Hash - not written. |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1079 class_id = kTypedDataInt8ArrayCid; | 1052 class_id = kTypedDataInt8ArrayCid; |
1080 break; | 1053 break; |
1081 case Dart_TypedData_kUint8: | 1054 case Dart_TypedData_kUint8: |
1082 class_id = kTypedDataUint8ArrayCid; | 1055 class_id = kTypedDataUint8ArrayCid; |
1083 break; | 1056 break; |
1084 default: | 1057 default: |
1085 class_id = kTypedDataUint8ArrayCid; | 1058 class_id = kTypedDataUint8ArrayCid; |
1086 UNIMPLEMENTED(); | 1059 UNIMPLEMENTED(); |
1087 } | 1060 } |
1088 | 1061 |
1089 intptr_t len = object->value.as_typed_data.length; | |
1090 if (len < 0 || | |
1091 len > TypedData::MaxElements(class_id)) { | |
1092 return false; | |
1093 } | |
1094 | |
1095 WriteIndexedObject(class_id); | 1062 WriteIndexedObject(class_id); |
1096 WriteIntptrValue(RawObject::ClassIdTag::update(class_id, 0)); | 1063 WriteIntptrValue(RawObject::ClassIdTag::update(class_id, 0)); |
| 1064 uint8_t* bytes = object->value.as_typed_data.values; |
| 1065 intptr_t len = object->value.as_typed_data.length; |
1097 WriteSmi(len); | 1066 WriteSmi(len); |
1098 uint8_t* bytes = object->value.as_typed_data.values; | |
1099 for (intptr_t i = 0; i < len; i++) { | 1067 for (intptr_t i = 0; i < len; i++) { |
1100 Write<uint8_t>(bytes[i]); | 1068 Write<uint8_t>(bytes[i]); |
1101 } | 1069 } |
1102 break; | 1070 break; |
1103 } | 1071 } |
1104 case Dart_CObject_kExternalTypedData: { | 1072 case Dart_CObject_kExternalTypedData: { |
1105 // TODO(ager): we are writing C pointers into the message in | 1073 // TODO(ager): we are writing C pointers into the message in |
1106 // order to post external arrays through ports. We need to make | 1074 // order to post external arrays through ports. We need to make |
1107 // sure that messages containing pointers can never be posted | 1075 // sure that messages containing pointers can never be posted |
1108 // to other processes. | 1076 // to other processes. |
1109 | 1077 |
1110 // Write out serialization header value for this object. | 1078 // Write out serialization header value for this object. |
1111 WriteInlinedHeader(object); | 1079 WriteInlinedHeader(object); |
1112 // Write out the class and tag information. | 1080 // Write out the class and tag information. |
1113 WriteIndexedObject(kExternalTypedDataUint8ArrayCid); | 1081 WriteIndexedObject(kExternalTypedDataUint8ArrayCid); |
1114 WriteIntptrValue(RawObject::ClassIdTag::update( | 1082 WriteIntptrValue(RawObject::ClassIdTag::update( |
1115 kExternalTypedDataUint8ArrayCid, 0)); | 1083 kExternalTypedDataUint8ArrayCid, 0)); |
1116 int length = object->value.as_external_typed_data.length; | 1084 int length = object->value.as_external_typed_data.length; |
1117 if (length < 0 || | |
1118 length > ExternalTypedData::MaxElements( | |
1119 kExternalTypedDataUint8ArrayCid)) { | |
1120 return false; | |
1121 } | |
1122 uint8_t* data = object->value.as_external_typed_data.data; | 1085 uint8_t* data = object->value.as_external_typed_data.data; |
1123 void* peer = object->value.as_external_typed_data.peer; | 1086 void* peer = object->value.as_external_typed_data.peer; |
1124 Dart_WeakPersistentHandleFinalizer callback = | 1087 Dart_WeakPersistentHandleFinalizer callback = |
1125 object->value.as_external_typed_data.callback; | 1088 object->value.as_external_typed_data.callback; |
1126 WriteSmi(length); | 1089 WriteSmi(length); |
1127 WriteIntptrValue(reinterpret_cast<intptr_t>(data)); | 1090 WriteIntptrValue(reinterpret_cast<intptr_t>(data)); |
1128 WriteIntptrValue(reinterpret_cast<intptr_t>(peer)); | 1091 WriteIntptrValue(reinterpret_cast<intptr_t>(peer)); |
1129 WriteIntptrValue(reinterpret_cast<intptr_t>(callback)); | 1092 WriteIntptrValue(reinterpret_cast<intptr_t>(callback)); |
1130 break; | 1093 break; |
1131 } | 1094 } |
(...skipping 19 matching lines...) Expand all Loading... |
1151 if (!success) { | 1114 if (!success) { |
1152 UnmarkAllCObjects(object); | 1115 UnmarkAllCObjects(object); |
1153 return false; | 1116 return false; |
1154 } | 1117 } |
1155 } | 1118 } |
1156 UnmarkAllCObjects(object); | 1119 UnmarkAllCObjects(object); |
1157 return true; | 1120 return true; |
1158 } | 1121 } |
1159 | 1122 |
1160 } // namespace dart | 1123 } // namespace dart |
OLD | NEW |