| 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/atomic.h" | 9 #include "vm/atomic.h" |
| 10 #include "vm/globals.h" | 10 #include "vm/globals.h" |
| (...skipping 565 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 576 friend class Object; | 576 friend class Object; |
| 577 friend class OneByteString; // StoreSmi | 577 friend class OneByteString; // StoreSmi |
| 578 friend class RawExternalTypedData; | 578 friend class RawExternalTypedData; |
| 579 friend class RawInstructions; | 579 friend class RawInstructions; |
| 580 friend class RawInstance; | 580 friend class RawInstance; |
| 581 friend class RawTypedData; | 581 friend class RawTypedData; |
| 582 friend class Scavenger; | 582 friend class Scavenger; |
| 583 friend class ScavengerVisitor; | 583 friend class ScavengerVisitor; |
| 584 friend class SizeExcludingClassVisitor; // GetClassId | 584 friend class SizeExcludingClassVisitor; // GetClassId |
| 585 friend class RetainingPathVisitor; // GetClassId | 585 friend class RetainingPathVisitor; // GetClassId |
| 586 friend class InstructionsReader; // tags_ check |
| 586 friend class SnapshotReader; | 587 friend class SnapshotReader; |
| 587 friend class SnapshotWriter; | 588 friend class SnapshotWriter; |
| 588 friend class String; | 589 friend class String; |
| 589 friend class TypedData; | 590 friend class TypedData; |
| 590 friend class TypedDataView; | 591 friend class TypedDataView; |
| 591 friend class WeakProperty; // StorePointer | 592 friend class WeakProperty; // StorePointer |
| 592 friend class Instance; // StorePointer | 593 friend class Instance; // StorePointer |
| 593 | 594 |
| 594 DISALLOW_ALLOCATION(); | 595 DISALLOW_ALLOCATION(); |
| 595 DISALLOW_IMPLICIT_CONSTRUCTORS(RawObject); | 596 DISALLOW_IMPLICIT_CONSTRUCTORS(RawObject); |
| (...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 995 RawArray* deopt_info_array_; | 996 RawArray* deopt_info_array_; |
| 996 RawArray* static_calls_target_table_; // (code-offset, function, code). | 997 RawArray* static_calls_target_table_; // (code-offset, function, code). |
| 997 RawArray* stackmaps_; | 998 RawArray* stackmaps_; |
| 998 RawLocalVarDescriptors* var_descriptors_; | 999 RawLocalVarDescriptors* var_descriptors_; |
| 999 RawArray* inlined_metadata_; | 1000 RawArray* inlined_metadata_; |
| 1000 RawArray* comments_; | 1001 RawArray* comments_; |
| 1001 // If return_address_info_ is a Smi, it is the offset to the prologue. | 1002 // If return_address_info_ is a Smi, it is the offset to the prologue. |
| 1002 // Else, return_address_info_ is null. | 1003 // Else, return_address_info_ is null. |
| 1003 RawObject* return_address_metadata_; | 1004 RawObject* return_address_metadata_; |
| 1004 RawObject** to() { | 1005 RawObject** to() { |
| 1005 return reinterpret_cast<RawObject**>(&ptr()->comments_); | 1006 return reinterpret_cast<RawObject**>(&ptr()->return_address_metadata_); |
| 1006 } | 1007 } |
| 1007 uword entry_point_; | 1008 uword entry_point_; |
| 1008 | 1009 |
| 1009 // Compilation timestamp. | 1010 // Compilation timestamp. |
| 1010 int64_t compile_timestamp_; | 1011 int64_t compile_timestamp_; |
| 1011 | 1012 |
| 1012 // state_bits_ is a bitfield with three fields: | 1013 // state_bits_ is a bitfield with three fields: |
| 1013 // The optimized bit, the alive bit, and a count of the number of pointer | 1014 // The optimized bit, the alive bit, and a count of the number of pointer |
| 1014 // offsets. | 1015 // offsets. |
| 1015 // Alive: If true, the embedded object pointers will be visited during GC. | 1016 // Alive: If true, the embedded object pointers will be visited during GC. |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1041 RawObject* raw_obj_; | 1042 RawObject* raw_obj_; |
| 1042 uword raw_value_; | 1043 uword raw_value_; |
| 1043 }; | 1044 }; |
| 1044 }; | 1045 }; |
| 1045 Entry* data() { OPEN_ARRAY_START(Entry, Entry); } | 1046 Entry* data() { OPEN_ARRAY_START(Entry, Entry); } |
| 1046 Entry const* data() const { OPEN_ARRAY_START(Entry, Entry); } | 1047 Entry const* data() const { OPEN_ARRAY_START(Entry, Entry); } |
| 1047 | 1048 |
| 1048 Entry* first_entry() { return &ptr()->data()[0]; } | 1049 Entry* first_entry() { return &ptr()->data()[0]; } |
| 1049 | 1050 |
| 1050 friend class Object; | 1051 friend class Object; |
| 1052 friend class SnapshotReader; |
| 1051 }; | 1053 }; |
| 1052 | 1054 |
| 1053 | 1055 |
| 1054 class RawInstructions : public RawObject { | 1056 class RawInstructions : public RawObject { |
| 1055 RAW_HEAP_OBJECT_IMPLEMENTATION(Instructions); | 1057 RAW_HEAP_OBJECT_IMPLEMENTATION(Instructions); |
| 1056 | 1058 |
| 1057 RawObject** from() { | 1059 RawObject** from() { |
| 1058 return reinterpret_cast<RawObject**>(&ptr()->code_); | 1060 return reinterpret_cast<RawObject**>(&ptr()->code_); |
| 1059 } | 1061 } |
| 1060 RawCode* code_; | 1062 RawCode* code_; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1071 // code which iterates over dart frames is also called during GC and | 1073 // code which iterates over dart frames is also called during GC and |
| 1072 // is not allowed to create handles. | 1074 // is not allowed to create handles. |
| 1073 static bool ContainsPC(RawObject* raw_obj, uword pc); | 1075 static bool ContainsPC(RawObject* raw_obj, uword pc); |
| 1074 | 1076 |
| 1075 friend class RawCode; | 1077 friend class RawCode; |
| 1076 friend class RawFunction; | 1078 friend class RawFunction; |
| 1077 friend class Code; | 1079 friend class Code; |
| 1078 friend class StackFrame; | 1080 friend class StackFrame; |
| 1079 friend class MarkingVisitor; | 1081 friend class MarkingVisitor; |
| 1080 friend class Function; | 1082 friend class Function; |
| 1083 friend class InstructionsReader; |
| 1081 }; | 1084 }; |
| 1082 | 1085 |
| 1083 | 1086 |
| 1084 class RawPcDescriptors : public RawObject { | 1087 class RawPcDescriptors : public RawObject { |
| 1085 public: | 1088 public: |
| 1086 enum Kind { | 1089 enum Kind { |
| 1087 kDeopt = 1, // Deoptimization continuation point. | 1090 kDeopt = 1, // Deoptimization continuation point. |
| 1088 kIcCall = kDeopt << 1, // IC call. | 1091 kIcCall = kDeopt << 1, // IC call. |
| 1089 kUnoptStaticCall = kIcCall << 1, // Call to a known target via stub. | 1092 kUnoptStaticCall = kIcCall << 1, // Call to a known target via stub. |
| 1090 kRuntimeCall = kUnoptStaticCall << 1, // Runtime call. | 1093 kRuntimeCall = kUnoptStaticCall << 1, // Runtime call. |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1128 private: | 1131 private: |
| 1129 RAW_HEAP_OBJECT_IMPLEMENTATION(PcDescriptors); | 1132 RAW_HEAP_OBJECT_IMPLEMENTATION(PcDescriptors); |
| 1130 | 1133 |
| 1131 int32_t length_; // Number of descriptors. | 1134 int32_t length_; // Number of descriptors. |
| 1132 | 1135 |
| 1133 // Variable length data follows here. | 1136 // Variable length data follows here. |
| 1134 uint8_t* data() { OPEN_ARRAY_START(uint8_t, intptr_t); } | 1137 uint8_t* data() { OPEN_ARRAY_START(uint8_t, intptr_t); } |
| 1135 const uint8_t* data() const { OPEN_ARRAY_START(uint8_t, intptr_t); } | 1138 const uint8_t* data() const { OPEN_ARRAY_START(uint8_t, intptr_t); } |
| 1136 | 1139 |
| 1137 friend class Object; | 1140 friend class Object; |
| 1141 friend class SnapshotReader; |
| 1138 }; | 1142 }; |
| 1139 | 1143 |
| 1140 | 1144 |
| 1141 // Stackmap is an immutable representation of the layout of the stack at a | 1145 // Stackmap is an immutable representation of the layout of the stack at a |
| 1142 // PC. The stack map representation consists of a bit map which marks each | 1146 // PC. The stack map representation consists of a bit map which marks each |
| 1143 // live object index starting from the base of the frame. | 1147 // live object index starting from the base of the frame. |
| 1144 // | 1148 // |
| 1145 // The Stackmap also consists of a link to the code object corresponding to | 1149 // The bit map representation is optimized for dense and small bit maps, without |
| 1146 // the frame which the stack map is describing. The bit map representation | 1150 // any upper bound. |
| 1147 // is optimized for dense and small bit maps, without any upper bound. | |
| 1148 class RawStackmap : public RawObject { | 1151 class RawStackmap : public RawObject { |
| 1149 RAW_HEAP_OBJECT_IMPLEMENTATION(Stackmap); | 1152 RAW_HEAP_OBJECT_IMPLEMENTATION(Stackmap); |
| 1150 | 1153 |
| 1151 // Regarding changing this to a bitfield: ARM64 requires register_bit_count_ | 1154 // Regarding changing this to a bitfield: ARM64 requires register_bit_count_ |
| 1152 // to be as large as 96, meaning 7 bits, leaving 25 bits for the length, or | 1155 // to be as large as 96, meaning 7 bits, leaving 25 bits for the length, or |
| 1153 // as large as ~33 million entries. If that is sufficient, then these two | 1156 // as large as ~33 million entries. If that is sufficient, then these two |
| 1154 // fields can be merged into a BitField. | 1157 // fields can be merged into a BitField. |
| 1155 int32_t length_; // Length of payload, in bits. | 1158 int32_t length_; // Length of payload, in bits. |
| 1156 int32_t register_bit_count_; // Live register bits, included in length_. | 1159 int32_t register_bit_count_; // Live register bits, included in length_. |
| 1157 | 1160 |
| 1158 // Offset from code entry point corresponding to this stack map | 1161 // Offset from code entry point corresponding to this stack map |
| 1159 // representation. | 1162 // representation. |
| 1160 uint32_t pc_offset_; | 1163 uint32_t pc_offset_; |
| 1161 | 1164 |
| 1162 // Variable length data follows here (bitmap of the stack layout). | 1165 // Variable length data follows here (bitmap of the stack layout). |
| 1163 uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); } | 1166 uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); } |
| 1164 const uint8_t* data() const { OPEN_ARRAY_START(uint8_t, uint8_t); } | 1167 const uint8_t* data() const { OPEN_ARRAY_START(uint8_t, uint8_t); } |
| 1168 |
| 1169 friend class SnapshotReader; |
| 1165 }; | 1170 }; |
| 1166 | 1171 |
| 1167 | 1172 |
| 1168 class RawLocalVarDescriptors : public RawObject { | 1173 class RawLocalVarDescriptors : public RawObject { |
| 1169 public: | 1174 public: |
| 1170 enum VarInfoKind { | 1175 enum VarInfoKind { |
| 1171 kStackVar = 1, | 1176 kStackVar = 1, |
| 1172 kContextVar, | 1177 kContextVar, |
| 1173 kContextLevel, | 1178 kContextLevel, |
| 1174 kSavedCurrentContext, | 1179 kSavedCurrentContext, |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1229 RawObject** to(intptr_t num_entries) { | 1234 RawObject** to(intptr_t num_entries) { |
| 1230 return reinterpret_cast<RawObject**>(nameAddrAt(num_entries - 1)); | 1235 return reinterpret_cast<RawObject**>(nameAddrAt(num_entries - 1)); |
| 1231 } | 1236 } |
| 1232 | 1237 |
| 1233 // Variable info with [num_entries_] entries. | 1238 // Variable info with [num_entries_] entries. |
| 1234 VarInfo* data() { | 1239 VarInfo* data() { |
| 1235 return reinterpret_cast<VarInfo*>(nameAddrAt(ptr()->num_entries_)); | 1240 return reinterpret_cast<VarInfo*>(nameAddrAt(ptr()->num_entries_)); |
| 1236 } | 1241 } |
| 1237 | 1242 |
| 1238 friend class Object; | 1243 friend class Object; |
| 1244 friend class SnapshotReader; |
| 1239 }; | 1245 }; |
| 1240 | 1246 |
| 1241 | 1247 |
| 1242 class RawExceptionHandlers : public RawObject { | 1248 class RawExceptionHandlers : public RawObject { |
| 1243 public: | 1249 public: |
| 1244 // The index into the ExceptionHandlers table corresponds to | 1250 // The index into the ExceptionHandlers table corresponds to |
| 1245 // the try_index of the handler. | 1251 // the try_index of the handler. |
| 1246 struct HandlerInfo { | 1252 struct HandlerInfo { |
| 1247 uint32_t handler_pc_offset; // PC offset value of handler. | 1253 uint32_t handler_pc_offset; // PC offset value of handler. |
| 1248 int16_t outer_try_index; // Try block index of enclosing try block. | 1254 int16_t outer_try_index; // Try block index of enclosing try block. |
| 1249 int8_t needs_stacktrace; // True if a stacktrace is needed. | 1255 int8_t needs_stacktrace; // True if a stacktrace is needed. |
| 1250 int8_t has_catch_all; // Catches all exceptions. | 1256 int8_t has_catch_all; // Catches all exceptions. |
| 1251 }; | 1257 }; |
| 1252 | 1258 |
| 1253 private: | 1259 private: |
| 1254 RAW_HEAP_OBJECT_IMPLEMENTATION(ExceptionHandlers); | 1260 RAW_HEAP_OBJECT_IMPLEMENTATION(ExceptionHandlers); |
| 1255 | 1261 |
| 1256 // Number of exception handler entries. | 1262 // Number of exception handler entries. |
| 1257 int32_t num_entries_; | 1263 int32_t num_entries_; |
| 1258 | 1264 |
| 1259 // Array with [num_entries_] entries. Each entry is an array of all handled | 1265 // Array with [num_entries_] entries. Each entry is an array of all handled |
| 1260 // exception types. | 1266 // exception types. |
| 1261 RawArray* handled_types_data_; | 1267 RawArray* handled_types_data_; |
| 1262 | 1268 |
| 1263 // Exception handler info of length [num_entries_]. | 1269 // Exception handler info of length [num_entries_]. |
| 1264 const HandlerInfo* data() const { OPEN_ARRAY_START(HandlerInfo, intptr_t); } | 1270 const HandlerInfo* data() const { OPEN_ARRAY_START(HandlerInfo, intptr_t); } |
| 1265 HandlerInfo* data() { OPEN_ARRAY_START(HandlerInfo, intptr_t); } | 1271 HandlerInfo* data() { OPEN_ARRAY_START(HandlerInfo, intptr_t); } |
| 1266 | 1272 |
| 1267 friend class Object; | 1273 friend class Object; |
| 1274 friend class SnapshotReader; |
| 1268 }; | 1275 }; |
| 1269 | 1276 |
| 1270 | 1277 |
| 1271 class RawContext : public RawObject { | 1278 class RawContext : public RawObject { |
| 1272 RAW_HEAP_OBJECT_IMPLEMENTATION(Context); | 1279 RAW_HEAP_OBJECT_IMPLEMENTATION(Context); |
| 1273 | 1280 |
| 1274 int32_t num_variables_; | 1281 int32_t num_variables_; |
| 1275 | 1282 |
| 1276 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->parent_); } | 1283 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->parent_); } |
| 1277 RawContext* parent_; | 1284 RawContext* parent_; |
| (...skipping 917 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2195 COMPILE_ASSERT(kExternalTypedDataInt8ArrayCid == | 2202 COMPILE_ASSERT(kExternalTypedDataInt8ArrayCid == |
| 2196 kTypedDataInt8ArrayViewCid + 15); | 2203 kTypedDataInt8ArrayViewCid + 15); |
| 2197 COMPILE_ASSERT(kByteBufferCid == kExternalTypedDataInt8ArrayCid + 14); | 2204 COMPILE_ASSERT(kByteBufferCid == kExternalTypedDataInt8ArrayCid + 14); |
| 2198 COMPILE_ASSERT(kNullCid == kByteBufferCid + 1); | 2205 COMPILE_ASSERT(kNullCid == kByteBufferCid + 1); |
| 2199 return (kNullCid - kTypedDataInt8ArrayCid); | 2206 return (kNullCid - kTypedDataInt8ArrayCid); |
| 2200 } | 2207 } |
| 2201 | 2208 |
| 2202 } // namespace dart | 2209 } // namespace dart |
| 2203 | 2210 |
| 2204 #endif // VM_RAW_OBJECT_H_ | 2211 #endif // VM_RAW_OBJECT_H_ |
| OLD | NEW |