Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(306)

Side by Side Diff: runtime/vm/raw_object.h

Issue 333773006: Removes open arrays (e.g. data[0]) from raw objects. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/object.cc ('k') | runtime/vm/raw_object.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 540 matching lines...) Expand 10 before | Expand all | Expand 10 after
551 return reinterpret_cast<RawObject**>(&ptr()->instantiations_); 551 return reinterpret_cast<RawObject**>(&ptr()->instantiations_);
552 } 552 }
553 // The instantiations_ array remains empty for instantiated type arguments. 553 // The instantiations_ array remains empty for instantiated type arguments.
554 RawArray* instantiations_; // Array of paired canonical vectors: 554 RawArray* instantiations_; // Array of paired canonical vectors:
555 // Even index: instantiator. 555 // Even index: instantiator.
556 // Odd index: instantiated (without bound error). 556 // Odd index: instantiated (without bound error).
557 // Instantiations leading to bound errors do not get cached. 557 // Instantiations leading to bound errors do not get cached.
558 RawSmi* length_; 558 RawSmi* length_;
559 559
560 // Variable length data follows here. 560 // Variable length data follows here.
561 RawAbstractType* types_[0]; 561 RawAbstractType** types() {
562 const uword address_of_length = reinterpret_cast<uword>(&length_);
563 return reinterpret_cast<RawAbstractType**>(
564 address_of_length + sizeof(length_));
565 }
562 RawObject** to(intptr_t length) { 566 RawObject** to(intptr_t length) {
563 return reinterpret_cast<RawObject**>(&ptr()->types_[length - 1]); 567 return reinterpret_cast<RawObject**>(&ptr()->types()[length - 1]);
564 } 568 }
565 569
566 friend class SnapshotReader; 570 friend class SnapshotReader;
567 }; 571 };
568 572
569 573
570 class RawPatchClass : public RawObject { 574 class RawPatchClass : public RawObject {
571 private: 575 private:
572 RAW_HEAP_OBJECT_IMPLEMENTATION(PatchClass); 576 RAW_HEAP_OBJECT_IMPLEMENTATION(PatchClass);
573 577
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after
846 // Alive: If true, the embedded object pointers will be visited during GC. 850 // Alive: If true, the embedded object pointers will be visited during GC.
847 // This field cannot be shorter because of alignment issues on x64 851 // This field cannot be shorter because of alignment issues on x64
848 // architectures. 852 // architectures.
849 intptr_t state_bits_; // state, is_optimized, is_alive. 853 intptr_t state_bits_; // state, is_optimized, is_alive.
850 854
851 // PC offsets for code patching. 855 // PC offsets for code patching.
852 intptr_t entry_patch_pc_offset_; 856 intptr_t entry_patch_pc_offset_;
853 intptr_t patch_code_pc_offset_; 857 intptr_t patch_code_pc_offset_;
854 intptr_t lazy_deopt_pc_offset_; 858 intptr_t lazy_deopt_pc_offset_;
855 859
856 intptr_t dummy_alignment_;
857
858 // Variable length data follows here. 860 // Variable length data follows here.
859 int32_t data_[0]; 861 int32_t* data() {
862 uword address_of_lazy = reinterpret_cast<uword>(&lazy_deopt_pc_offset_);
Ivan Posva 2014/06/16 23:02:13 As discussed this pattern looks a bit fragile from
zra 2014/06/17 17:24:08 Changed to: const uword result = reinterpret_cast
863 return reinterpret_cast<int32_t*>(
864 address_of_lazy + sizeof(lazy_deopt_pc_offset_));
865 }
860 866
861 friend class StackFrame; 867 friend class StackFrame;
862 friend class MarkingVisitor; 868 friend class MarkingVisitor;
863 friend class Function; 869 friend class Function;
864 }; 870 };
865 871
866 872
867 class RawInstructions : public RawObject { 873 class RawInstructions : public RawObject {
868 RAW_HEAP_OBJECT_IMPLEMENTATION(Instructions); 874 RAW_HEAP_OBJECT_IMPLEMENTATION(Instructions);
869 875
870 RawObject** from() { 876 RawObject** from() {
871 return reinterpret_cast<RawObject**>(&ptr()->code_); 877 return reinterpret_cast<RawObject**>(&ptr()->code_);
872 } 878 }
873 RawCode* code_; 879 RawCode* code_;
874 RawArray* object_pool_; 880 RawArray* object_pool_;
875 RawObject** to() { 881 RawObject** to() {
876 return reinterpret_cast<RawObject**>(&ptr()->object_pool_); 882 return reinterpret_cast<RawObject**>(&ptr()->object_pool_);
877 } 883 }
878 intptr_t size_; 884 intptr_t size_;
879 885
880 // Variable length data follows here. 886 // Variable length data follows here.
881 uint8_t data_[0]; 887 uint8_t* data() {
888 const uword address_of_size = reinterpret_cast<uword>(&size_);
889 return reinterpret_cast<uint8_t*>(address_of_size + sizeof(size_));
890 }
882 891
883 // Private helper function used while visiting stack frames. The 892 // Private helper function used while visiting stack frames. The
884 // code which iterates over dart frames is also called during GC and 893 // code which iterates over dart frames is also called during GC and
885 // is not allowed to create handles. 894 // is not allowed to create handles.
886 static bool ContainsPC(RawObject* raw_obj, uword pc); 895 static bool ContainsPC(RawObject* raw_obj, uword pc);
887 896
888 friend class RawCode; 897 friend class RawCode;
889 friend class Code; 898 friend class Code;
890 friend class StackFrame; 899 friend class StackFrame;
891 friend class MarkingVisitor; 900 friend class MarkingVisitor;
892 friend class Function; 901 friend class Function;
893 }; 902 };
894 903
895 904
896 class RawPcDescriptors : public RawObject { 905 class RawPcDescriptors : public RawObject {
897 RAW_HEAP_OBJECT_IMPLEMENTATION(PcDescriptors); 906 RAW_HEAP_OBJECT_IMPLEMENTATION(PcDescriptors);
898 907
899 intptr_t length_; // Number of descriptors. 908 intptr_t length_; // Number of descriptors.
900 909
901 // Variable length data follows here. 910 // Variable length data follows here.
902 intptr_t data_[0]; 911 intptr_t* data() {
912 const uword address_of_length = reinterpret_cast<uword>(&length_);
913 return reinterpret_cast<intptr_t*>(address_of_length + sizeof(length_));
914 }
903 915
904 friend class Object; 916 friend class Object;
905 }; 917 };
906 918
907 919
908 // Stackmap is an immutable representation of the layout of the stack at a 920 // Stackmap is an immutable representation of the layout of the stack at a
909 // PC. The stack map representation consists of a bit map which marks each 921 // PC. The stack map representation consists of a bit map which marks each
910 // live object index starting from the base of the frame. 922 // live object index starting from the base of the frame.
911 // 923 //
912 // The Stackmap also consists of a link to the code object corresponding to 924 // The Stackmap also consists of a link to the code object corresponding to
913 // the frame which the stack map is describing. The bit map representation 925 // the frame which the stack map is describing. The bit map representation
914 // is optimized for dense and small bit maps, without any upper bound. 926 // is optimized for dense and small bit maps, without any upper bound.
915 class RawStackmap : public RawObject { 927 class RawStackmap : public RawObject {
916 RAW_HEAP_OBJECT_IMPLEMENTATION(Stackmap); 928 RAW_HEAP_OBJECT_IMPLEMENTATION(Stackmap);
917 929
918 // TODO(kmillikin): We need a small number of bits to encode the register 930 // TODO(kmillikin): We need a small number of bits to encode the register
919 // count. Consider packing them in with the length. 931 // count. Consider packing them in with the length.
920 intptr_t length_; // Length of payload, in bits. 932 intptr_t length_; // Length of payload, in bits.
921 intptr_t register_bit_count_; // Live register bits, included in length_. 933 intptr_t register_bit_count_; // Live register bits, included in length_.
922 934
923 uword pc_; // PC corresponding to this stack map representation. 935 uword pc_; // PC corresponding to this stack map representation.
924 936
925 // Variable length data follows here (bitmap of the stack layout). 937 // Variable length data follows here (bitmap of the stack layout).
926 uint8_t data_[0]; 938 uint8_t* data() {
939 const uword address_of_pc = reinterpret_cast<uword>(&pc_);
940 return reinterpret_cast<uint8_t*>(address_of_pc + sizeof(pc_));
941 }
927 }; 942 };
928 943
929 944
930 class RawLocalVarDescriptors : public RawObject { 945 class RawLocalVarDescriptors : public RawObject {
931 public: 946 public:
932 enum VarInfoKind { 947 enum VarInfoKind {
933 kStackVar = 1, 948 kStackVar = 1,
934 kContextVar, 949 kContextVar,
935 kContextLevel, 950 kContextLevel,
936 kSavedEntryContext, 951 kSavedEntryContext,
937 kSavedCurrentContext 952 kSavedCurrentContext
938 }; 953 };
939 954
940 struct VarInfo { 955 struct VarInfo {
941 intptr_t index; // Slot index on stack or in context. 956 intptr_t index; // Slot index on stack or in context.
942 int8_t kind; // Entry kind of type VarInfoKind. 957 int8_t kind; // Entry kind of type VarInfoKind.
943 int16_t scope_id; // Scope to which the variable belongs. 958 int16_t scope_id; // Scope to which the variable belongs.
944 intptr_t begin_pos; // Token position of scope start. 959 intptr_t begin_pos; // Token position of scope start.
945 intptr_t end_pos; // Token position of scope end. 960 intptr_t end_pos; // Token position of scope end.
946 }; 961 };
947 962
948 private: 963 private:
949 RAW_HEAP_OBJECT_IMPLEMENTATION(LocalVarDescriptors); 964 RAW_HEAP_OBJECT_IMPLEMENTATION(LocalVarDescriptors);
950 intptr_t length_; // Number of descriptors. 965 intptr_t length_; // Number of descriptors.
951 RawArray* names_; // Array of [length_] variable names. 966 RawArray* names_; // Array of [length_] variable names.
952 967
953 VarInfo data_[0]; // Variable info with [length_] entries. 968 // Variable info with [length_] entries.
969 VarInfo* data() {
970 const uword address_of_names = reinterpret_cast<uword>(&names_);
971 return reinterpret_cast<VarInfo*>(address_of_names + sizeof(names_));
972 }
954 }; 973 };
955 974
956 975
957 class RawExceptionHandlers : public RawObject { 976 class RawExceptionHandlers : public RawObject {
958 public: 977 public:
959 // The index into the ExceptionHandlers table corresponds to 978 // The index into the ExceptionHandlers table corresponds to
960 // the try_index of the handler. 979 // the try_index of the handler.
961 struct HandlerInfo { 980 struct HandlerInfo {
962 intptr_t handler_pc; // PC value of handler. 981 intptr_t handler_pc; // PC value of handler.
963 int16_t outer_try_index; // Try block index of enclosing try block. 982 int16_t outer_try_index; // Try block index of enclosing try block.
964 int8_t needs_stacktrace; // True if a stacktrace is needed. 983 int8_t needs_stacktrace; // True if a stacktrace is needed.
965 int8_t has_catch_all; // Catches all exceptions. 984 int8_t has_catch_all; // Catches all exceptions.
966 }; 985 };
986
967 private: 987 private:
968 RAW_HEAP_OBJECT_IMPLEMENTATION(ExceptionHandlers); 988 RAW_HEAP_OBJECT_IMPLEMENTATION(ExceptionHandlers);
969 989
970 // Number of exception handler entries. 990 // Number of exception handler entries.
971 intptr_t length_; 991 intptr_t length_;
972 992
973 // Array with [length_] entries. Each entry is an array of all handled 993 // Array with [length_] entries. Each entry is an array of all handled
974 // exception types. 994 // exception types.
975 RawArray* handled_types_data_; 995 RawArray* handled_types_data_;
976 996
977 // Exception handler info of length [length_]. 997 // Exception handler info of length [length_].
978 HandlerInfo data_[0]; 998 HandlerInfo* data() {
999 const uword address_of_htd = reinterpret_cast<uword>(&handled_types_data_);
1000 return reinterpret_cast<HandlerInfo*>(
1001 address_of_htd + sizeof(handled_types_data_));
1002 }
979 }; 1003 };
980 1004
981 1005
982 // Contains an array of deoptimization commands, e.g., move a specific register 1006 // Contains an array of deoptimization commands, e.g., move a specific register
983 // into a specific slot of unoptimized frame. 1007 // into a specific slot of unoptimized frame.
984 class RawDeoptInfo : public RawObject { 1008 class RawDeoptInfo : public RawObject {
985 RAW_HEAP_OBJECT_IMPLEMENTATION(DeoptInfo); 1009 RAW_HEAP_OBJECT_IMPLEMENTATION(DeoptInfo);
986 1010
987 RawSmi* length_; // Number of deoptimization commands 1011 RawSmi* length_; // Number of deoptimization commands
988 1012
989 // Variable length data follows here. 1013 // Variable length data follows here.
990 intptr_t data_[0]; 1014 intptr_t* data() {
1015 const uword address_of_length = reinterpret_cast<uword>(&length_);
1016 return reinterpret_cast<intptr_t*>(address_of_length + sizeof(length_));
1017 }
991 }; 1018 };
992 1019
993 1020
994 class RawContext : public RawObject { 1021 class RawContext : public RawObject {
995 RAW_HEAP_OBJECT_IMPLEMENTATION(Context); 1022 RAW_HEAP_OBJECT_IMPLEMENTATION(Context);
996 1023
997 intptr_t num_variables_; 1024 intptr_t num_variables_;
998 Isolate* isolate_; 1025 Isolate* isolate_;
999 1026
1000 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->parent_); } 1027 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->parent_); }
1001 RawContext* parent_; 1028 RawContext* parent_;
1002 1029
1003 // Variable length data follows here. 1030 // Variable length data follows here.
1004 RawInstance* data_[0]; 1031 RawInstance** data() {
1032 const uword address_of_parent = reinterpret_cast<uword>(&parent_);
1033 return reinterpret_cast<RawInstance**>(
1034 address_of_parent + sizeof(parent_));
1035 }
1005 RawObject** to(intptr_t num_vars) { 1036 RawObject** to(intptr_t num_vars) {
1006 return reinterpret_cast<RawObject**>(&ptr()->data_[num_vars - 1]); 1037 return reinterpret_cast<RawObject**>(&ptr()->data()[num_vars - 1]);
1007 } 1038 }
1008 1039
1009 friend class SnapshotReader; 1040 friend class SnapshotReader;
1010 }; 1041 };
1011 1042
1012 1043
1013 class RawContextScope : public RawObject { 1044 class RawContextScope : public RawObject {
1014 RAW_HEAP_OBJECT_IMPLEMENTATION(ContextScope); 1045 RAW_HEAP_OBJECT_IMPLEMENTATION(ContextScope);
1015 1046
1016 // TODO(iposva): Switch to convential enum offset based structure to avoid 1047 // TODO(iposva): Switch to convential enum offset based structure to avoid
1017 // alignment mishaps. 1048 // alignment mishaps.
1018 struct VariableDesc { 1049 struct VariableDesc {
1019 RawSmi* token_pos; 1050 RawSmi* token_pos;
1020 RawString* name; 1051 RawString* name;
1021 RawBool* is_final; 1052 RawBool* is_final;
1022 RawBool* is_const; 1053 RawBool* is_const;
1023 union { 1054 union {
1024 RawAbstractType* type; 1055 RawAbstractType* type;
1025 RawInstance* value; // iff is_const is true 1056 RawInstance* value; // iff is_const is true
1026 }; 1057 };
1027 RawSmi* context_index; 1058 RawSmi* context_index;
1028 RawSmi* context_level; 1059 RawSmi* context_level;
1029 }; 1060 };
1030 1061
1031 intptr_t num_variables_; 1062 intptr_t num_variables_;
1032 1063
1033 // Variable length data follows here. 1064 // Variable length data follows here.
1034 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->data_[0]); } 1065 RawObject** from() {
1035 RawObject* data_[0]; 1066 return reinterpret_cast<RawObject**>(&ptr()->data()[0]);
1067 }
1068 RawObject** data() {
1069 const uword address_of_nv = reinterpret_cast<uword>(&num_variables_);
1070 return reinterpret_cast<RawObject**>(
1071 address_of_nv + sizeof(num_variables_));
1072 }
1036 RawObject** to(intptr_t num_vars) { 1073 RawObject** to(intptr_t num_vars) {
1037 intptr_t data_length = num_vars * (sizeof(VariableDesc)/kWordSize); 1074 const intptr_t data_length = num_vars * (sizeof(VariableDesc)/kWordSize);
1038 return reinterpret_cast<RawObject**>(&ptr()->data_[data_length - 1]); 1075 return reinterpret_cast<RawObject**>(&ptr()->data()[data_length - 1]);
1039 } 1076 }
1040 }; 1077 };
1041 1078
1042 1079
1043 class RawICData : public RawObject { 1080 class RawICData : public RawObject {
1044 RAW_HEAP_OBJECT_IMPLEMENTATION(ICData); 1081 RAW_HEAP_OBJECT_IMPLEMENTATION(ICData);
1045 1082
1046 RawObject** from() { 1083 RawObject** from() {
1047 return reinterpret_cast<RawObject**>(&ptr()->owner_); 1084 return reinterpret_cast<RawObject**>(&ptr()->owner_);
1048 } 1085 }
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after
1297 // object length so that the object can be traversed during GC). 1334 // object length so that the object can be traversed during GC).
1298 intptr_t allocated_length_; 1335 intptr_t allocated_length_;
1299 1336
1300 // Operational length in chunks of the bigint object, clamping can 1337 // Operational length in chunks of the bigint object, clamping can
1301 // cause this length to be reduced. If the signed_length_ is 1338 // cause this length to be reduced. If the signed_length_ is
1302 // negative then the number is negative. 1339 // negative then the number is negative.
1303 intptr_t signed_length_; 1340 intptr_t signed_length_;
1304 1341
1305 // A sequence of Chunks (typedef in Bignum) representing bignum digits. 1342 // A sequence of Chunks (typedef in Bignum) representing bignum digits.
1306 // Bignum::Chunk chunks_[Utils::Abs(signed_length_)]; 1343 // Bignum::Chunk chunks_[Utils::Abs(signed_length_)];
1307 uint8_t data_[0]; 1344 uint8_t* data() {
1345 const uword address_of_length = reinterpret_cast<uword>(&signed_length_);
1346 return reinterpret_cast<uint8_t*>(
1347 address_of_length + sizeof(signed_length_));
1348 }
1308 1349
1309 friend class SnapshotReader; 1350 friend class SnapshotReader;
1310 }; 1351 };
1311 1352
1312 1353
1313 class RawDouble : public RawNumber { 1354 class RawDouble : public RawNumber {
1314 RAW_HEAP_OBJECT_IMPLEMENTATION(Double); 1355 RAW_HEAP_OBJECT_IMPLEMENTATION(Double);
1315 1356
1316 double value_; 1357 double value_;
1317 1358
(...skipping 10 matching lines...) Expand all
1328 RawSmi* length_; 1369 RawSmi* length_;
1329 RawSmi* hash_; 1370 RawSmi* hash_;
1330 RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->hash_); } 1371 RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->hash_); }
1331 }; 1372 };
1332 1373
1333 1374
1334 class RawOneByteString : public RawString { 1375 class RawOneByteString : public RawString {
1335 RAW_HEAP_OBJECT_IMPLEMENTATION(OneByteString); 1376 RAW_HEAP_OBJECT_IMPLEMENTATION(OneByteString);
1336 1377
1337 // Variable length data follows here. 1378 // Variable length data follows here.
1338 uint8_t data_[0]; 1379 uint8_t* data() {
1380 const uword address_of_hash = reinterpret_cast<uword>(&hash_);
1381 return reinterpret_cast<uint8_t*>(address_of_hash + sizeof(hash_));
1382 }
1339 1383
1340 friend class ApiMessageReader; 1384 friend class ApiMessageReader;
1341 friend class SnapshotReader; 1385 friend class SnapshotReader;
1342 }; 1386 };
1343 1387
1344 1388
1345 class RawTwoByteString : public RawString { 1389 class RawTwoByteString : public RawString {
1346 RAW_HEAP_OBJECT_IMPLEMENTATION(TwoByteString); 1390 RAW_HEAP_OBJECT_IMPLEMENTATION(TwoByteString);
1347 1391
1348 // Variable length data follows here. 1392 // Variable length data follows here.
1349 uint16_t data_[0]; 1393 uint16_t* data() {
1394 const uword address_of_hash = reinterpret_cast<uword>(&hash_);
1395 return reinterpret_cast<uint16_t*>(address_of_hash + sizeof(hash_));
1396 }
1350 1397
1351 friend class SnapshotReader; 1398 friend class SnapshotReader;
1352 }; 1399 };
1353 1400
1354 1401
1355 template<typename T> 1402 template<typename T>
1356 class ExternalStringData { 1403 class ExternalStringData {
1357 public: 1404 public:
1358 ExternalStringData(const T* data, void* peer, Dart_PeerFinalizer callback) : 1405 ExternalStringData(const T* data, void* peer, Dart_PeerFinalizer callback) :
1359 data_(data), peer_(peer), callback_(callback) { 1406 data_(data), peer_(peer), callback_(callback) {
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1403 RAW_HEAP_OBJECT_IMPLEMENTATION(Array); 1450 RAW_HEAP_OBJECT_IMPLEMENTATION(Array);
1404 1451
1405 RawObject** from() { 1452 RawObject** from() {
1406 return reinterpret_cast<RawObject**>(&ptr()->type_arguments_); 1453 return reinterpret_cast<RawObject**>(&ptr()->type_arguments_);
1407 } 1454 }
1408 RawTypeArguments* type_arguments_; 1455 RawTypeArguments* type_arguments_;
1409 RawSmi* length_; 1456 RawSmi* length_;
1410 // Variable length data follows here. 1457 // Variable length data follows here.
1411 RawObject** data() { 1458 RawObject** data() {
1412 uword address_of_length = reinterpret_cast<uword>(&length_); 1459 uword address_of_length = reinterpret_cast<uword>(&length_);
1413 return reinterpret_cast<RawObject**>(address_of_length + kWordSize); 1460 return reinterpret_cast<RawObject**>(address_of_length + sizeof(length_));
1414 } 1461 }
1415 RawObject** to(intptr_t length) { 1462 RawObject** to(intptr_t length) {
1416 return reinterpret_cast<RawObject**>(&ptr()->data()[length - 1]); 1463 return reinterpret_cast<RawObject**>(&ptr()->data()[length - 1]);
1417 } 1464 }
1418 1465
1419 friend class RawCode; 1466 friend class RawCode;
1420 friend class RawImmutableArray; 1467 friend class RawImmutableArray;
1421 friend class SnapshotReader; 1468 friend class SnapshotReader;
1422 friend class GrowableObjectArray; 1469 friend class GrowableObjectArray;
1423 friend class Object; 1470 friend class Object;
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
1501 #error Architecture is not 32-bit or 64-bit. 1548 #error Architecture is not 32-bit or 64-bit.
1502 #endif // ARCH_IS_32_BIT 1549 #endif // ARCH_IS_32_BIT
1503 1550
1504 1551
1505 class RawTypedData : public RawInstance { 1552 class RawTypedData : public RawInstance {
1506 RAW_HEAP_OBJECT_IMPLEMENTATION(TypedData); 1553 RAW_HEAP_OBJECT_IMPLEMENTATION(TypedData);
1507 1554
1508 protected: 1555 protected:
1509 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->length_); } 1556 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->length_); }
1510 RawSmi* length_; 1557 RawSmi* length_;
1558 // Variable length data follows here.
1559 uint8_t* data() {
1560 uword address_of_length = reinterpret_cast<uword>(&length_);
1561 return reinterpret_cast<uint8_t*>(address_of_length + sizeof(length_));
1562 }
1511 RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->length_); } 1563 RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->length_); }
1512 1564
1513 // Variable length data follows here.
1514 uint8_t data_[0];
1515
1516 friend class Api; 1565 friend class Api;
1517 friend class Object; 1566 friend class Object;
1518 friend class Instance; 1567 friend class Instance;
1519 }; 1568 };
1520 1569
1521 1570
1522 class RawExternalTypedData : public RawInstance { 1571 class RawExternalTypedData : public RawInstance {
1523 RAW_HEAP_OBJECT_IMPLEMENTATION(ExternalTypedData); 1572 RAW_HEAP_OBJECT_IMPLEMENTATION(ExternalTypedData);
1524 1573
1525 protected: 1574 protected:
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
1595 RawSmi* num_bracket_expressions_; 1644 RawSmi* num_bracket_expressions_;
1596 RawString* pattern_; // Pattern to be used for matching. 1645 RawString* pattern_; // Pattern to be used for matching.
1597 RawObject** to() { 1646 RawObject** to() {
1598 return reinterpret_cast<RawObject**>(&ptr()->pattern_); 1647 return reinterpret_cast<RawObject**>(&ptr()->pattern_);
1599 } 1648 }
1600 1649
1601 intptr_t type_; // Uninitialized, simple or complex. 1650 intptr_t type_; // Uninitialized, simple or complex.
1602 intptr_t flags_; // Represents global/local, case insensitive, multiline. 1651 intptr_t flags_; // Represents global/local, case insensitive, multiline.
1603 1652
1604 // Variable length data follows here. 1653 // Variable length data follows here.
1605 uint8_t data_[0]; 1654 uint8_t* data() {
1655 const uword address_of_flags = reinterpret_cast<uword>(&flags_);
1656 return reinterpret_cast<uint8_t*>(address_of_flags + sizeof(flags_));
1657 }
1606 }; 1658 };
1607 1659
1608 1660
1609 class RawWeakProperty : public RawInstance { 1661 class RawWeakProperty : public RawInstance {
1610 RAW_HEAP_OBJECT_IMPLEMENTATION(WeakProperty); 1662 RAW_HEAP_OBJECT_IMPLEMENTATION(WeakProperty);
1611 1663
1612 RawObject** from() { 1664 RawObject** from() {
1613 return reinterpret_cast<RawObject**>(&ptr()->key_); 1665 return reinterpret_cast<RawObject**>(&ptr()->key_);
1614 } 1666 }
1615 RawObject* key_; 1667 RawObject* key_;
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
1865 COMPILE_ASSERT(kTypedDataInt8ArrayViewCid == kTypedDataInt8ArrayCid + 14); 1917 COMPILE_ASSERT(kTypedDataInt8ArrayViewCid == kTypedDataInt8ArrayCid + 14);
1866 COMPILE_ASSERT(kExternalTypedDataInt8ArrayCid == 1918 COMPILE_ASSERT(kExternalTypedDataInt8ArrayCid ==
1867 kTypedDataInt8ArrayViewCid + 15); 1919 kTypedDataInt8ArrayViewCid + 15);
1868 COMPILE_ASSERT(kNullCid == kExternalTypedDataInt8ArrayCid + 14); 1920 COMPILE_ASSERT(kNullCid == kExternalTypedDataInt8ArrayCid + 14);
1869 return (kNullCid - kTypedDataInt8ArrayCid); 1921 return (kNullCid - kTypedDataInt8ArrayCid);
1870 } 1922 }
1871 1923
1872 } // namespace dart 1924 } // namespace dart
1873 1925
1874 #endif // VM_RAW_OBJECT_H_ 1926 #endif // VM_RAW_OBJECT_H_
OLDNEW
« no previous file with comments | « runtime/vm/object.cc ('k') | runtime/vm/raw_object.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698