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 #ifndef VM_RAW_OBJECT_H_ | 5 #ifndef VM_RAW_OBJECT_H_ |
6 #define VM_RAW_OBJECT_H_ | 6 #define VM_RAW_OBJECT_H_ |
7 | 7 |
8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
9 #include "vm/globals.h" | 9 #include "vm/globals.h" |
10 #include "vm/token.h" | 10 #include "vm/token.h" |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
216 private: \ | 216 private: \ |
217 RAW_OBJECT_IMPLEMENTATION(object); \ | 217 RAW_OBJECT_IMPLEMENTATION(object); \ |
218 Raw##object* ptr() const { \ | 218 Raw##object* ptr() const { \ |
219 ASSERT(IsHeapObject()); \ | 219 ASSERT(IsHeapObject()); \ |
220 return reinterpret_cast<Raw##object*>( \ | 220 return reinterpret_cast<Raw##object*>( \ |
221 reinterpret_cast<uword>(this) - kHeapObjectTag); \ | 221 reinterpret_cast<uword>(this) - kHeapObjectTag); \ |
222 } \ | 222 } \ |
223 SNAPSHOT_WRITER_SUPPORT() \ | 223 SNAPSHOT_WRITER_SUPPORT() \ |
224 HEAP_PROFILER_SUPPORT() \ | 224 HEAP_PROFILER_SUPPORT() \ |
225 | 225 |
| 226 #define OPEN_ARRAY_START(type, align) \ |
| 227 do { \ |
| 228 const uword result = reinterpret_cast<uword>(this) + sizeof(*this); \ |
| 229 ASSERT(Utils::IsAligned(result, sizeof(align))); \ |
| 230 return reinterpret_cast<type*>(result); \ |
| 231 } while (0) |
226 | 232 |
227 // RawObject is the base class of all raw objects, even though it carries the | 233 // RawObject is the base class of all raw objects, even though it carries the |
228 // class_ field not all raw objects are allocated in the heap and thus cannot | 234 // class_ field not all raw objects are allocated in the heap and thus cannot |
229 // be dereferenced (e.g. RawSmi). | 235 // be dereferenced (e.g. RawSmi). |
230 class RawObject { | 236 class RawObject { |
231 public: | 237 public: |
232 // The tags field which is a part of the object header uses the following | 238 // The tags field which is a part of the object header uses the following |
233 // bit fields for storing tags. | 239 // bit fields for storing tags. |
234 enum TagBits { | 240 enum TagBits { |
235 kWatchedBit = 0, | 241 kWatchedBit = 0, |
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
551 return reinterpret_cast<RawObject**>(&ptr()->instantiations_); | 557 return reinterpret_cast<RawObject**>(&ptr()->instantiations_); |
552 } | 558 } |
553 // The instantiations_ array remains empty for instantiated type arguments. | 559 // The instantiations_ array remains empty for instantiated type arguments. |
554 RawArray* instantiations_; // Array of paired canonical vectors: | 560 RawArray* instantiations_; // Array of paired canonical vectors: |
555 // Even index: instantiator. | 561 // Even index: instantiator. |
556 // Odd index: instantiated (without bound error). | 562 // Odd index: instantiated (without bound error). |
557 // Instantiations leading to bound errors do not get cached. | 563 // Instantiations leading to bound errors do not get cached. |
558 RawSmi* length_; | 564 RawSmi* length_; |
559 | 565 |
560 // Variable length data follows here. | 566 // Variable length data follows here. |
561 RawAbstractType* types_[0]; | 567 RawAbstractType** types() { |
| 568 OPEN_ARRAY_START(RawAbstractType*, RawAbstractType*); |
| 569 } |
562 RawObject** to(intptr_t length) { | 570 RawObject** to(intptr_t length) { |
563 return reinterpret_cast<RawObject**>(&ptr()->types_[length - 1]); | 571 return reinterpret_cast<RawObject**>(&ptr()->types()[length - 1]); |
564 } | 572 } |
565 | 573 |
566 friend class SnapshotReader; | 574 friend class SnapshotReader; |
567 }; | 575 }; |
568 | 576 |
569 | 577 |
570 class RawPatchClass : public RawObject { | 578 class RawPatchClass : public RawObject { |
571 private: | 579 private: |
572 RAW_HEAP_OBJECT_IMPLEMENTATION(PatchClass); | 580 RAW_HEAP_OBJECT_IMPLEMENTATION(PatchClass); |
573 | 581 |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
848 // Alive: If true, the embedded object pointers will be visited during GC. | 856 // Alive: If true, the embedded object pointers will be visited during GC. |
849 // This field cannot be shorter because of alignment issues on x64 | 857 // This field cannot be shorter because of alignment issues on x64 |
850 // architectures. | 858 // architectures. |
851 intptr_t state_bits_; // state, is_optimized, is_alive. | 859 intptr_t state_bits_; // state, is_optimized, is_alive. |
852 | 860 |
853 // PC offsets for code patching. | 861 // PC offsets for code patching. |
854 intptr_t entry_patch_pc_offset_; | 862 intptr_t entry_patch_pc_offset_; |
855 intptr_t patch_code_pc_offset_; | 863 intptr_t patch_code_pc_offset_; |
856 intptr_t lazy_deopt_pc_offset_; | 864 intptr_t lazy_deopt_pc_offset_; |
857 | 865 |
858 intptr_t dummy_alignment_; | |
859 | |
860 // Variable length data follows here. | 866 // Variable length data follows here. |
861 int32_t data_[0]; | 867 int32_t* data() { OPEN_ARRAY_START(int32_t, int32_t); } |
862 | 868 |
863 friend class StackFrame; | 869 friend class StackFrame; |
864 friend class MarkingVisitor; | 870 friend class MarkingVisitor; |
865 friend class Function; | 871 friend class Function; |
866 }; | 872 }; |
867 | 873 |
868 | 874 |
869 class RawInstructions : public RawObject { | 875 class RawInstructions : public RawObject { |
870 RAW_HEAP_OBJECT_IMPLEMENTATION(Instructions); | 876 RAW_HEAP_OBJECT_IMPLEMENTATION(Instructions); |
871 | 877 |
872 RawObject** from() { | 878 RawObject** from() { |
873 return reinterpret_cast<RawObject**>(&ptr()->code_); | 879 return reinterpret_cast<RawObject**>(&ptr()->code_); |
874 } | 880 } |
875 RawCode* code_; | 881 RawCode* code_; |
876 RawArray* object_pool_; | 882 RawArray* object_pool_; |
877 RawObject** to() { | 883 RawObject** to() { |
878 return reinterpret_cast<RawObject**>(&ptr()->object_pool_); | 884 return reinterpret_cast<RawObject**>(&ptr()->object_pool_); |
879 } | 885 } |
880 intptr_t size_; | 886 intptr_t size_; |
881 | 887 |
882 // Variable length data follows here. | 888 // Variable length data follows here. |
883 uint8_t data_[0]; | 889 uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); } |
884 | 890 |
885 // Private helper function used while visiting stack frames. The | 891 // Private helper function used while visiting stack frames. The |
886 // code which iterates over dart frames is also called during GC and | 892 // code which iterates over dart frames is also called during GC and |
887 // is not allowed to create handles. | 893 // is not allowed to create handles. |
888 static bool ContainsPC(RawObject* raw_obj, uword pc); | 894 static bool ContainsPC(RawObject* raw_obj, uword pc); |
889 | 895 |
890 friend class RawCode; | 896 friend class RawCode; |
891 friend class Code; | 897 friend class Code; |
892 friend class StackFrame; | 898 friend class StackFrame; |
893 friend class MarkingVisitor; | 899 friend class MarkingVisitor; |
894 friend class Function; | 900 friend class Function; |
895 }; | 901 }; |
896 | 902 |
897 | 903 |
898 class RawPcDescriptors : public RawObject { | 904 class RawPcDescriptors : public RawObject { |
899 RAW_HEAP_OBJECT_IMPLEMENTATION(PcDescriptors); | 905 RAW_HEAP_OBJECT_IMPLEMENTATION(PcDescriptors); |
900 | 906 |
901 intptr_t length_; // Number of descriptors. | 907 intptr_t length_; // Number of descriptors. |
902 | 908 |
903 // Variable length data follows here. | 909 // Variable length data follows here. |
904 intptr_t data_[0]; | 910 intptr_t* data() { OPEN_ARRAY_START(intptr_t, intptr_t); } |
905 | 911 |
906 friend class Object; | 912 friend class Object; |
907 }; | 913 }; |
908 | 914 |
909 | 915 |
910 // Stackmap is an immutable representation of the layout of the stack at a | 916 // Stackmap is an immutable representation of the layout of the stack at a |
911 // PC. The stack map representation consists of a bit map which marks each | 917 // PC. The stack map representation consists of a bit map which marks each |
912 // live object index starting from the base of the frame. | 918 // live object index starting from the base of the frame. |
913 // | 919 // |
914 // The Stackmap also consists of a link to the code object corresponding to | 920 // The Stackmap also consists of a link to the code object corresponding to |
915 // the frame which the stack map is describing. The bit map representation | 921 // the frame which the stack map is describing. The bit map representation |
916 // is optimized for dense and small bit maps, without any upper bound. | 922 // is optimized for dense and small bit maps, without any upper bound. |
917 class RawStackmap : public RawObject { | 923 class RawStackmap : public RawObject { |
918 RAW_HEAP_OBJECT_IMPLEMENTATION(Stackmap); | 924 RAW_HEAP_OBJECT_IMPLEMENTATION(Stackmap); |
919 | 925 |
920 // TODO(kmillikin): We need a small number of bits to encode the register | 926 // TODO(kmillikin): We need a small number of bits to encode the register |
921 // count. Consider packing them in with the length. | 927 // count. Consider packing them in with the length. |
922 intptr_t length_; // Length of payload, in bits. | 928 intptr_t length_; // Length of payload, in bits. |
923 intptr_t register_bit_count_; // Live register bits, included in length_. | 929 intptr_t register_bit_count_; // Live register bits, included in length_. |
924 | 930 |
925 uword pc_; // PC corresponding to this stack map representation. | 931 uword pc_; // PC corresponding to this stack map representation. |
926 | 932 |
927 // Variable length data follows here (bitmap of the stack layout). | 933 // Variable length data follows here (bitmap of the stack layout). |
928 uint8_t data_[0]; | 934 uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); } |
929 }; | 935 }; |
930 | 936 |
931 | 937 |
932 class RawLocalVarDescriptors : public RawObject { | 938 class RawLocalVarDescriptors : public RawObject { |
933 public: | 939 public: |
934 enum VarInfoKind { | 940 enum VarInfoKind { |
935 kStackVar = 1, | 941 kStackVar = 1, |
936 kContextVar, | 942 kContextVar, |
937 kContextLevel, | 943 kContextLevel, |
938 kSavedEntryContext, | 944 kSavedEntryContext, |
939 kSavedCurrentContext | 945 kSavedCurrentContext |
940 }; | 946 }; |
941 | 947 |
942 struct VarInfo { | 948 struct VarInfo { |
943 intptr_t index; // Slot index on stack or in context. | 949 intptr_t index; // Slot index on stack or in context. |
944 int8_t kind; // Entry kind of type VarInfoKind. | 950 int8_t kind; // Entry kind of type VarInfoKind. |
945 int16_t scope_id; // Scope to which the variable belongs. | 951 int16_t scope_id; // Scope to which the variable belongs. |
946 intptr_t begin_pos; // Token position of scope start. | 952 intptr_t begin_pos; // Token position of scope start. |
947 intptr_t end_pos; // Token position of scope end. | 953 intptr_t end_pos; // Token position of scope end. |
948 }; | 954 }; |
949 | 955 |
950 private: | 956 private: |
951 RAW_HEAP_OBJECT_IMPLEMENTATION(LocalVarDescriptors); | 957 RAW_HEAP_OBJECT_IMPLEMENTATION(LocalVarDescriptors); |
952 intptr_t length_; // Number of descriptors. | 958 intptr_t length_; // Number of descriptors. |
953 RawArray* names_; // Array of [length_] variable names. | 959 RawArray* names_; // Array of [length_] variable names. |
954 | 960 |
955 VarInfo data_[0]; // Variable info with [length_] entries. | 961 // Variable info with [length_] entries. |
| 962 VarInfo* data() { OPEN_ARRAY_START(VarInfo, intptr_t); } |
956 }; | 963 }; |
957 | 964 |
958 | 965 |
959 class RawExceptionHandlers : public RawObject { | 966 class RawExceptionHandlers : public RawObject { |
960 public: | 967 public: |
961 // The index into the ExceptionHandlers table corresponds to | 968 // The index into the ExceptionHandlers table corresponds to |
962 // the try_index of the handler. | 969 // the try_index of the handler. |
963 struct HandlerInfo { | 970 struct HandlerInfo { |
964 intptr_t handler_pc; // PC value of handler. | 971 intptr_t handler_pc; // PC value of handler. |
965 int16_t outer_try_index; // Try block index of enclosing try block. | 972 int16_t outer_try_index; // Try block index of enclosing try block. |
966 int8_t needs_stacktrace; // True if a stacktrace is needed. | 973 int8_t needs_stacktrace; // True if a stacktrace is needed. |
967 int8_t has_catch_all; // Catches all exceptions. | 974 int8_t has_catch_all; // Catches all exceptions. |
968 }; | 975 }; |
| 976 |
969 private: | 977 private: |
970 RAW_HEAP_OBJECT_IMPLEMENTATION(ExceptionHandlers); | 978 RAW_HEAP_OBJECT_IMPLEMENTATION(ExceptionHandlers); |
971 | 979 |
972 // Number of exception handler entries. | 980 // Number of exception handler entries. |
973 intptr_t length_; | 981 intptr_t length_; |
974 | 982 |
975 // Array with [length_] entries. Each entry is an array of all handled | 983 // Array with [length_] entries. Each entry is an array of all handled |
976 // exception types. | 984 // exception types. |
977 RawArray* handled_types_data_; | 985 RawArray* handled_types_data_; |
978 | 986 |
979 // Exception handler info of length [length_]. | 987 // Exception handler info of length [length_]. |
980 HandlerInfo data_[0]; | 988 HandlerInfo* data() { OPEN_ARRAY_START(HandlerInfo, intptr_t); } |
981 }; | 989 }; |
982 | 990 |
983 | 991 |
984 // Contains an array of deoptimization commands, e.g., move a specific register | 992 // Contains an array of deoptimization commands, e.g., move a specific register |
985 // into a specific slot of unoptimized frame. | 993 // into a specific slot of unoptimized frame. |
986 class RawDeoptInfo : public RawObject { | 994 class RawDeoptInfo : public RawObject { |
987 RAW_HEAP_OBJECT_IMPLEMENTATION(DeoptInfo); | 995 RAW_HEAP_OBJECT_IMPLEMENTATION(DeoptInfo); |
988 | 996 |
989 RawSmi* length_; // Number of deoptimization commands | 997 RawSmi* length_; // Number of deoptimization commands |
990 | 998 |
991 // Variable length data follows here. | 999 // Variable length data follows here. |
992 intptr_t data_[0]; | 1000 intptr_t* data() { OPEN_ARRAY_START(intptr_t, intptr_t); } |
993 }; | 1001 }; |
994 | 1002 |
995 | 1003 |
996 class RawContext : public RawObject { | 1004 class RawContext : public RawObject { |
997 RAW_HEAP_OBJECT_IMPLEMENTATION(Context); | 1005 RAW_HEAP_OBJECT_IMPLEMENTATION(Context); |
998 | 1006 |
999 intptr_t num_variables_; | 1007 intptr_t num_variables_; |
1000 Isolate* isolate_; | 1008 Isolate* isolate_; |
1001 | 1009 |
1002 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->parent_); } | 1010 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->parent_); } |
1003 RawContext* parent_; | 1011 RawContext* parent_; |
1004 | 1012 |
1005 // Variable length data follows here. | 1013 // Variable length data follows here. |
1006 RawInstance* data_[0]; | 1014 RawInstance** data() { OPEN_ARRAY_START(RawInstance*, RawInstance*); } |
1007 RawObject** to(intptr_t num_vars) { | 1015 RawObject** to(intptr_t num_vars) { |
1008 return reinterpret_cast<RawObject**>(&ptr()->data_[num_vars - 1]); | 1016 return reinterpret_cast<RawObject**>(&ptr()->data()[num_vars - 1]); |
1009 } | 1017 } |
1010 | 1018 |
1011 friend class SnapshotReader; | 1019 friend class SnapshotReader; |
1012 }; | 1020 }; |
1013 | 1021 |
1014 | 1022 |
1015 class RawContextScope : public RawObject { | 1023 class RawContextScope : public RawObject { |
1016 RAW_HEAP_OBJECT_IMPLEMENTATION(ContextScope); | 1024 RAW_HEAP_OBJECT_IMPLEMENTATION(ContextScope); |
1017 | 1025 |
1018 // TODO(iposva): Switch to convential enum offset based structure to avoid | 1026 // TODO(iposva): Switch to convential enum offset based structure to avoid |
1019 // alignment mishaps. | 1027 // alignment mishaps. |
1020 struct VariableDesc { | 1028 struct VariableDesc { |
1021 RawSmi* token_pos; | 1029 RawSmi* token_pos; |
1022 RawString* name; | 1030 RawString* name; |
1023 RawBool* is_final; | 1031 RawBool* is_final; |
1024 RawBool* is_const; | 1032 RawBool* is_const; |
1025 union { | 1033 union { |
1026 RawAbstractType* type; | 1034 RawAbstractType* type; |
1027 RawInstance* value; // iff is_const is true | 1035 RawInstance* value; // iff is_const is true |
1028 }; | 1036 }; |
1029 RawSmi* context_index; | 1037 RawSmi* context_index; |
1030 RawSmi* context_level; | 1038 RawSmi* context_level; |
1031 }; | 1039 }; |
1032 | 1040 |
1033 intptr_t num_variables_; | 1041 intptr_t num_variables_; |
1034 | 1042 |
| 1043 RawObject** from() { |
| 1044 return reinterpret_cast<RawObject**>(&ptr()->data()[0]); |
| 1045 } |
1035 // Variable length data follows here. | 1046 // Variable length data follows here. |
1036 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->data_[0]); } | 1047 RawObject** data() { OPEN_ARRAY_START(RawObject*, RawObject*); } |
1037 RawObject* data_[0]; | |
1038 RawObject** to(intptr_t num_vars) { | 1048 RawObject** to(intptr_t num_vars) { |
1039 intptr_t data_length = num_vars * (sizeof(VariableDesc)/kWordSize); | 1049 const intptr_t data_length = num_vars * (sizeof(VariableDesc)/kWordSize); |
1040 return reinterpret_cast<RawObject**>(&ptr()->data_[data_length - 1]); | 1050 return reinterpret_cast<RawObject**>(&ptr()->data()[data_length - 1]); |
1041 } | 1051 } |
1042 }; | 1052 }; |
1043 | 1053 |
1044 | 1054 |
1045 class RawICData : public RawObject { | 1055 class RawICData : public RawObject { |
1046 RAW_HEAP_OBJECT_IMPLEMENTATION(ICData); | 1056 RAW_HEAP_OBJECT_IMPLEMENTATION(ICData); |
1047 | 1057 |
1048 RawObject** from() { | 1058 RawObject** from() { |
1049 return reinterpret_cast<RawObject**>(&ptr()->owner_); | 1059 return reinterpret_cast<RawObject**>(&ptr()->owner_); |
1050 } | 1060 } |
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1299 // object length so that the object can be traversed during GC). | 1309 // object length so that the object can be traversed during GC). |
1300 intptr_t allocated_length_; | 1310 intptr_t allocated_length_; |
1301 | 1311 |
1302 // Operational length in chunks of the bigint object, clamping can | 1312 // Operational length in chunks of the bigint object, clamping can |
1303 // cause this length to be reduced. If the signed_length_ is | 1313 // cause this length to be reduced. If the signed_length_ is |
1304 // negative then the number is negative. | 1314 // negative then the number is negative. |
1305 intptr_t signed_length_; | 1315 intptr_t signed_length_; |
1306 | 1316 |
1307 // A sequence of Chunks (typedef in Bignum) representing bignum digits. | 1317 // A sequence of Chunks (typedef in Bignum) representing bignum digits. |
1308 // Bignum::Chunk chunks_[Utils::Abs(signed_length_)]; | 1318 // Bignum::Chunk chunks_[Utils::Abs(signed_length_)]; |
1309 uint8_t data_[0]; | 1319 uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); } |
1310 | 1320 |
1311 friend class SnapshotReader; | 1321 friend class SnapshotReader; |
1312 }; | 1322 }; |
1313 | 1323 |
1314 | 1324 |
1315 class RawDouble : public RawNumber { | 1325 class RawDouble : public RawNumber { |
1316 RAW_HEAP_OBJECT_IMPLEMENTATION(Double); | 1326 RAW_HEAP_OBJECT_IMPLEMENTATION(Double); |
1317 | 1327 |
1318 double value_; | 1328 double value_; |
1319 | 1329 |
(...skipping 10 matching lines...) Expand all Loading... |
1330 RawSmi* length_; | 1340 RawSmi* length_; |
1331 RawSmi* hash_; | 1341 RawSmi* hash_; |
1332 RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->hash_); } | 1342 RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->hash_); } |
1333 }; | 1343 }; |
1334 | 1344 |
1335 | 1345 |
1336 class RawOneByteString : public RawString { | 1346 class RawOneByteString : public RawString { |
1337 RAW_HEAP_OBJECT_IMPLEMENTATION(OneByteString); | 1347 RAW_HEAP_OBJECT_IMPLEMENTATION(OneByteString); |
1338 | 1348 |
1339 // Variable length data follows here. | 1349 // Variable length data follows here. |
1340 uint8_t data_[0]; | 1350 uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); } |
1341 | 1351 |
1342 friend class ApiMessageReader; | 1352 friend class ApiMessageReader; |
1343 friend class SnapshotReader; | 1353 friend class SnapshotReader; |
1344 }; | 1354 }; |
1345 | 1355 |
1346 | 1356 |
1347 class RawTwoByteString : public RawString { | 1357 class RawTwoByteString : public RawString { |
1348 RAW_HEAP_OBJECT_IMPLEMENTATION(TwoByteString); | 1358 RAW_HEAP_OBJECT_IMPLEMENTATION(TwoByteString); |
1349 | 1359 |
1350 // Variable length data follows here. | 1360 // Variable length data follows here. |
1351 uint16_t data_[0]; | 1361 uint16_t* data() { OPEN_ARRAY_START(uint16_t, uint16_t); } |
1352 | 1362 |
1353 friend class SnapshotReader; | 1363 friend class SnapshotReader; |
1354 }; | 1364 }; |
1355 | 1365 |
1356 | 1366 |
1357 template<typename T> | 1367 template<typename T> |
1358 class ExternalStringData { | 1368 class ExternalStringData { |
1359 public: | 1369 public: |
1360 ExternalStringData(const T* data, void* peer, Dart_PeerFinalizer callback) : | 1370 ExternalStringData(const T* data, void* peer, Dart_PeerFinalizer callback) : |
1361 data_(data), peer_(peer), callback_(callback) { | 1371 data_(data), peer_(peer), callback_(callback) { |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1403 | 1413 |
1404 class RawArray : public RawInstance { | 1414 class RawArray : public RawInstance { |
1405 RAW_HEAP_OBJECT_IMPLEMENTATION(Array); | 1415 RAW_HEAP_OBJECT_IMPLEMENTATION(Array); |
1406 | 1416 |
1407 RawObject** from() { | 1417 RawObject** from() { |
1408 return reinterpret_cast<RawObject**>(&ptr()->type_arguments_); | 1418 return reinterpret_cast<RawObject**>(&ptr()->type_arguments_); |
1409 } | 1419 } |
1410 RawTypeArguments* type_arguments_; | 1420 RawTypeArguments* type_arguments_; |
1411 RawSmi* length_; | 1421 RawSmi* length_; |
1412 // Variable length data follows here. | 1422 // Variable length data follows here. |
1413 RawObject** data() { | 1423 RawObject** data() { OPEN_ARRAY_START(RawObject*, RawObject*); } |
1414 uword address_of_length = reinterpret_cast<uword>(&length_); | |
1415 return reinterpret_cast<RawObject**>(address_of_length + kWordSize); | |
1416 } | |
1417 RawObject** to(intptr_t length) { | 1424 RawObject** to(intptr_t length) { |
1418 return reinterpret_cast<RawObject**>(&ptr()->data()[length - 1]); | 1425 return reinterpret_cast<RawObject**>(&ptr()->data()[length - 1]); |
1419 } | 1426 } |
1420 | 1427 |
1421 friend class RawCode; | 1428 friend class RawCode; |
1422 friend class RawImmutableArray; | 1429 friend class RawImmutableArray; |
1423 friend class SnapshotReader; | 1430 friend class SnapshotReader; |
1424 friend class GrowableObjectArray; | 1431 friend class GrowableObjectArray; |
1425 friend class Object; | 1432 friend class Object; |
1426 friend class ICData; // For high performance access. | 1433 friend class ICData; // For high performance access. |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1503 #error Architecture is not 32-bit or 64-bit. | 1510 #error Architecture is not 32-bit or 64-bit. |
1504 #endif // ARCH_IS_32_BIT | 1511 #endif // ARCH_IS_32_BIT |
1505 | 1512 |
1506 | 1513 |
1507 class RawTypedData : public RawInstance { | 1514 class RawTypedData : public RawInstance { |
1508 RAW_HEAP_OBJECT_IMPLEMENTATION(TypedData); | 1515 RAW_HEAP_OBJECT_IMPLEMENTATION(TypedData); |
1509 | 1516 |
1510 protected: | 1517 protected: |
1511 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->length_); } | 1518 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->length_); } |
1512 RawSmi* length_; | 1519 RawSmi* length_; |
| 1520 // Variable length data follows here. |
| 1521 uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); } |
1513 RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->length_); } | 1522 RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->length_); } |
1514 | 1523 |
1515 // Variable length data follows here. | |
1516 uint8_t data_[0]; | |
1517 | |
1518 friend class Api; | 1524 friend class Api; |
1519 friend class Object; | 1525 friend class Object; |
1520 friend class Instance; | 1526 friend class Instance; |
1521 }; | 1527 }; |
1522 | 1528 |
1523 | 1529 |
1524 class RawExternalTypedData : public RawInstance { | 1530 class RawExternalTypedData : public RawInstance { |
1525 RAW_HEAP_OBJECT_IMPLEMENTATION(ExternalTypedData); | 1531 RAW_HEAP_OBJECT_IMPLEMENTATION(ExternalTypedData); |
1526 | 1532 |
1527 protected: | 1533 protected: |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1597 RawSmi* num_bracket_expressions_; | 1603 RawSmi* num_bracket_expressions_; |
1598 RawString* pattern_; // Pattern to be used for matching. | 1604 RawString* pattern_; // Pattern to be used for matching. |
1599 RawObject** to() { | 1605 RawObject** to() { |
1600 return reinterpret_cast<RawObject**>(&ptr()->pattern_); | 1606 return reinterpret_cast<RawObject**>(&ptr()->pattern_); |
1601 } | 1607 } |
1602 | 1608 |
1603 intptr_t type_; // Uninitialized, simple or complex. | 1609 intptr_t type_; // Uninitialized, simple or complex. |
1604 intptr_t flags_; // Represents global/local, case insensitive, multiline. | 1610 intptr_t flags_; // Represents global/local, case insensitive, multiline. |
1605 | 1611 |
1606 // Variable length data follows here. | 1612 // Variable length data follows here. |
1607 uint8_t data_[0]; | 1613 uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); } |
1608 }; | 1614 }; |
1609 | 1615 |
1610 | 1616 |
1611 class RawWeakProperty : public RawInstance { | 1617 class RawWeakProperty : public RawInstance { |
1612 RAW_HEAP_OBJECT_IMPLEMENTATION(WeakProperty); | 1618 RAW_HEAP_OBJECT_IMPLEMENTATION(WeakProperty); |
1613 | 1619 |
1614 RawObject** from() { | 1620 RawObject** from() { |
1615 return reinterpret_cast<RawObject**>(&ptr()->key_); | 1621 return reinterpret_cast<RawObject**>(&ptr()->key_); |
1616 } | 1622 } |
1617 RawObject* key_; | 1623 RawObject* key_; |
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1867 COMPILE_ASSERT(kTypedDataInt8ArrayViewCid == kTypedDataInt8ArrayCid + 14); | 1873 COMPILE_ASSERT(kTypedDataInt8ArrayViewCid == kTypedDataInt8ArrayCid + 14); |
1868 COMPILE_ASSERT(kExternalTypedDataInt8ArrayCid == | 1874 COMPILE_ASSERT(kExternalTypedDataInt8ArrayCid == |
1869 kTypedDataInt8ArrayViewCid + 15); | 1875 kTypedDataInt8ArrayViewCid + 15); |
1870 COMPILE_ASSERT(kNullCid == kExternalTypedDataInt8ArrayCid + 14); | 1876 COMPILE_ASSERT(kNullCid == kExternalTypedDataInt8ArrayCid + 14); |
1871 return (kNullCid - kTypedDataInt8ArrayCid); | 1877 return (kNullCid - kTypedDataInt8ArrayCid); |
1872 } | 1878 } |
1873 | 1879 |
1874 } // namespace dart | 1880 } // namespace dart |
1875 | 1881 |
1876 #endif // VM_RAW_OBJECT_H_ | 1882 #endif // VM_RAW_OBJECT_H_ |
OLD | NEW |