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

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

Issue 343803002: Finishes removing intptr_t from raw object fields. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 5 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
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 834 matching lines...) Expand 10 before | Expand all | Expand 10 after
845 RawArray* static_calls_target_table_; // (code-offset, function, code). 845 RawArray* static_calls_target_table_; // (code-offset, function, code).
846 RawArray* stackmaps_; 846 RawArray* stackmaps_;
847 RawLocalVarDescriptors* var_descriptors_; 847 RawLocalVarDescriptors* var_descriptors_;
848 RawArray* comments_; 848 RawArray* comments_;
849 RawObject** to() { 849 RawObject** to() {
850 return reinterpret_cast<RawObject**>(&ptr()->comments_); 850 return reinterpret_cast<RawObject**>(&ptr()->comments_);
851 } 851 }
852 852
853 // Compilation timestamp. 853 // Compilation timestamp.
854 int64_t compile_timestamp_; 854 int64_t compile_timestamp_;
855 intptr_t pointer_offsets_length_; 855
856 // state_bits_ is a bitfield with three fields:
857 // The optimized bit, the alive bit, and a count of the number of pointer
858 // offsets.
856 // Alive: If true, the embedded object pointers will be visited during GC. 859 // Alive: If true, the embedded object pointers will be visited during GC.
857 // This field cannot be shorter because of alignment issues on x64 860 int32_t state_bits_;
858 // architectures.
859 intptr_t state_bits_; // state, is_optimized, is_alive.
860 861
861 // PC offsets for code patching. 862 // PC offsets for code patching.
862 intptr_t entry_patch_pc_offset_; 863 int32_t entry_patch_pc_offset_;
863 intptr_t patch_code_pc_offset_; 864 int32_t patch_code_pc_offset_;
864 intptr_t lazy_deopt_pc_offset_; 865 int32_t lazy_deopt_pc_offset_;
865 866
866 // Variable length data follows here. 867 // Variable length data follows here.
867 int32_t* data() { OPEN_ARRAY_START(int32_t, int32_t); } 868 int32_t* data() { OPEN_ARRAY_START(int32_t, int32_t); }
868 869
869 friend class StackFrame; 870 friend class StackFrame;
870 friend class MarkingVisitor; 871 friend class MarkingVisitor;
871 friend class Function; 872 friend class Function;
872 }; 873 };
873 874
874 875
875 class RawInstructions : public RawObject { 876 class RawInstructions : public RawObject {
876 RAW_HEAP_OBJECT_IMPLEMENTATION(Instructions); 877 RAW_HEAP_OBJECT_IMPLEMENTATION(Instructions);
877 878
878 RawObject** from() { 879 RawObject** from() {
879 return reinterpret_cast<RawObject**>(&ptr()->code_); 880 return reinterpret_cast<RawObject**>(&ptr()->code_);
880 } 881 }
881 RawCode* code_; 882 RawCode* code_;
882 RawArray* object_pool_; 883 RawArray* object_pool_;
883 RawObject** to() { 884 RawObject** to() {
884 return reinterpret_cast<RawObject**>(&ptr()->object_pool_); 885 return reinterpret_cast<RawObject**>(&ptr()->object_pool_);
885 } 886 }
886 intptr_t size_; 887 int32_t size_;
887 888
888 // Variable length data follows here. 889 // Variable length data follows here.
889 uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); } 890 uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); }
890 891
891 // Private helper function used while visiting stack frames. The 892 // Private helper function used while visiting stack frames. The
892 // 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
893 // is not allowed to create handles. 894 // is not allowed to create handles.
894 static bool ContainsPC(RawObject* raw_obj, uword pc); 895 static bool ContainsPC(RawObject* raw_obj, uword pc);
895 896
896 friend class RawCode; 897 friend class RawCode;
897 friend class Code; 898 friend class Code;
898 friend class StackFrame; 899 friend class StackFrame;
899 friend class MarkingVisitor; 900 friend class MarkingVisitor;
900 friend class Function; 901 friend class Function;
901 }; 902 };
902 903
903 904
904 class RawPcDescriptors : public RawObject { 905 class RawPcDescriptors : public RawObject {
905 RAW_HEAP_OBJECT_IMPLEMENTATION(PcDescriptors); 906 RAW_HEAP_OBJECT_IMPLEMENTATION(PcDescriptors);
906 907
907 intptr_t length_; // Number of descriptors. 908 int32_t length_; // Number of descriptors.
908 909
909 struct PcDescriptorRec { 910 struct PcDescriptorRec {
910 uword pc; 911 uword pc;
911 int32_t deopt_id; 912 int32_t deopt_id;
912 int32_t token_pos; // Or deopt reason. 913 int32_t token_pos; // Or deopt reason.
913 int16_t try_index; // Or deopt index. 914 int16_t try_index; // Or deopt index.
914 int8_t kind; 915 int8_t kind;
915 }; 916 };
916 917
917 // Variable length data follows here. 918 // Variable length data follows here.
918 PcDescriptorRec* data() { OPEN_ARRAY_START(PcDescriptorRec, intptr_t); } 919 PcDescriptorRec* data() { OPEN_ARRAY_START(PcDescriptorRec, intptr_t); }
919 920
920 friend class Object; 921 friend class Object;
921 }; 922 };
922 923
923 924
924 // Stackmap is an immutable representation of the layout of the stack at a 925 // Stackmap is an immutable representation of the layout of the stack at a
925 // PC. The stack map representation consists of a bit map which marks each 926 // PC. The stack map representation consists of a bit map which marks each
926 // live object index starting from the base of the frame. 927 // live object index starting from the base of the frame.
927 // 928 //
928 // The Stackmap also consists of a link to the code object corresponding to 929 // The Stackmap also consists of a link to the code object corresponding to
929 // the frame which the stack map is describing. The bit map representation 930 // the frame which the stack map is describing. The bit map representation
930 // is optimized for dense and small bit maps, without any upper bound. 931 // is optimized for dense and small bit maps, without any upper bound.
931 class RawStackmap : public RawObject { 932 class RawStackmap : public RawObject {
932 RAW_HEAP_OBJECT_IMPLEMENTATION(Stackmap); 933 RAW_HEAP_OBJECT_IMPLEMENTATION(Stackmap);
933 934
934 // TODO(kmillikin): We need a small number of bits to encode the register 935 // TODO(kmillikin): We need a small number of bits to encode the register
935 // count. Consider packing them in with the length. 936 // count. Consider packing them in with the length.
936 intptr_t length_; // Length of payload, in bits. 937 int32_t length_; // Length of payload, in bits.
937 intptr_t register_bit_count_; // Live register bits, included in length_. 938 int32_t register_bit_count_; // Live register bits, included in length_.
938 939
939 uword pc_; // PC corresponding to this stack map representation. 940 // Offset from code entry point corresponding to this stack map
941 // representation.
942 uint32_t pc_offset_;
940 943
941 // Variable length data follows here (bitmap of the stack layout). 944 // Variable length data follows here (bitmap of the stack layout).
942 uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); } 945 uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); }
943 }; 946 };
944 947
945 948
946 class RawLocalVarDescriptors : public RawObject { 949 class RawLocalVarDescriptors : public RawObject {
947 public: 950 public:
948 enum VarInfoKind { 951 enum VarInfoKind {
949 kStackVar = 1, 952 kStackVar = 1,
950 kContextVar, 953 kContextVar,
951 kContextLevel, 954 kContextLevel,
952 kSavedEntryContext, 955 kSavedEntryContext,
953 kSavedCurrentContext 956 kSavedCurrentContext
954 }; 957 };
955 958
959 enum {
960 kKindPos = 0,
961 kKindSize = 8,
962 kIndexPos = 9,
963 // Since there are 24 bits for the stack slot index, Functions can have
964 // only ~16.7 million stack slots.
965 kIndexSize = 24,
966 kMaxIndex = (1 << (kIndexSize - 1)) - 1,
967 };
968
969 // The index can be < 0.
970 class IndexBits {
971 public:
972 static bool is_valid(int32_t val) {
973 return Utils::IsInt(24, val);
974 }
975 static int32_t update(int32_t val, int32_t orig) {
976 ASSERT(is_valid(val));
977 const int32_t v = val & ((1 << kIndexSize) - 1);
978 return Bits::update(v, orig);
979 }
980 static int32_t decode(int32_t val) {
981 const int32_t v = Bits::decode(val);
982 return (v << kIndexPos) >> kIndexPos; // Sign-extend.
983 }
984 private:
985 class Bits : public BitField<int32_t, kIndexPos, kIndexSize> {};
986 };
987
988 class KindBits : public BitField<int8_t, kKindPos, kKindSize>{};
989
956 struct VarInfo { 990 struct VarInfo {
957 intptr_t index; // Slot index on stack or in context. 991 int32_t index_kind; // Bitfield for slot index on stack or in context,
958 intptr_t begin_pos; // Token position of scope start. 992 // and Entry kind of type VarInfoKind.
959 intptr_t end_pos; // Token position of scope end. 993 int32_t begin_pos; // Token position of scope start.
994 int32_t end_pos; // Token position of scope end.
960 int16_t scope_id; // Scope to which the variable belongs. 995 int16_t scope_id; // Scope to which the variable belongs.
961 int8_t kind; // Entry kind of type VarInfoKind.
962 }; 996 };
963 997
964 private: 998 private:
965 RAW_HEAP_OBJECT_IMPLEMENTATION(LocalVarDescriptors); 999 RAW_HEAP_OBJECT_IMPLEMENTATION(LocalVarDescriptors);
966 intptr_t length_; // Number of descriptors.
967 RawArray* names_; // Array of [length_] variable names. 1000 RawArray* names_; // Array of [length_] variable names.
1001 int32_t length_; // Number of descriptors.
968 1002
969 // Variable info with [length_] entries. 1003 // Variable info with [length_] entries.
970 VarInfo* data() { OPEN_ARRAY_START(VarInfo, intptr_t); } 1004 VarInfo* data() { OPEN_ARRAY_START(VarInfo, int32_t); }
971 }; 1005 };
972 1006
973 1007
974 class RawExceptionHandlers : public RawObject { 1008 class RawExceptionHandlers : public RawObject {
975 public: 1009 public:
976 // The index into the ExceptionHandlers table corresponds to 1010 // The index into the ExceptionHandlers table corresponds to
977 // the try_index of the handler. 1011 // the try_index of the handler.
978 struct HandlerInfo { 1012 struct HandlerInfo {
979 intptr_t handler_pc; // PC value of handler. 1013 intptr_t handler_pc; // PC value of handler.
980 int16_t outer_try_index; // Try block index of enclosing try block. 1014 int16_t outer_try_index; // Try block index of enclosing try block.
981 int8_t needs_stacktrace; // True if a stacktrace is needed. 1015 int8_t needs_stacktrace; // True if a stacktrace is needed.
982 int8_t has_catch_all; // Catches all exceptions. 1016 int8_t has_catch_all; // Catches all exceptions.
983 }; 1017 };
984 1018
985 private: 1019 private:
986 RAW_HEAP_OBJECT_IMPLEMENTATION(ExceptionHandlers); 1020 RAW_HEAP_OBJECT_IMPLEMENTATION(ExceptionHandlers);
987 1021
988 // Number of exception handler entries. 1022 // Number of exception handler entries.
989 intptr_t length_; 1023 int32_t length_;
990 1024
991 // Array with [length_] entries. Each entry is an array of all handled 1025 // Array with [length_] entries. Each entry is an array of all handled
992 // exception types. 1026 // exception types.
993 RawArray* handled_types_data_; 1027 RawArray* handled_types_data_;
994 1028
995 // Exception handler info of length [length_]. 1029 // Exception handler info of length [length_].
996 HandlerInfo* data() { OPEN_ARRAY_START(HandlerInfo, intptr_t); } 1030 HandlerInfo* data() { OPEN_ARRAY_START(HandlerInfo, intptr_t); }
997 }; 1031 };
998 1032
999 1033
1000 // Contains an array of deoptimization commands, e.g., move a specific register 1034 // Contains an array of deoptimization commands, e.g., move a specific register
1001 // into a specific slot of unoptimized frame. 1035 // into a specific slot of unoptimized frame.
1002 class RawDeoptInfo : public RawObject { 1036 class RawDeoptInfo : public RawObject {
1003 RAW_HEAP_OBJECT_IMPLEMENTATION(DeoptInfo); 1037 RAW_HEAP_OBJECT_IMPLEMENTATION(DeoptInfo);
1004 1038
1005 RawSmi* length_; // Number of deoptimization commands 1039 RawSmi* length_; // Number of deoptimization commands
1006 1040
1007 // Variable length data follows here. 1041 // Variable length data follows here.
1008 intptr_t* data() { OPEN_ARRAY_START(intptr_t, intptr_t); } 1042 intptr_t* data() { OPEN_ARRAY_START(intptr_t, intptr_t); }
1009 }; 1043 };
1010 1044
1011 1045
1012 class RawContext : public RawObject { 1046 class RawContext : public RawObject {
1013 RAW_HEAP_OBJECT_IMPLEMENTATION(Context); 1047 RAW_HEAP_OBJECT_IMPLEMENTATION(Context);
1014 1048
1015 intptr_t num_variables_; 1049 int32_t num_variables_;
1016 Isolate* isolate_; 1050 Isolate* isolate_;
1017 1051
1018 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->parent_); } 1052 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->parent_); }
1019 RawContext* parent_; 1053 RawContext* parent_;
1020 1054
1021 // Variable length data follows here. 1055 // Variable length data follows here.
1022 RawInstance** data() { OPEN_ARRAY_START(RawInstance*, RawInstance*); } 1056 RawInstance** data() { OPEN_ARRAY_START(RawInstance*, RawInstance*); }
1023 RawObject** to(intptr_t num_vars) { 1057 RawObject** to(intptr_t num_vars) {
1024 return reinterpret_cast<RawObject**>(&ptr()->data()[num_vars - 1]); 1058 return reinterpret_cast<RawObject**>(&ptr()->data()[num_vars - 1]);
1025 } 1059 }
1026 1060
1027 friend class SnapshotReader; 1061 friend class SnapshotReader;
1028 }; 1062 };
1029 1063
1030 1064
1031 class RawContextScope : public RawObject { 1065 class RawContextScope : public RawObject {
1032 RAW_HEAP_OBJECT_IMPLEMENTATION(ContextScope); 1066 RAW_HEAP_OBJECT_IMPLEMENTATION(ContextScope);
1033 1067
1034 // TODO(iposva): Switch to convential enum offset based structure to avoid 1068 // TODO(iposva): Switch to conventional enum offset based structure to avoid
1035 // alignment mishaps. 1069 // alignment mishaps.
1036 struct VariableDesc { 1070 struct VariableDesc {
1037 RawSmi* token_pos; 1071 RawSmi* token_pos;
1038 RawString* name; 1072 RawString* name;
1039 RawBool* is_final; 1073 RawBool* is_final;
1040 RawBool* is_const; 1074 RawBool* is_const;
1041 union { 1075 union {
1042 RawAbstractType* type; 1076 RawAbstractType* type;
1043 RawInstance* value; // iff is_const is true 1077 RawInstance* value; // iff is_const is true
1044 }; 1078 };
1045 RawSmi* context_index; 1079 RawSmi* context_index;
1046 RawSmi* context_level; 1080 RawSmi* context_level;
1047 }; 1081 };
1048 1082
1049 intptr_t num_variables_; 1083 int32_t num_variables_;
1050 1084
1051 RawObject** from() { 1085 RawObject** from() {
1052 return reinterpret_cast<RawObject**>(&ptr()->data()[0]); 1086 return reinterpret_cast<RawObject**>(&ptr()->data()[0]);
1053 } 1087 }
1054 // Variable length data follows here. 1088 // Variable length data follows here.
1055 RawObject** data() { OPEN_ARRAY_START(RawObject*, RawObject*); } 1089 RawObject** data() { OPEN_ARRAY_START(RawObject*, RawObject*); }
1056 RawObject** to(intptr_t num_vars) { 1090 RawObject** to(intptr_t num_vars) {
1057 const intptr_t data_length = num_vars * (sizeof(VariableDesc)/kWordSize); 1091 const intptr_t data_length = num_vars * (sizeof(VariableDesc)/kWordSize);
1058 return reinterpret_cast<RawObject**>(&ptr()->data()[data_length - 1]); 1092 return reinterpret_cast<RawObject**>(&ptr()->data()[data_length - 1]);
1059 } 1093 }
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after
1308 friend class SnapshotReader; 1342 friend class SnapshotReader;
1309 }; 1343 };
1310 1344
1311 1345
1312 class RawBigint : public RawInteger { 1346 class RawBigint : public RawInteger {
1313 RAW_HEAP_OBJECT_IMPLEMENTATION(Bigint); 1347 RAW_HEAP_OBJECT_IMPLEMENTATION(Bigint);
1314 1348
1315 // Actual length in chunks at the time of allocation (later we may 1349 // Actual length in chunks at the time of allocation (later we may
1316 // clamp the operational length but we need to maintain a consistent 1350 // clamp the operational length but we need to maintain a consistent
1317 // object length so that the object can be traversed during GC). 1351 // object length so that the object can be traversed during GC).
1318 intptr_t allocated_length_; 1352 int32_t allocated_length_;
1319 1353
1320 // Operational length in chunks of the bigint object, clamping can 1354 // Operational length in chunks of the bigint object, clamping can
1321 // cause this length to be reduced. If the signed_length_ is 1355 // cause this length to be reduced. If the signed_length_ is
1322 // negative then the number is negative. 1356 // negative then the number is negative.
1323 intptr_t signed_length_; 1357 int32_t signed_length_;
1324 1358
1325 // A sequence of Chunks (typedef in Bignum) representing bignum digits. 1359 // A sequence of Chunks (typedef in Bignum) representing bignum digits.
1326 // Bignum::Chunk chunks_[Utils::Abs(signed_length_)]; 1360 // Bignum::Chunk chunks_[Utils::Abs(signed_length_)];
1327 uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); } 1361 uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); }
1328 1362
1329 friend class SnapshotReader; 1363 friend class SnapshotReader;
1330 }; 1364 };
1331 1365
1332 1366
1333 class RawDouble : public RawNumber { 1367 class RawDouble : public RawNumber {
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
1607 RawObject** from() { 1641 RawObject** from() {
1608 return reinterpret_cast<RawObject**>(&ptr()->data_length_); 1642 return reinterpret_cast<RawObject**>(&ptr()->data_length_);
1609 } 1643 }
1610 RawSmi* data_length_; 1644 RawSmi* data_length_;
1611 RawSmi* num_bracket_expressions_; 1645 RawSmi* num_bracket_expressions_;
1612 RawString* pattern_; // Pattern to be used for matching. 1646 RawString* pattern_; // Pattern to be used for matching.
1613 RawObject** to() { 1647 RawObject** to() {
1614 return reinterpret_cast<RawObject**>(&ptr()->pattern_); 1648 return reinterpret_cast<RawObject**>(&ptr()->pattern_);
1615 } 1649 }
1616 1650
1617 intptr_t type_; // Uninitialized, simple or complex. 1651 // A bitfield with two fields:
1618 intptr_t flags_; // Represents global/local, case insensitive, multiline. 1652 // type: Uninitialized, simple or complex.
1653 // flags: Represents global/local, case insensitive, multiline.
1654 int8_t type_flags_;
1619 1655
1620 // Variable length data follows here. 1656 // Variable length data follows here.
1621 uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); } 1657 uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); }
1622 }; 1658 };
1623 1659
1624 1660
1625 class RawWeakProperty : public RawInstance { 1661 class RawWeakProperty : public RawInstance {
1626 RAW_HEAP_OBJECT_IMPLEMENTATION(WeakProperty); 1662 RAW_HEAP_OBJECT_IMPLEMENTATION(WeakProperty);
1627 1663
1628 RawObject** from() { 1664 RawObject** from() {
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
1881 COMPILE_ASSERT(kTypedDataInt8ArrayViewCid == kTypedDataInt8ArrayCid + 14); 1917 COMPILE_ASSERT(kTypedDataInt8ArrayViewCid == kTypedDataInt8ArrayCid + 14);
1882 COMPILE_ASSERT(kExternalTypedDataInt8ArrayCid == 1918 COMPILE_ASSERT(kExternalTypedDataInt8ArrayCid ==
1883 kTypedDataInt8ArrayViewCid + 15); 1919 kTypedDataInt8ArrayViewCid + 15);
1884 COMPILE_ASSERT(kNullCid == kExternalTypedDataInt8ArrayCid + 14); 1920 COMPILE_ASSERT(kNullCid == kExternalTypedDataInt8ArrayCid + 14);
1885 return (kNullCid - kTypedDataInt8ArrayCid); 1921 return (kNullCid - kTypedDataInt8ArrayCid);
1886 } 1922 }
1887 1923
1888 } // namespace dart 1924 } // namespace dart
1889 1925
1890 #endif // VM_RAW_OBJECT_H_ 1926 #endif // VM_RAW_OBJECT_H_
OLDNEW
« runtime/vm/object.h ('K') | « 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