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

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

Issue 2481873005: clang-format runtime/vm (Closed)
Patch Set: Merge Created 4 years, 1 month 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
« no previous file with comments | « runtime/vm/random.h ('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 RUNTIME_VM_RAW_OBJECT_H_ 5 #ifndef RUNTIME_VM_RAW_OBJECT_H_
6 #define RUNTIME_VM_RAW_OBJECT_H_ 6 #define RUNTIME_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 27 matching lines...) Expand all
38 V(LocalVarDescriptors) \ 38 V(LocalVarDescriptors) \
39 V(ExceptionHandlers) \ 39 V(ExceptionHandlers) \
40 V(Context) \ 40 V(Context) \
41 V(ContextScope) \ 41 V(ContextScope) \
42 V(SingleTargetCache) \ 42 V(SingleTargetCache) \
43 V(UnlinkedCall) \ 43 V(UnlinkedCall) \
44 V(ICData) \ 44 V(ICData) \
45 V(MegamorphicCache) \ 45 V(MegamorphicCache) \
46 V(SubtypeTestCache) \ 46 V(SubtypeTestCache) \
47 V(Error) \ 47 V(Error) \
48 V(ApiError) \ 48 V(ApiError) \
49 V(LanguageError) \ 49 V(LanguageError) \
50 V(UnhandledException) \ 50 V(UnhandledException) \
51 V(UnwindError) \ 51 V(UnwindError) \
52 V(Instance) \ 52 V(Instance) \
53 V(LibraryPrefix) \ 53 V(LibraryPrefix) \
54 V(AbstractType) \ 54 V(AbstractType) \
55 V(Type) \ 55 V(Type) \
56 V(TypeRef) \ 56 V(TypeRef) \
57 V(TypeParameter) \ 57 V(TypeParameter) \
58 V(BoundedType) \ 58 V(BoundedType) \
59 V(MixinAppType) \ 59 V(MixinAppType) \
60 V(Closure) \ 60 V(Closure) \
61 V(Number) \ 61 V(Number) \
62 V(Integer) \ 62 V(Integer) \
63 V(Smi) \ 63 V(Smi) \
64 V(Mint) \ 64 V(Mint) \
65 V(Bigint) \ 65 V(Bigint) \
66 V(Double) \ 66 V(Double) \
67 V(Bool) \ 67 V(Bool) \
68 V(GrowableObjectArray) \ 68 V(GrowableObjectArray) \
69 V(Float32x4) \ 69 V(Float32x4) \
70 V(Int32x4) \ 70 V(Int32x4) \
71 V(Float64x2) \ 71 V(Float64x2) \
72 V(TypedData) \ 72 V(TypedData) \
73 V(ExternalTypedData) \ 73 V(ExternalTypedData) \
74 V(Capability) \ 74 V(Capability) \
75 V(ReceivePort) \ 75 V(ReceivePort) \
76 V(SendPort) \ 76 V(SendPort) \
77 V(Stacktrace) \ 77 V(Stacktrace) \
78 V(RegExp) \ 78 V(RegExp) \
79 V(WeakProperty) \ 79 V(WeakProperty) \
80 V(MirrorReference) \ 80 V(MirrorReference) \
81 V(LinkedHashMap) \ 81 V(LinkedHashMap) \
82 V(UserTag) \ 82 V(UserTag)
83 83
84 #define CLASS_LIST_ARRAYS(V) \ 84 #define CLASS_LIST_ARRAYS(V) \
85 V(Array) \ 85 V(Array) \
86 V(ImmutableArray) \ 86 V(ImmutableArray)
87 87
88 #define CLASS_LIST_STRINGS(V) \ 88 #define CLASS_LIST_STRINGS(V) \
89 V(String) \ 89 V(String) \
90 V(OneByteString) \ 90 V(OneByteString) \
91 V(TwoByteString) \ 91 V(TwoByteString) \
92 V(ExternalOneByteString) \ 92 V(ExternalOneByteString) \
93 V(ExternalTwoByteString) 93 V(ExternalTwoByteString)
94 94
95 #define CLASS_LIST_TYPED_DATA(V) \ 95 #define CLASS_LIST_TYPED_DATA(V) \
96 V(Int8Array) \ 96 V(Int8Array) \
97 V(Uint8Array) \ 97 V(Uint8Array) \
98 V(Uint8ClampedArray) \ 98 V(Uint8ClampedArray) \
99 V(Int16Array) \ 99 V(Int16Array) \
100 V(Uint16Array) \ 100 V(Uint16Array) \
101 V(Int32Array) \ 101 V(Int32Array) \
102 V(Uint32Array) \ 102 V(Uint32Array) \
103 V(Int64Array) \ 103 V(Int64Array) \
104 V(Uint64Array) \ 104 V(Uint64Array) \
105 V(Float32Array) \ 105 V(Float32Array) \
106 V(Float64Array) \ 106 V(Float64Array) \
107 V(Float32x4Array) \ 107 V(Float32x4Array) \
108 V(Int32x4Array) \ 108 V(Int32x4Array) \
109 V(Float64x2Array) \ 109 V(Float64x2Array)
110 110
111 #define DART_CLASS_LIST_TYPED_DATA(V) \ 111 #define DART_CLASS_LIST_TYPED_DATA(V) \
112 V(Int8) \ 112 V(Int8) \
113 V(Uint8) \ 113 V(Uint8) \
114 V(Uint8Clamped) \ 114 V(Uint8Clamped) \
115 V(Int16) \ 115 V(Int16) \
116 V(Uint16) \ 116 V(Uint16) \
117 V(Int32) \ 117 V(Int32) \
118 V(Uint32) \ 118 V(Uint32) \
119 V(Int64) \ 119 V(Int64) \
(...skipping 14 matching lines...) Expand all
134 CLASS_LIST_ARRAYS(V) \ 134 CLASS_LIST_ARRAYS(V) \
135 CLASS_LIST_STRINGS(V) 135 CLASS_LIST_STRINGS(V)
136 136
137 #define CLASS_LIST(V) \ 137 #define CLASS_LIST(V) \
138 V(Object) \ 138 V(Object) \
139 CLASS_LIST_NO_OBJECT(V) 139 CLASS_LIST_NO_OBJECT(V)
140 140
141 141
142 // Forward declarations. 142 // Forward declarations.
143 class Isolate; 143 class Isolate;
144 #define DEFINE_FORWARD_DECLARATION(clazz) \ 144 #define DEFINE_FORWARD_DECLARATION(clazz) class Raw##clazz;
145 class Raw##clazz;
146 CLASS_LIST(DEFINE_FORWARD_DECLARATION) 145 CLASS_LIST(DEFINE_FORWARD_DECLARATION)
147 #undef DEFINE_FORWARD_DECLARATION 146 #undef DEFINE_FORWARD_DECLARATION
148 147
149 148
150 enum ClassId { 149 enum ClassId {
151 // Illegal class id. 150 // Illegal class id.
152 kIllegalCid = 0, 151 kIllegalCid = 0,
153 152
154 // The following entries describes classes for pseudo-objects in the heap 153 // The following entries describes classes for pseudo-objects in the heap
155 // that should never be reachable from live objects. Free list elements 154 // that should never be reachable from live objects. Free list elements
156 // maintain the free list for old space, and forwarding corpses are used to 155 // maintain the free list for old space, and forwarding corpses are used to
157 // implement one-way become. 156 // implement one-way become.
158 kFreeListElement, 157 kFreeListElement,
159 kForwardingCorpse, 158 kForwardingCorpse,
160 159
161 // List of Ids for predefined classes. 160 // List of Ids for predefined classes.
162 #define DEFINE_OBJECT_KIND(clazz) \ 161 #define DEFINE_OBJECT_KIND(clazz) k##clazz##Cid,
163 k##clazz##Cid, 162 CLASS_LIST(DEFINE_OBJECT_KIND)
164 CLASS_LIST(DEFINE_OBJECT_KIND)
165 #undef DEFINE_OBJECT_KIND 163 #undef DEFINE_OBJECT_KIND
166 164
167 #define DEFINE_OBJECT_KIND(clazz) \ 165 #define DEFINE_OBJECT_KIND(clazz) kTypedData##clazz##Cid,
168 kTypedData##clazz##Cid, 166 CLASS_LIST_TYPED_DATA(DEFINE_OBJECT_KIND)
169 CLASS_LIST_TYPED_DATA(DEFINE_OBJECT_KIND)
170 #undef DEFINE_OBJECT_KIND 167 #undef DEFINE_OBJECT_KIND
171 168
172 #define DEFINE_OBJECT_KIND(clazz) \ 169 #define DEFINE_OBJECT_KIND(clazz) kTypedData##clazz##ViewCid,
173 kTypedData##clazz##ViewCid, 170 CLASS_LIST_TYPED_DATA(DEFINE_OBJECT_KIND)
174 CLASS_LIST_TYPED_DATA(DEFINE_OBJECT_KIND)
175 #undef DEFINE_OBJECT_KIND 171 #undef DEFINE_OBJECT_KIND
176 172
177 kByteDataViewCid, 173 kByteDataViewCid,
178 174
179 #define DEFINE_OBJECT_KIND(clazz) \ 175 #define DEFINE_OBJECT_KIND(clazz) kExternalTypedData##clazz##Cid,
180 kExternalTypedData##clazz##Cid, 176 CLASS_LIST_TYPED_DATA(DEFINE_OBJECT_KIND)
181 CLASS_LIST_TYPED_DATA(DEFINE_OBJECT_KIND)
182 #undef DEFINE_OBJECT_KIND 177 #undef DEFINE_OBJECT_KIND
183 178
184 kByteBufferCid, 179 kByteBufferCid,
185 180
186 // The following entries do not describe a predefined class, but instead 181 // The following entries do not describe a predefined class, but instead
187 // are class indexes for pre-allocated instance (Null, dynamic and Void). 182 // are class indexes for pre-allocated instance (Null, dynamic and Void).
188 kNullCid, 183 kNullCid,
189 kDynamicCid, 184 kDynamicCid,
190 kVoidCid, 185 kVoidCid,
191 186
192 kNumPredefinedCids, 187 kNumPredefinedCids,
193 }; 188 };
194 189
(...skipping 10 matching lines...) Expand all
205 enum { 200 enum {
206 kSmiTag = 0, 201 kSmiTag = 0,
207 kHeapObjectTag = 1, 202 kHeapObjectTag = 1,
208 kSmiTagSize = 1, 203 kSmiTagSize = 1,
209 kSmiTagMask = 1, 204 kSmiTagMask = 1,
210 kSmiTagShift = 1, 205 kSmiTagShift = 1,
211 }; 206 };
212 207
213 enum TypedDataElementType { 208 enum TypedDataElementType {
214 #define V(name) k##name##Element, 209 #define V(name) k##name##Element,
215 CLASS_LIST_TYPED_DATA(V) 210 CLASS_LIST_TYPED_DATA(V)
216 #undef V 211 #undef V
217 }; 212 };
218 213
219 #define SNAPSHOT_WRITER_SUPPORT() \ 214 #define SNAPSHOT_WRITER_SUPPORT() \
220 void WriteTo( \ 215 void WriteTo(SnapshotWriter* writer, intptr_t object_id, \
221 SnapshotWriter* writer, intptr_t object_id, \ 216 Snapshot::Kind kind, bool as_reference); \
222 Snapshot::Kind kind, bool as_reference); \ 217 friend class SnapshotWriter;
223 friend class SnapshotWriter; \
224 218
225 #define VISITOR_SUPPORT(object) \ 219 #define VISITOR_SUPPORT(object) \
226 static intptr_t Visit##object##Pointers(Raw##object* raw_obj, \ 220 static intptr_t Visit##object##Pointers(Raw##object* raw_obj, \
227 ObjectPointerVisitor* visitor); 221 ObjectPointerVisitor* visitor);
228 222
229 #define HEAP_PROFILER_SUPPORT() \ 223 #define HEAP_PROFILER_SUPPORT() friend class HeapProfiler;
230 friend class HeapProfiler; \
231 224
232 #define RAW_OBJECT_IMPLEMENTATION(object) \ 225 #define RAW_OBJECT_IMPLEMENTATION(object) \
233 private: /* NOLINT */ \ 226 private: /* NOLINT */ \
234 VISITOR_SUPPORT(object) \ 227 VISITOR_SUPPORT(object) \
235 friend class object; \ 228 friend class object; \
236 friend class RawObject; \ 229 friend class RawObject; \
237 friend class Heap; \ 230 friend class Heap; \
238 friend class Simulator; \ 231 friend class Simulator; \
239 friend class SimulatorHelpers; \ 232 friend class SimulatorHelpers; \
240 DISALLOW_ALLOCATION(); \ 233 DISALLOW_ALLOCATION(); \
241 DISALLOW_IMPLICIT_CONSTRUCTORS(Raw##object) 234 DISALLOW_IMPLICIT_CONSTRUCTORS(Raw##object)
242 235
243 // TODO(koda): Make ptr() return const*, like Object::raw_ptr(). 236 // TODO(koda): Make ptr() return const*, like Object::raw_ptr().
244 #define RAW_HEAP_OBJECT_IMPLEMENTATION(object) \ 237 #define RAW_HEAP_OBJECT_IMPLEMENTATION(object) \
245 private: \ 238 private: \
246 RAW_OBJECT_IMPLEMENTATION(object); \ 239 RAW_OBJECT_IMPLEMENTATION(object); \
247 Raw##object* ptr() const { \ 240 Raw##object* ptr() const { \
248 ASSERT(IsHeapObject()); \ 241 ASSERT(IsHeapObject()); \
249 return reinterpret_cast<Raw##object*>( \ 242 return reinterpret_cast<Raw##object*>(reinterpret_cast<uword>(this) - \
250 reinterpret_cast<uword>(this) - kHeapObjectTag); \ 243 kHeapObjectTag); \
251 } \ 244 } \
252 SNAPSHOT_WRITER_SUPPORT() \ 245 SNAPSHOT_WRITER_SUPPORT() \
253 HEAP_PROFILER_SUPPORT() \ 246 HEAP_PROFILER_SUPPORT() \
254 friend class object##SerializationCluster; \ 247 friend class object##SerializationCluster; \
255 friend class object##DeserializationCluster; \ 248 friend class object##DeserializationCluster;
256 249
257 // RawObject is the base class of all raw objects; even though it carries the 250 // RawObject is the base class of all raw objects; even though it carries the
258 // tags_ field not all raw objects are allocated in the heap and thus cannot 251 // tags_ field not all raw objects are allocated in the heap and thus cannot
259 // be dereferenced (e.g. RawSmi). 252 // be dereferenced (e.g. RawSmi).
260 class RawObject { 253 class RawObject {
261 public: 254 public:
262 // The tags field which is a part of the object header uses the following 255 // The tags field which is a part of the object header uses the following
263 // bit fields for storing tags. 256 // bit fields for storing tags.
264 enum TagBits { 257 enum TagBits {
265 kMarkBit = 0, 258 kMarkBit = 0,
(...skipping 16 matching lines...) Expand all
282 #else 275 #else
283 #error Unexpected architecture word size 276 #error Unexpected architecture word size
284 #endif 277 #endif
285 }; 278 };
286 279
287 COMPILE_ASSERT(kClassIdTagSize == (sizeof(classid_t) * kBitsPerByte)); 280 COMPILE_ASSERT(kClassIdTagSize == (sizeof(classid_t) * kBitsPerByte));
288 281
289 // Encodes the object size in the tag in units of object alignment. 282 // Encodes the object size in the tag in units of object alignment.
290 class SizeTag { 283 class SizeTag {
291 public: 284 public:
292 static const intptr_t kMaxSizeTag = 285 static const intptr_t kMaxSizeTag = ((1 << RawObject::kSizeTagSize) - 1)
293 ((1 << RawObject::kSizeTagSize) - 1) << kObjectAlignmentLog2; 286 << kObjectAlignmentLog2;
294 287
295 static uword encode(intptr_t size) { 288 static uword encode(intptr_t size) {
296 return SizeBits::encode(SizeToTagValue(size)); 289 return SizeBits::encode(SizeToTagValue(size));
297 } 290 }
298 291
299 static intptr_t decode(uword tag) { 292 static intptr_t decode(uword tag) {
300 return TagValueToSize(SizeBits::decode(tag)); 293 return TagValueToSize(SizeBits::decode(tag));
301 } 294 }
302 295
303 static uword update(intptr_t size, uword tag) { 296 static uword update(intptr_t size, uword tag) {
304 return SizeBits::update(SizeToTagValue(size), tag); 297 return SizeBits::update(SizeToTagValue(size), tag);
305 } 298 }
306 299
307 private: 300 private:
308 // The actual unscaled bit field used within the tag field. 301 // The actual unscaled bit field used within the tag field.
309 class SizeBits : 302 class SizeBits
310 public BitField<uword, intptr_t, kSizeTagPos, kSizeTagSize> {}; 303 : public BitField<uword, intptr_t, kSizeTagPos, kSizeTagSize> {};
311 304
312 static intptr_t SizeToTagValue(intptr_t size) { 305 static intptr_t SizeToTagValue(intptr_t size) {
313 ASSERT(Utils::IsAligned(size, kObjectAlignment)); 306 ASSERT(Utils::IsAligned(size, kObjectAlignment));
314 return (size > kMaxSizeTag) ? 0 : (size >> kObjectAlignmentLog2); 307 return (size > kMaxSizeTag) ? 0 : (size >> kObjectAlignmentLog2);
315 } 308 }
316 static intptr_t TagValueToSize(intptr_t value) { 309 static intptr_t TagValueToSize(intptr_t value) {
317 return value << kObjectAlignmentLog2; 310 return value << kObjectAlignmentLog2;
318 } 311 }
319 }; 312 };
320 313
321 class ClassIdTag : 314 class ClassIdTag
322 public BitField<uword, intptr_t, kClassIdTagPos, kClassIdTagSize> {}; 315 : public BitField<uword, intptr_t, kClassIdTagPos, kClassIdTagSize> {};
323 316
324 bool IsWellFormed() const { 317 bool IsWellFormed() const {
325 uword value = reinterpret_cast<uword>(this); 318 uword value = reinterpret_cast<uword>(this);
326 return (value & kSmiTagMask) == 0 || 319 return (value & kSmiTagMask) == 0 ||
327 Utils::IsAligned(value - kHeapObjectTag, kWordSize); 320 Utils::IsAligned(value - kHeapObjectTag, kWordSize);
328 } 321 }
329 bool IsHeapObject() const { 322 bool IsHeapObject() const {
330 ASSERT(IsWellFormed()); 323 ASSERT(IsWellFormed());
331 uword value = reinterpret_cast<uword>(this); 324 uword value = reinterpret_cast<uword>(this);
332 return (value & kSmiTagMask) == kHeapObjectTag; 325 return (value & kSmiTagMask) == kHeapObjectTag;
333 } 326 }
334 // Assumes this is a heap object. 327 // Assumes this is a heap object.
335 bool IsNewObject() const { 328 bool IsNewObject() const {
336 ASSERT(IsHeapObject()); 329 ASSERT(IsHeapObject());
337 uword addr = reinterpret_cast<uword>(this); 330 uword addr = reinterpret_cast<uword>(this);
(...skipping 11 matching lines...) Expand all
349 ASSERT(IsWellFormed()); 342 ASSERT(IsWellFormed());
350 COMPILE_ASSERT(kHeapObjectTag == 1); 343 COMPILE_ASSERT(kHeapObjectTag == 1);
351 COMPILE_ASSERT(kNewObjectAlignmentOffset == kWordSize); 344 COMPILE_ASSERT(kNewObjectAlignmentOffset == kWordSize);
352 static const uword kNewObjectBits = 345 static const uword kNewObjectBits =
353 (kNewObjectAlignmentOffset | kHeapObjectTag); 346 (kNewObjectAlignmentOffset | kHeapObjectTag);
354 const uword addr = reinterpret_cast<uword>(this); 347 const uword addr = reinterpret_cast<uword>(this);
355 return (addr & kNewObjectBits) != kNewObjectBits; 348 return (addr & kNewObjectBits) != kNewObjectBits;
356 } 349 }
357 350
358 // Support for GC marking bit. 351 // Support for GC marking bit.
359 bool IsMarked() const { 352 bool IsMarked() const { return MarkBit::decode(ptr()->tags_); }
360 return MarkBit::decode(ptr()->tags_);
361 }
362 void SetMarkBit() { 353 void SetMarkBit() {
363 ASSERT(!IsMarked()); 354 ASSERT(!IsMarked());
364 UpdateTagBit<MarkBit>(true); 355 UpdateTagBit<MarkBit>(true);
365 } 356 }
366 void SetMarkBitUnsynchronized() { 357 void SetMarkBitUnsynchronized() {
367 ASSERT(!IsMarked()); 358 ASSERT(!IsMarked());
368 uword tags = ptr()->tags_; 359 uword tags = ptr()->tags_;
369 ptr()->tags_ = MarkBit::update(true, tags); 360 ptr()->tags_ = MarkBit::update(true, tags);
370 } 361 }
371 void ClearMarkBit() { 362 void ClearMarkBit() {
372 ASSERT(IsMarked()); 363 ASSERT(IsMarked());
373 UpdateTagBit<MarkBit>(false); 364 UpdateTagBit<MarkBit>(false);
374 } 365 }
375 // Returns false if the bit was already set. 366 // Returns false if the bit was already set.
376 // TODO(koda): Add "must use result" annotation here, after we add support. 367 // TODO(koda): Add "must use result" annotation here, after we add support.
377 bool TryAcquireMarkBit() { 368 bool TryAcquireMarkBit() { return TryAcquireTagBit<MarkBit>(); }
378 return TryAcquireTagBit<MarkBit>();
379 }
380 369
381 // Support for object tags. 370 // Support for object tags.
382 bool IsCanonical() const { 371 bool IsCanonical() const { return CanonicalObjectTag::decode(ptr()->tags_); }
383 return CanonicalObjectTag::decode(ptr()->tags_); 372 void SetCanonical() { UpdateTagBit<CanonicalObjectTag>(true); }
384 } 373 void ClearCanonical() { UpdateTagBit<CanonicalObjectTag>(false); }
385 void SetCanonical() { 374 bool IsVMHeapObject() const { return VMHeapObjectTag::decode(ptr()->tags_); }
386 UpdateTagBit<CanonicalObjectTag>(true); 375 void SetVMHeapObject() { UpdateTagBit<VMHeapObjectTag>(true); }
387 }
388 void ClearCanonical() {
389 UpdateTagBit<CanonicalObjectTag>(false);
390 }
391 bool IsVMHeapObject() const {
392 return VMHeapObjectTag::decode(ptr()->tags_);
393 }
394 void SetVMHeapObject() {
395 UpdateTagBit<VMHeapObjectTag>(true);
396 }
397 376
398 // Support for GC remembered bit. 377 // Support for GC remembered bit.
399 bool IsRemembered() const { 378 bool IsRemembered() const { return RememberedBit::decode(ptr()->tags_); }
400 return RememberedBit::decode(ptr()->tags_);
401 }
402 void SetRememberedBit() { 379 void SetRememberedBit() {
403 ASSERT(!IsRemembered()); 380 ASSERT(!IsRemembered());
404 UpdateTagBit<RememberedBit>(true); 381 UpdateTagBit<RememberedBit>(true);
405 } 382 }
406 void SetRememberedBitUnsynchronized() { 383 void SetRememberedBitUnsynchronized() {
407 ASSERT(!IsRemembered()); 384 ASSERT(!IsRemembered());
408 uword tags = ptr()->tags_; 385 uword tags = ptr()->tags_;
409 ptr()->tags_ = RememberedBit::update(true, tags); 386 ptr()->tags_ = RememberedBit::update(true, tags);
410 } 387 }
411 void ClearRememberedBit() { 388 void ClearRememberedBit() { UpdateTagBit<RememberedBit>(false); }
412 UpdateTagBit<RememberedBit>(false);
413 }
414 void ClearRememberedBitUnsynchronized() { 389 void ClearRememberedBitUnsynchronized() {
415 uword tags = ptr()->tags_; 390 uword tags = ptr()->tags_;
416 ptr()->tags_ = RememberedBit::update(false, tags); 391 ptr()->tags_ = RememberedBit::update(false, tags);
417 } 392 }
418 // Returns false if the bit was already set. 393 // Returns false if the bit was already set.
419 // TODO(koda): Add "must use result" annotation here, after we add support. 394 // TODO(koda): Add "must use result" annotation here, after we add support.
420 bool TryAcquireRememberedBit() { 395 bool TryAcquireRememberedBit() { return TryAcquireTagBit<RememberedBit>(); }
421 return TryAcquireTagBit<RememberedBit>();
422 }
423 396
424 #define DEFINE_IS_CID(clazz) \ 397 #define DEFINE_IS_CID(clazz) \
425 bool Is##clazz() const { return ((GetClassId() == k##clazz##Cid)); } 398 bool Is##clazz() const { return ((GetClassId() == k##clazz##Cid)); }
426 CLASS_LIST(DEFINE_IS_CID) 399 CLASS_LIST(DEFINE_IS_CID)
427 #undef DEFINE_IS_CID 400 #undef DEFINE_IS_CID
428 401
429 #define DEFINE_IS_CID(clazz) \ 402 #define DEFINE_IS_CID(clazz) \
430 bool IsTypedData##clazz() const { \ 403 bool IsTypedData##clazz() const { \
431 return ((GetClassId() == kTypedData##clazz##Cid)); \ 404 return ((GetClassId() == kTypedData##clazz##Cid)); \
432 } \ 405 } \
433 bool IsTypedDataView##clazz() const { \ 406 bool IsTypedDataView##clazz() const { \
434 return ((GetClassId() == kTypedData##clazz##ViewCid)); \ 407 return ((GetClassId() == kTypedData##clazz##ViewCid)); \
435 } \ 408 } \
436 bool IsExternalTypedData##clazz() const { \ 409 bool IsExternalTypedData##clazz() const { \
437 return ((GetClassId() == kExternalTypedData##clazz##Cid)); \ 410 return ((GetClassId() == kExternalTypedData##clazz##Cid)); \
438 } 411 }
439 CLASS_LIST_TYPED_DATA(DEFINE_IS_CID) 412 CLASS_LIST_TYPED_DATA(DEFINE_IS_CID)
440 #undef DEFINE_IS_CID 413 #undef DEFINE_IS_CID
441 414
442 bool IsStringInstance() const { 415 bool IsStringInstance() const { return IsStringClassId(GetClassId()); }
443 return IsStringClassId(GetClassId());
444 }
445 bool IsDartInstance() const { 416 bool IsDartInstance() const {
446 return (!IsHeapObject() || (GetClassId() >= kInstanceCid)); 417 return (!IsHeapObject() || (GetClassId() >= kInstanceCid));
447 } 418 }
448 bool IsFreeListElement() const { 419 bool IsFreeListElement() const {
449 return ((GetClassId() == kFreeListElement)); 420 return ((GetClassId() == kFreeListElement));
450 } 421 }
451 bool IsForwardingCorpse() const { 422 bool IsForwardingCorpse() const {
452 return ((GetClassId() == kForwardingCorpse)); 423 return ((GetClassId() == kForwardingCorpse));
453 } 424 }
454 bool IsPseudoObject() const { 425 bool IsPseudoObject() const {
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
517 uword tags_; // Various object tags (bits). 488 uword tags_; // Various object tags (bits).
518 489
519 class MarkBit : public BitField<uword, bool, kMarkBit, 1> {}; 490 class MarkBit : public BitField<uword, bool, kMarkBit, 1> {};
520 491
521 class RememberedBit : public BitField<uword, bool, kRememberedBit, 1> {}; 492 class RememberedBit : public BitField<uword, bool, kRememberedBit, 1> {};
522 493
523 class CanonicalObjectTag : public BitField<uword, bool, kCanonicalBit, 1> {}; 494 class CanonicalObjectTag : public BitField<uword, bool, kCanonicalBit, 1> {};
524 495
525 class VMHeapObjectTag : public BitField<uword, bool, kVMHeapObjectBit, 1> {}; 496 class VMHeapObjectTag : public BitField<uword, bool, kVMHeapObjectBit, 1> {};
526 497
527 class ReservedBits : public 498 class ReservedBits
528 BitField<uword, intptr_t, kReservedTagPos, kReservedTagSize> {}; 499 : public BitField<uword, intptr_t, kReservedTagPos, kReservedTagSize> {};
529 500
530 // TODO(koda): After handling tags_, return const*, like Object::raw_ptr(). 501 // TODO(koda): After handling tags_, return const*, like Object::raw_ptr().
531 RawObject* ptr() const { 502 RawObject* ptr() const {
532 ASSERT(IsHeapObject()); 503 ASSERT(IsHeapObject());
533 return reinterpret_cast<RawObject*>( 504 return reinterpret_cast<RawObject*>(reinterpret_cast<uword>(this) -
534 reinterpret_cast<uword>(this) - kHeapObjectTag); 505 kHeapObjectTag);
535 } 506 }
536 507
537 intptr_t SizeFromClass() const; 508 intptr_t SizeFromClass() const;
538 509
539 intptr_t GetClassId() const { 510 intptr_t GetClassId() const {
540 uword tags = ptr()->tags_; 511 uword tags = ptr()->tags_;
541 return ClassIdTag::decode(tags); 512 return ClassIdTag::decode(tags);
542 } 513 }
543 514
544 void SetClassId(intptr_t new_cid) { 515 void SetClassId(intptr_t new_cid) {
545 uword tags = ptr()->tags_; 516 uword tags = ptr()->tags_;
546 ptr()->tags_ = ClassIdTag::update(new_cid, tags); 517 ptr()->tags_ = ClassIdTag::update(new_cid, tags);
547 } 518 }
548 519
549 template<class TagBitField> 520 template <class TagBitField>
550 void UpdateTagBit(bool value) { 521 void UpdateTagBit(bool value) {
551 uword tags = ptr()->tags_; 522 uword tags = ptr()->tags_;
552 uword old_tags; 523 uword old_tags;
553 do { 524 do {
554 old_tags = tags; 525 old_tags = tags;
555 uword new_tags = TagBitField::update(value, old_tags); 526 uword new_tags = TagBitField::update(value, old_tags);
556 tags = AtomicOperations::CompareAndSwapWord( 527 tags = AtomicOperations::CompareAndSwapWord(&ptr()->tags_, old_tags,
557 &ptr()->tags_, old_tags, new_tags); 528 new_tags);
558 } while (tags != old_tags); 529 } while (tags != old_tags);
559 } 530 }
560 531
561 template<class TagBitField> 532 template <class TagBitField>
562 bool TryAcquireTagBit() { 533 bool TryAcquireTagBit() {
563 uword tags = ptr()->tags_; 534 uword tags = ptr()->tags_;
564 uword old_tags; 535 uword old_tags;
565 do { 536 do {
566 old_tags = tags; 537 old_tags = tags;
567 if (TagBitField::decode(tags)) return false; 538 if (TagBitField::decode(tags)) return false;
568 uword new_tags = TagBitField::update(true, old_tags); 539 uword new_tags = TagBitField::update(true, old_tags);
569 tags = AtomicOperations::CompareAndSwapWord( 540 tags = AtomicOperations::CompareAndSwapWord(&ptr()->tags_, old_tags,
570 &ptr()->tags_, old_tags, new_tags); 541 new_tags);
571 } while (tags != old_tags); 542 } while (tags != old_tags);
572 return true; 543 return true;
573 } 544 }
574 545
575 // All writes to heap objects should ultimately pass through one of the 546 // All writes to heap objects should ultimately pass through one of the
576 // methods below or their counterparts in Object, to ensure that the 547 // methods below or their counterparts in Object, to ensure that the
577 // write barrier is correctly applied. 548 // write barrier is correctly applied.
578 549
579 template<typename type> 550 template <typename type>
580 void StorePointer(type const* addr, type value) { 551 void StorePointer(type const* addr, type value) {
581 *const_cast<type*>(addr) = value; 552 *const_cast<type*>(addr) = value;
582 // Filter stores based on source and target. 553 // Filter stores based on source and target.
583 if (!value->IsHeapObject()) return; 554 if (!value->IsHeapObject()) return;
584 if (value->IsNewObject() && this->IsOldObject() && 555 if (value->IsNewObject() && this->IsOldObject() && !this->IsRemembered()) {
585 !this->IsRemembered()) {
586 this->SetRememberedBit(); 556 this->SetRememberedBit();
587 Thread::Current()->StoreBufferAddObject(this); 557 Thread::Current()->StoreBufferAddObject(this);
588 } 558 }
589 } 559 }
590 560
591 // Use for storing into an explicitly Smi-typed field of an object 561 // Use for storing into an explicitly Smi-typed field of an object
592 // (i.e., both the previous and new value are Smis). 562 // (i.e., both the previous and new value are Smis).
593 void StoreSmi(RawSmi* const* addr, RawSmi* value) { 563 void StoreSmi(RawSmi* const* addr, RawSmi* value) {
594 // Can't use Contains, as array length is initialized through this method. 564 // Can't use Contains, as array length is initialized through this method.
595 ASSERT(reinterpret_cast<uword>(addr) >= RawObject::ToAddr(this)); 565 ASSERT(reinterpret_cast<uword>(addr) >= RawObject::ToAddr(this));
596 *const_cast<RawSmi**>(addr) = value; 566 *const_cast<RawSmi**>(addr) = value;
597 } 567 }
598 568
599 friend class Api; 569 friend class Api;
600 friend class ApiMessageReader; // GetClassId 570 friend class ApiMessageReader; // GetClassId
601 friend class Serializer; // GetClassId 571 friend class Serializer; // GetClassId
602 friend class Array; 572 friend class Array;
603 friend class Become; // GetClassId 573 friend class Become; // GetClassId
604 friend class Bigint; 574 friend class Bigint;
605 friend class ByteBuffer; 575 friend class ByteBuffer;
606 friend class CidRewriteVisitor; 576 friend class CidRewriteVisitor;
607 friend class Closure; 577 friend class Closure;
608 friend class Code; 578 friend class Code;
609 friend class Double; 579 friend class Double;
610 friend class ForwardPointersVisitor; // StorePointer 580 friend class ForwardPointersVisitor; // StorePointer
611 friend class FreeListElement; 581 friend class FreeListElement;
612 friend class Function; 582 friend class Function;
613 friend class GCMarker; 583 friend class GCMarker;
614 friend class ExternalTypedData; 584 friend class ExternalTypedData;
615 friend class ForwardList; 585 friend class ForwardList;
616 friend class GrowableObjectArray; // StorePointer 586 friend class GrowableObjectArray; // StorePointer
617 friend class Heap; 587 friend class Heap;
618 friend class HeapMapAsJSONVisitor; 588 friend class HeapMapAsJSONVisitor;
619 friend class ClassStatsVisitor; 589 friend class ClassStatsVisitor;
620 template<bool> friend class MarkingVisitorBase; 590 template <bool>
591 friend class MarkingVisitorBase;
621 friend class Mint; 592 friend class Mint;
622 friend class Object; 593 friend class Object;
623 friend class OneByteString; // StoreSmi 594 friend class OneByteString; // StoreSmi
624 friend class RawCode; 595 friend class RawCode;
625 friend class RawExternalTypedData; 596 friend class RawExternalTypedData;
626 friend class RawInstructions; 597 friend class RawInstructions;
627 friend class RawInstance; 598 friend class RawInstance;
628 friend class RawTypedData; 599 friend class RawTypedData;
629 friend class Scavenger; 600 friend class Scavenger;
630 friend class ScavengerVisitor; 601 friend class ScavengerVisitor;
631 friend class SizeExcludingClassVisitor; // GetClassId 602 friend class SizeExcludingClassVisitor; // GetClassId
632 friend class InstanceAccumulator; // GetClassId 603 friend class InstanceAccumulator; // GetClassId
633 friend class RetainingPathVisitor; // GetClassId 604 friend class RetainingPathVisitor; // GetClassId
634 friend class SkippedCodeFunctions; // StorePointer 605 friend class SkippedCodeFunctions; // StorePointer
635 friend class InstructionsReader; // tags_ check 606 friend class InstructionsReader; // tags_ check
636 friend class AssemblyInstructionsWriter; 607 friend class AssemblyInstructionsWriter;
637 friend class BlobInstructionsWriter; 608 friend class BlobInstructionsWriter;
638 friend class SnapshotReader; 609 friend class SnapshotReader;
639 friend class Deserializer; 610 friend class Deserializer;
640 friend class SnapshotWriter; 611 friend class SnapshotWriter;
641 friend class String; 612 friend class String;
642 friend class Type; // GetClassId 613 friend class Type; // GetClassId
643 friend class TypedData; 614 friend class TypedData;
644 friend class TypedDataView; 615 friend class TypedDataView;
645 friend class WeakProperty; // StorePointer 616 friend class WeakProperty; // StorePointer
646 friend class Instance; // StorePointer 617 friend class Instance; // StorePointer
647 friend class StackFrame; // GetCodeObject assertion. 618 friend class StackFrame; // GetCodeObject assertion.
648 friend class CodeLookupTableBuilder; // profiler 619 friend class CodeLookupTableBuilder; // profiler
649 friend class NativeEntry; // GetClassId 620 friend class NativeEntry; // GetClassId
650 friend class Simulator; 621 friend class Simulator;
651 friend class SimulatorHelpers; 622 friend class SimulatorHelpers;
652 friend class ObjectLocator; 623 friend class ObjectLocator;
653 friend class InstanceMorpher; // GetClassId 624 friend class InstanceMorpher; // GetClassId
654 friend class VerifyCanonicalVisitor; 625 friend class VerifyCanonicalVisitor;
655 626
656 DISALLOW_ALLOCATION(); 627 DISALLOW_ALLOCATION();
657 DISALLOW_IMPLICIT_CONSTRUCTORS(RawObject); 628 DISALLOW_IMPLICIT_CONSTRUCTORS(RawObject);
658 }; 629 };
659 630
660 631
661 class RawClass : public RawObject { 632 class RawClass : public RawObject {
662 public: 633 public:
663 enum ClassFinalizedState { 634 enum ClassFinalizedState {
664 kAllocated = 0, // Initial state. 635 kAllocated = 0, // Initial state.
665 kPreFinalized, // VM classes: size precomputed, but no checks done. 636 kPreFinalized, // VM classes: size precomputed, but no checks done.
666 kFinalized, // Class parsed, finalized and ready for use. 637 kFinalized, // Class parsed, finalized and ready for use.
667 kRefinalizeAfterPatch, // Class needs to be refinalized (patched). 638 kRefinalizeAfterPatch, // Class needs to be refinalized (patched).
668 }; 639 };
669 640
670 private: 641 private:
671 RAW_HEAP_OBJECT_IMPLEMENTATION(Class); 642 RAW_HEAP_OBJECT_IMPLEMENTATION(Class);
672 643
673 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->name_); } 644 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->name_); }
674 RawString* name_; 645 RawString* name_;
675 NOT_IN_PRODUCT(RawString* user_name_); 646 NOT_IN_PRODUCT(RawString* user_name_);
676 RawArray* functions_; 647 RawArray* functions_;
677 RawArray* functions_hash_table_; 648 RawArray* functions_hash_table_;
678 RawArray* fields_; 649 RawArray* fields_;
679 RawArray* offset_in_words_to_field_; 650 RawArray* offset_in_words_to_field_;
680 RawArray* interfaces_; // Array of AbstractType. 651 RawArray* interfaces_; // Array of AbstractType.
681 RawScript* script_; 652 RawScript* script_;
682 RawLibrary* library_; 653 RawLibrary* library_;
683 RawTypeArguments* type_parameters_; // Array of TypeParameter. 654 RawTypeArguments* type_parameters_; // Array of TypeParameter.
684 RawAbstractType* super_type_; 655 RawAbstractType* super_type_;
685 RawType* mixin_; // Generic mixin type, e.g. M<T>, not M<int>. 656 RawType* mixin_; // Generic mixin type, e.g. M<T>, not M<int>.
686 RawFunction* signature_function_; // Associated function for typedef class. 657 RawFunction* signature_function_; // Associated function for typedef class.
687 RawArray* constants_; // Canonicalized const instances of this class. 658 RawArray* constants_; // Canonicalized const instances of this class.
688 RawType* canonical_type_; // Canonical type for this class. 659 RawType* canonical_type_; // Canonical type for this class.
689 RawArray* invocation_dispatcher_cache_; // Cache for dispatcher functions. 660 RawArray* invocation_dispatcher_cache_; // Cache for dispatcher functions.
690 RawCode* allocation_stub_; // Stub code for allocation of instances. 661 RawCode* allocation_stub_; // Stub code for allocation of instances.
691 RawGrowableObjectArray* direct_subclasses_; // Array of Class. 662 RawGrowableObjectArray* direct_subclasses_; // Array of Class.
692 RawArray* dependent_code_; // CHA optimized codes. 663 RawArray* dependent_code_; // CHA optimized codes.
693 RawObject** to() { 664 RawObject** to() {
694 return reinterpret_cast<RawObject**>(&ptr()->dependent_code_); 665 return reinterpret_cast<RawObject**>(&ptr()->dependent_code_);
695 } 666 }
696 RawObject** to_snapshot(Snapshot::Kind kind) { 667 RawObject** to_snapshot(Snapshot::Kind kind) {
697 switch (kind) { 668 switch (kind) {
698 case Snapshot::kCore: 669 case Snapshot::kCore:
699 case Snapshot::kScript: 670 case Snapshot::kScript:
700 case Snapshot::kAppWithJIT: 671 case Snapshot::kAppWithJIT:
701 case Snapshot::kAppNoJIT: 672 case Snapshot::kAppNoJIT:
702 return reinterpret_cast<RawObject**>(&ptr()->direct_subclasses_); 673 return reinterpret_cast<RawObject**>(&ptr()->direct_subclasses_);
703 case Snapshot::kMessage: 674 case Snapshot::kMessage:
704 case Snapshot::kNone: 675 case Snapshot::kNone:
705 case Snapshot::kInvalid: 676 case Snapshot::kInvalid:
706 break; 677 break;
707 } 678 }
708 UNREACHABLE(); 679 UNREACHABLE();
709 return NULL; 680 return NULL;
710 } 681 }
711 682
712 cpp_vtable handle_vtable_; 683 cpp_vtable handle_vtable_;
713 TokenPosition token_pos_; 684 TokenPosition token_pos_;
714 int32_t instance_size_in_words_; // Size if fixed len or 0 if variable len. 685 int32_t instance_size_in_words_; // Size if fixed len or 0 if variable len.
715 int32_t type_arguments_field_offset_in_words_; // Offset of type args fld. 686 int32_t type_arguments_field_offset_in_words_; // Offset of type args fld.
716 int32_t next_field_offset_in_words_; // Offset of the next instance field. 687 int32_t next_field_offset_in_words_; // Offset of the next instance field.
717 classid_t id_; // Class Id, also index in the class table. 688 classid_t id_; // Class Id, also index in the class table.
718 int16_t num_type_arguments_; // Number of type arguments in flattened vector. 689 int16_t num_type_arguments_; // Number of type arguments in flattened vector.
719 int16_t num_own_type_arguments_; // Number of non-overlapping type arguments. 690 int16_t num_own_type_arguments_; // Number of non-overlapping type arguments.
720 uint16_t num_native_fields_; // Number of native fields in class. 691 uint16_t num_native_fields_; // Number of native fields in class.
721 uint16_t state_bits_; 692 uint16_t state_bits_;
722 693
723 friend class Instance; 694 friend class Instance;
724 friend class Isolate; 695 friend class Isolate;
725 friend class Object; 696 friend class Object;
726 friend class RawInstance; 697 friend class RawInstance;
727 friend class RawInstructions; 698 friend class RawInstructions;
728 friend class SnapshotReader; 699 friend class SnapshotReader;
729 friend class InstanceSerializationCluster; 700 friend class InstanceSerializationCluster;
730 friend class CidRewriteVisitor; 701 friend class CidRewriteVisitor;
731 }; 702 };
732 703
733 704
734 class RawUnresolvedClass : public RawObject { 705 class RawUnresolvedClass : public RawObject {
735 RAW_HEAP_OBJECT_IMPLEMENTATION(UnresolvedClass); 706 RAW_HEAP_OBJECT_IMPLEMENTATION(UnresolvedClass);
736 707
737 RawObject** from() { 708 RawObject** from() {
738 return reinterpret_cast<RawObject**>(&ptr()->library_prefix_); 709 return reinterpret_cast<RawObject**>(&ptr()->library_prefix_);
739 } 710 }
740 RawLibraryPrefix* library_prefix_; // Library prefix qualifier for the ident. 711 RawLibraryPrefix* library_prefix_; // Library prefix qualifier for the ident.
741 RawString* ident_; // Name of the unresolved identifier. 712 RawString* ident_; // Name of the unresolved identifier.
742 RawObject** to() { 713 RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->ident_); }
743 return reinterpret_cast<RawObject**>(&ptr()->ident_);
744 }
745 TokenPosition token_pos_; 714 TokenPosition token_pos_;
746 }; 715 };
747 716
748 717
749 class RawTypeArguments : public RawObject { 718 class RawTypeArguments : public RawObject {
750 private: 719 private:
751 RAW_HEAP_OBJECT_IMPLEMENTATION(TypeArguments); 720 RAW_HEAP_OBJECT_IMPLEMENTATION(TypeArguments);
752 721
753 RawObject** from() { 722 RawObject** from() {
754 return reinterpret_cast<RawObject**>(&ptr()->instantiations_); 723 return reinterpret_cast<RawObject**>(&ptr()->instantiations_);
(...skipping 25 matching lines...) Expand all
780 class RawPatchClass : public RawObject { 749 class RawPatchClass : public RawObject {
781 private: 750 private:
782 RAW_HEAP_OBJECT_IMPLEMENTATION(PatchClass); 751 RAW_HEAP_OBJECT_IMPLEMENTATION(PatchClass);
783 752
784 RawObject** from() { 753 RawObject** from() {
785 return reinterpret_cast<RawObject**>(&ptr()->patched_class_); 754 return reinterpret_cast<RawObject**>(&ptr()->patched_class_);
786 } 755 }
787 RawClass* patched_class_; 756 RawClass* patched_class_;
788 RawClass* origin_class_; 757 RawClass* origin_class_;
789 RawScript* script_; 758 RawScript* script_;
790 RawObject** to() { 759 RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->script_); }
791 return reinterpret_cast<RawObject**>(&ptr()->script_);
792 }
793 760
794 friend class Function; 761 friend class Function;
795 }; 762 };
796 763
797 764
798 class RawFunction : public RawObject { 765 class RawFunction : public RawObject {
799 public: 766 public:
800 enum Kind { 767 enum Kind {
801 kRegularFunction, 768 kRegularFunction,
802 kClosureFunction, 769 kClosureFunction,
803 kSignatureFunction, // represents a signature only without actual code. 770 kSignatureFunction, // represents a signature only without actual code.
804 kGetterFunction, // represents getter functions e.g: get foo() { .. }. 771 kGetterFunction, // represents getter functions e.g: get foo() { .. }.
805 kSetterFunction, // represents setter functions e.g: set foo(..) { .. }. 772 kSetterFunction, // represents setter functions e.g: set foo(..) { .. }.
806 kConstructor, 773 kConstructor,
807 kImplicitGetter, // represents an implicit getter for fields. 774 kImplicitGetter, // represents an implicit getter for fields.
808 kImplicitSetter, // represents an implicit setter for fields. 775 kImplicitSetter, // represents an implicit setter for fields.
809 kImplicitStaticFinalGetter, // represents an implicit getter for static 776 kImplicitStaticFinalGetter, // represents an implicit getter for static
810 // final fields (incl. static const fields). 777 // final fields (incl. static const fields).
811 kMethodExtractor, // converts method into implicit closure on the receiver. 778 kMethodExtractor, // converts method into implicit closure on the receiver.
812 kNoSuchMethodDispatcher, // invokes noSuchMethod. 779 kNoSuchMethodDispatcher, // invokes noSuchMethod.
813 kInvokeFieldDispatcher, // invokes a field as a closure. 780 kInvokeFieldDispatcher, // invokes a field as a closure.
814 kIrregexpFunction, // represents a generated irregexp matcher function. 781 kIrregexpFunction, // represents a generated irregexp matcher function.
815 }; 782 };
816 783
817 enum AsyncModifier { 784 enum AsyncModifier {
818 kNoModifier = 0x0, 785 kNoModifier = 0x0,
819 kAsyncBit = 0x1, 786 kAsyncBit = 0x1,
820 kGeneratorBit = 0x2, 787 kGeneratorBit = 0x2,
821 kAsync = kAsyncBit, 788 kAsync = kAsyncBit,
822 kSyncGen = kGeneratorBit, 789 kSyncGen = kGeneratorBit,
823 kAsyncGen = kAsyncBit | kGeneratorBit, 790 kAsyncGen = kAsyncBit | kGeneratorBit,
824 }; 791 };
825 792
826 private: 793 private:
827 // So that the SkippedCodeFunctions::DetachCode can null out the code fields. 794 // So that the SkippedCodeFunctions::DetachCode can null out the code fields.
828 friend class SkippedCodeFunctions; 795 friend class SkippedCodeFunctions;
829 friend class Class; 796 friend class Class;
830 797
831 RAW_HEAP_OBJECT_IMPLEMENTATION(Function); 798 RAW_HEAP_OBJECT_IMPLEMENTATION(Function);
832 799
833 static bool ShouldVisitCode(RawCode* raw_code); 800 static bool ShouldVisitCode(RawCode* raw_code);
(...skipping 25 matching lines...) Expand all
859 return reinterpret_cast<RawObject**>(&ptr()->code_); 826 return reinterpret_cast<RawObject**>(&ptr()->code_);
860 #else 827 #else
861 return reinterpret_cast<RawObject**>(&ptr()->unoptimized_code_); 828 return reinterpret_cast<RawObject**>(&ptr()->unoptimized_code_);
862 #endif 829 #endif
863 } 830 }
864 831
865 NOT_IN_PRECOMPILED(TokenPosition token_pos_); 832 NOT_IN_PRECOMPILED(TokenPosition token_pos_);
866 NOT_IN_PRECOMPILED(TokenPosition end_token_pos_); 833 NOT_IN_PRECOMPILED(TokenPosition end_token_pos_);
867 NOT_IN_PRECOMPILED(int32_t usage_counter_); // Accessed from generated code 834 NOT_IN_PRECOMPILED(int32_t usage_counter_); // Accessed from generated code
868 // (JIT only). 835 // (JIT only).
869 uint32_t kind_tag_; // See Function::KindTagBits. 836 uint32_t kind_tag_; // See Function::KindTagBits.
870 int16_t num_fixed_parameters_; 837 int16_t num_fixed_parameters_;
871 int16_t num_optional_parameters_; // > 0: positional; < 0: named. 838 int16_t num_optional_parameters_; // > 0: positional; < 0: named.
872 NOT_IN_PRECOMPILED(void* kernel_function_); 839 NOT_IN_PRECOMPILED(void* kernel_function_);
873 NOT_IN_PRECOMPILED(uint16_t optimized_instruction_count_); 840 NOT_IN_PRECOMPILED(uint16_t optimized_instruction_count_);
874 NOT_IN_PRECOMPILED(uint16_t optimized_call_site_count_); 841 NOT_IN_PRECOMPILED(uint16_t optimized_call_site_count_);
875 NOT_IN_PRECOMPILED(int8_t deoptimization_counter_); 842 NOT_IN_PRECOMPILED(int8_t deoptimization_counter_);
876 NOT_IN_PRECOMPILED(int8_t was_compiled_); 843 NOT_IN_PRECOMPILED(int8_t was_compiled_);
877 }; 844 };
878 845
879 846
880 class RawClosureData : public RawObject { 847 class RawClosureData : public RawObject {
881 private: 848 private:
882 RAW_HEAP_OBJECT_IMPLEMENTATION(ClosureData); 849 RAW_HEAP_OBJECT_IMPLEMENTATION(ClosureData);
883 850
884 RawObject** from() { 851 RawObject** from() {
885 return reinterpret_cast<RawObject**>(&ptr()->context_scope_); 852 return reinterpret_cast<RawObject**>(&ptr()->context_scope_);
886 } 853 }
887 RawContextScope* context_scope_; 854 RawContextScope* context_scope_;
888 RawFunction* parent_function_; // Enclosing function of this local function. 855 RawFunction* parent_function_; // Enclosing function of this local function.
889 RawType* signature_type_; 856 RawType* signature_type_;
890 RawInstance* closure_; // Closure object for static implicit closures. 857 RawInstance* closure_; // Closure object for static implicit closures.
891 RawObject** to() { 858 RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->closure_); }
892 return reinterpret_cast<RawObject**>(&ptr()->closure_);
893 }
894 859
895 friend class Function; 860 friend class Function;
896 }; 861 };
897 862
898 863
899 class RawRedirectionData : public RawObject { 864 class RawRedirectionData : public RawObject {
900 private: 865 private:
901 RAW_HEAP_OBJECT_IMPLEMENTATION(RedirectionData); 866 RAW_HEAP_OBJECT_IMPLEMENTATION(RedirectionData);
902 867
903 RawObject** from() { 868 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->type_); }
904 return reinterpret_cast<RawObject**>(&ptr()->type_);
905 }
906 RawType* type_; 869 RawType* type_;
907 RawString* identifier_; 870 RawString* identifier_;
908 RawFunction* target_; 871 RawFunction* target_;
909 RawObject** to() { 872 RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->target_); }
910 return reinterpret_cast<RawObject**>(&ptr()->target_);
911 }
912 }; 873 };
913 874
914 875
915 class RawField : public RawObject { 876 class RawField : public RawObject {
916 RAW_HEAP_OBJECT_IMPLEMENTATION(Field); 877 RAW_HEAP_OBJECT_IMPLEMENTATION(Field);
917 878
918 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->name_); } 879 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->name_); }
919 RawString* name_; 880 RawString* name_;
920 RawObject* owner_; // Class or patch class or mixin class 881 RawObject* owner_; // Class or patch class or mixin class
921 // where this field is defined or original field. 882 // where this field is defined or original field.
922 RawAbstractType* type_; 883 RawAbstractType* type_;
923 union { 884 union {
924 RawInstance* static_value_; // Value for static fields. 885 RawInstance* static_value_; // Value for static fields.
925 RawSmi* offset_; // Offset in words for instance fields. 886 RawSmi* offset_; // Offset in words for instance fields.
926 } value_; 887 } value_;
927 union { 888 union {
928 // When precompiling we need to save the static initializer function here 889 // When precompiling we need to save the static initializer function here
929 // so that code for it can be generated. 890 // so that code for it can be generated.
930 RawFunction* precompiled_; // Static initializer function - precompiling. 891 RawFunction* precompiled_; // Static initializer function - precompiling.
931 // When generating script snapshots after running the application it is 892 // When generating script snapshots after running the application it is
932 // necessary to save the initial value of static fields so that we can 893 // necessary to save the initial value of static fields so that we can
933 // restore the value back to the original initial value. 894 // restore the value back to the original initial value.
934 RawInstance* saved_value_; // Saved initial value - static fields. 895 RawInstance* saved_value_; // Saved initial value - static fields.
935 } initializer_; 896 } initializer_;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
968 uint8_t kind_bits_; // static, final, const, has initializer.... 929 uint8_t kind_bits_; // static, final, const, has initializer....
969 NOT_IN_PRECOMPILED(void* kernel_field_); 930 NOT_IN_PRECOMPILED(void* kernel_field_);
970 931
971 friend class CidRewriteVisitor; 932 friend class CidRewriteVisitor;
972 }; 933 };
973 934
974 935
975 class RawLiteralToken : public RawObject { 936 class RawLiteralToken : public RawObject {
976 RAW_HEAP_OBJECT_IMPLEMENTATION(LiteralToken); 937 RAW_HEAP_OBJECT_IMPLEMENTATION(LiteralToken);
977 938
978 RawObject** from() { 939 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->literal_); }
979 return reinterpret_cast<RawObject**>(&ptr()->literal_);
980 }
981 RawString* literal_; // Literal characters as they appear in source text. 940 RawString* literal_; // Literal characters as they appear in source text.
982 RawObject* value_; // The actual object corresponding to the token. 941 RawObject* value_; // The actual object corresponding to the token.
983 RawObject** to() { 942 RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->value_); }
984 return reinterpret_cast<RawObject**>(&ptr()->value_);
985 }
986 Token::Kind kind_; // The literal kind (string, integer, double). 943 Token::Kind kind_; // The literal kind (string, integer, double).
987 944
988 friend class SnapshotReader; 945 friend class SnapshotReader;
989 }; 946 };
990 947
991 948
992 class RawTokenStream : public RawObject { 949 class RawTokenStream : public RawObject {
993 RAW_HEAP_OBJECT_IMPLEMENTATION(TokenStream); 950 RAW_HEAP_OBJECT_IMPLEMENTATION(TokenStream);
994 951
995 RawObject** from() { 952 RawObject** from() {
996 return reinterpret_cast<RawObject**>(&ptr()->private_key_); 953 return reinterpret_cast<RawObject**>(&ptr()->private_key_);
997 } 954 }
998 RawString* private_key_; // Key used for private identifiers. 955 RawString* private_key_; // Key used for private identifiers.
999 RawGrowableObjectArray* token_objects_; 956 RawGrowableObjectArray* token_objects_;
1000 RawExternalTypedData* stream_; 957 RawExternalTypedData* stream_;
1001 RawObject** to() { 958 RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->stream_); }
1002 return reinterpret_cast<RawObject**>(&ptr()->stream_);
1003 }
1004 959
1005 friend class SnapshotReader; 960 friend class SnapshotReader;
1006 }; 961 };
1007 962
1008 963
1009 class RawScript : public RawObject { 964 class RawScript : public RawObject {
1010 public: 965 public:
1011 enum Kind { 966 enum Kind {
1012 kScriptTag = 0, 967 kScriptTag = 0,
1013 kLibraryTag, 968 kLibraryTag,
1014 kSourceTag, 969 kSourceTag,
1015 kPatchTag, 970 kPatchTag,
1016 kEvaluateTag, 971 kEvaluateTag,
1017 }; 972 };
1018 973
1019 private: 974 private:
1020 RAW_HEAP_OBJECT_IMPLEMENTATION(Script); 975 RAW_HEAP_OBJECT_IMPLEMENTATION(Script);
1021 976
1022 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->url_); } 977 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->url_); }
1023 RawString* url_; 978 RawString* url_;
1024 RawString* resolved_url_; 979 RawString* resolved_url_;
1025 RawArray* compile_time_constants_; 980 RawArray* compile_time_constants_;
1026 RawTokenStream* tokens_; 981 RawTokenStream* tokens_;
1027 RawString* source_; 982 RawString* source_;
1028 RawObject** to() {return reinterpret_cast<RawObject**>(&ptr()->source_); } 983 RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->source_); }
1029 RawObject** to_snapshot(Snapshot::Kind kind) { 984 RawObject** to_snapshot(Snapshot::Kind kind) {
1030 switch (kind) { 985 switch (kind) {
1031 case Snapshot::kAppNoJIT: 986 case Snapshot::kAppNoJIT:
1032 return reinterpret_cast<RawObject**>(&ptr()->url_); 987 return reinterpret_cast<RawObject**>(&ptr()->url_);
1033 case Snapshot::kCore: 988 case Snapshot::kCore:
1034 case Snapshot::kAppWithJIT: 989 case Snapshot::kAppWithJIT:
1035 case Snapshot::kScript: 990 case Snapshot::kScript:
1036 return reinterpret_cast<RawObject**>(&ptr()->tokens_); 991 return reinterpret_cast<RawObject**>(&ptr()->tokens_);
1037 case Snapshot::kMessage: 992 case Snapshot::kMessage:
1038 case Snapshot::kNone: 993 case Snapshot::kNone:
(...skipping 19 matching lines...) Expand all
1058 kLoaded, // Library is loaded. 1013 kLoaded, // Library is loaded.
1059 kLoadError, // Error occurred during load of the Library. 1014 kLoadError, // Error occurred during load of the Library.
1060 }; 1015 };
1061 1016
1062 RAW_HEAP_OBJECT_IMPLEMENTATION(Library); 1017 RAW_HEAP_OBJECT_IMPLEMENTATION(Library);
1063 1018
1064 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->name_); } 1019 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->name_); }
1065 RawString* name_; 1020 RawString* name_;
1066 RawString* url_; 1021 RawString* url_;
1067 RawString* private_key_; 1022 RawString* private_key_;
1068 RawArray* dictionary_; // Top-level names in this library. 1023 RawArray* dictionary_; // Top-level names in this library.
1069 RawGrowableObjectArray* metadata_; // Metadata on classes, methods etc. 1024 RawGrowableObjectArray* metadata_; // Metadata on classes, methods etc.
1070 RawClass* toplevel_class_; // Class containing top-level elements. 1025 RawClass* toplevel_class_; // Class containing top-level elements.
1071 RawGrowableObjectArray* patch_classes_; 1026 RawGrowableObjectArray* patch_classes_;
1072 RawArray* imports_; // List of Namespaces imported without prefix. 1027 RawArray* imports_; // List of Namespaces imported without prefix.
1073 RawArray* exports_; // List of re-exported Namespaces. 1028 RawArray* exports_; // List of re-exported Namespaces.
1074 RawInstance* load_error_; // Error iff load_state_ == kLoadError. 1029 RawInstance* load_error_; // Error iff load_state_ == kLoadError.
1075 RawObject** to_snapshot() { 1030 RawObject** to_snapshot() {
1076 return reinterpret_cast<RawObject**>(&ptr()->load_error_); 1031 return reinterpret_cast<RawObject**>(&ptr()->load_error_);
1077 } 1032 }
1078 RawArray* resolved_names_; // Cache of resolved names in library scope. 1033 RawArray* resolved_names_; // Cache of resolved names in library scope.
1079 RawArray* exported_names_; // Cache of exported names by library. 1034 RawArray* exported_names_; // Cache of exported names by library.
1080 RawArray* loaded_scripts_; // Array of scripts loaded in this library. 1035 RawArray* loaded_scripts_; // Array of scripts loaded in this library.
1081 RawObject** to() { 1036 RawObject** to() {
1082 return reinterpret_cast<RawObject**>(&ptr()->loaded_scripts_); 1037 return reinterpret_cast<RawObject**>(&ptr()->loaded_scripts_);
1083 } 1038 }
1084 1039
1085 Dart_NativeEntryResolver native_entry_resolver_; // Resolves natives. 1040 Dart_NativeEntryResolver native_entry_resolver_; // Resolves natives.
1086 Dart_NativeEntrySymbol native_entry_symbol_resolver_; 1041 Dart_NativeEntrySymbol native_entry_symbol_resolver_;
1087 classid_t index_; // Library id number. 1042 classid_t index_; // Library id number.
1088 uint16_t num_imports_; // Number of entries in imports_. 1043 uint16_t num_imports_; // Number of entries in imports_.
1089 int8_t load_state_; // Of type LibraryState. 1044 int8_t load_state_; // Of type LibraryState.
1090 bool corelib_imported_; 1045 bool corelib_imported_;
1091 bool is_dart_scheme_; 1046 bool is_dart_scheme_;
1092 bool debuggable_; // True if debugger can stop in library. 1047 bool debuggable_; // True if debugger can stop in library.
1093 bool is_in_fullsnapshot_; // True if library is in a full snapshot. 1048 bool is_in_fullsnapshot_; // True if library is in a full snapshot.
1094 1049
1095 friend class Class; 1050 friend class Class;
1096 friend class Isolate; 1051 friend class Isolate;
1097 }; 1052 };
1098 1053
1099 1054
1100 class RawNamespace : public RawObject { 1055 class RawNamespace : public RawObject {
1101 RAW_HEAP_OBJECT_IMPLEMENTATION(Namespace); 1056 RAW_HEAP_OBJECT_IMPLEMENTATION(Namespace);
1102 1057
1103 RawObject** from() { 1058 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->library_); }
1104 return reinterpret_cast<RawObject**>(&ptr()->library_); 1059 RawLibrary* library_; // library with name dictionary.
1105 } 1060 RawArray* show_names_; // list of names that are exported.
1106 RawLibrary* library_; // library with name dictionary. 1061 RawArray* hide_names_; // blacklist of names that are not exported.
1107 RawArray* show_names_; // list of names that are exported. 1062 RawField* metadata_field_; // remembers the token pos of metadata if any,
1108 RawArray* hide_names_; // blacklist of names that are not exported. 1063 // and the metadata values if computed.
1109 RawField* metadata_field_; // remembers the token pos of metadata if any,
1110 // and the metadata values if computed.
1111 RawObject** to() { 1064 RawObject** to() {
1112 return reinterpret_cast<RawObject**>(&ptr()->metadata_field_); 1065 return reinterpret_cast<RawObject**>(&ptr()->metadata_field_);
1113 } 1066 }
1114 }; 1067 };
1115 1068
1116 1069
1117 class RawCode : public RawObject { 1070 class RawCode : public RawObject {
1118 enum InlinedMetadataIndex { 1071 enum InlinedMetadataIndex {
1119 kInlinedIntervalsIndex = 0, 1072 kInlinedIntervalsIndex = 0,
1120 kInlinedIdToFunctionIndex = 1, 1073 kInlinedIdToFunctionIndex = 1,
1121 kInlinedCallerIdMapIndex = 2, 1074 kInlinedCallerIdMapIndex = 2,
1122 kInlinedIdToTokenPosIndex = 3, 1075 kInlinedIdToTokenPosIndex = 3,
1123 kInlinedMetadataSize = 4, 1076 kInlinedMetadataSize = 4,
1124 }; 1077 };
1125 1078
1126 RAW_HEAP_OBJECT_IMPLEMENTATION(Code); 1079 RAW_HEAP_OBJECT_IMPLEMENTATION(Code);
1127 1080
1128 uword entry_point_; // Accessed from generated code. 1081 uword entry_point_; // Accessed from generated code.
1129 uword checked_entry_point_; // Accessed from generated code (AOT only). 1082 uword checked_entry_point_; // Accessed from generated code (AOT only).
1130 1083
1131 RawObject** from() { 1084 RawObject** from() {
1132 return reinterpret_cast<RawObject**>(&ptr()->object_pool_); 1085 return reinterpret_cast<RawObject**>(&ptr()->object_pool_);
1133 } 1086 }
1134 RawObjectPool* object_pool_; // Accessed from generated code. 1087 RawObjectPool* object_pool_; // Accessed from generated code.
1135 RawInstructions* instructions_; // Accessed from generated code. 1088 RawInstructions* instructions_; // Accessed from generated code.
1136 // If owner_ is Function::null() the owner is a regular stub. 1089 // If owner_ is Function::null() the owner is a regular stub.
1137 // If owner_ is a Class the owner is the allocation stub for that class. 1090 // If owner_ is a Class the owner is the allocation stub for that class.
1138 // Else, owner_ is a regular Dart Function. 1091 // Else, owner_ is a regular Dart Function.
1139 RawObject* owner_; // Function, Null, or a Class. 1092 RawObject* owner_; // Function, Null, or a Class.
1140 RawExceptionHandlers* exception_handlers_; 1093 RawExceptionHandlers* exception_handlers_;
1141 RawPcDescriptors* pc_descriptors_; 1094 RawPcDescriptors* pc_descriptors_;
1142 RawArray* stackmaps_; 1095 RawArray* stackmaps_;
1143 NOT_IN_PRECOMPILED(RawInstructions* active_instructions_); 1096 NOT_IN_PRECOMPILED(RawInstructions* active_instructions_);
1144 NOT_IN_PRECOMPILED(RawArray* deopt_info_array_); 1097 NOT_IN_PRECOMPILED(RawArray* deopt_info_array_);
(...skipping 23 matching lines...) Expand all
1168 // Alive: If true, the embedded object pointers will be visited during GC. 1121 // Alive: If true, the embedded object pointers will be visited during GC.
1169 int32_t state_bits_; 1122 int32_t state_bits_;
1170 1123
1171 // Variable length data follows here. 1124 // Variable length data follows here.
1172 int32_t* data() { OPEN_ARRAY_START(int32_t, int32_t); } 1125 int32_t* data() { OPEN_ARRAY_START(int32_t, int32_t); }
1173 const int32_t* data() const { OPEN_ARRAY_START(int32_t, int32_t); } 1126 const int32_t* data() const { OPEN_ARRAY_START(int32_t, int32_t); }
1174 1127
1175 static bool ContainsPC(RawObject* raw_obj, uword pc); 1128 static bool ContainsPC(RawObject* raw_obj, uword pc);
1176 1129
1177 friend class Function; 1130 friend class Function;
1178 template<bool> friend class MarkingVisitorBase; 1131 template <bool>
1132 friend class MarkingVisitorBase;
1179 friend class SkippedCodeFunctions; 1133 friend class SkippedCodeFunctions;
1180 friend class StackFrame; 1134 friend class StackFrame;
1181 friend class Profiler; 1135 friend class Profiler;
1182 friend class FunctionDeserializationCluster; 1136 friend class FunctionDeserializationCluster;
1183 }; 1137 };
1184 1138
1185 1139
1186 class RawObjectPool : public RawObject { 1140 class RawObjectPool : public RawObject {
1187 RAW_HEAP_OBJECT_IMPLEMENTATION(ObjectPool); 1141 RAW_HEAP_OBJECT_IMPLEMENTATION(ObjectPool);
1188 1142
(...skipping 25 matching lines...) Expand all
1214 1168
1215 // Private helper function used while visiting stack frames. The 1169 // Private helper function used while visiting stack frames. The
1216 // code which iterates over dart frames is also called during GC and 1170 // code which iterates over dart frames is also called during GC and
1217 // is not allowed to create handles. 1171 // is not allowed to create handles.
1218 static bool ContainsPC(RawInstructions* raw_instr, uword pc); 1172 static bool ContainsPC(RawInstructions* raw_instr, uword pc);
1219 1173
1220 friend class RawCode; 1174 friend class RawCode;
1221 friend class RawFunction; 1175 friend class RawFunction;
1222 friend class Code; 1176 friend class Code;
1223 friend class StackFrame; 1177 friend class StackFrame;
1224 template<bool> friend class MarkingVisitorBase; 1178 template <bool>
1179 friend class MarkingVisitorBase;
1225 friend class SkippedCodeFunctions; 1180 friend class SkippedCodeFunctions;
1226 friend class Function; 1181 friend class Function;
1227 friend class InstructionsReader; 1182 friend class InstructionsReader;
1228 friend class InstructionsWriter; 1183 friend class InstructionsWriter;
1229 }; 1184 };
1230 1185
1231 1186
1232 class RawPcDescriptors : public RawObject { 1187 class RawPcDescriptors : public RawObject {
1233 public: 1188 public:
1234 enum Kind { 1189 enum Kind {
1235 kDeopt = 1, // Deoptimization continuation point. 1190 kDeopt = 1, // Deoptimization continuation point.
1236 kIcCall = kDeopt << 1, // IC call. 1191 kIcCall = kDeopt << 1, // IC call.
1237 kUnoptStaticCall = kIcCall << 1, // Call to a known target via stub. 1192 kUnoptStaticCall = kIcCall << 1, // Call to a known target via stub.
1238 kRuntimeCall = kUnoptStaticCall << 1, // Runtime call. 1193 kRuntimeCall = kUnoptStaticCall << 1, // Runtime call.
1239 kOsrEntry = kRuntimeCall << 1, // OSR entry point in unopt. code. 1194 kOsrEntry = kRuntimeCall << 1, // OSR entry point in unopt. code.
1240 kOther = kOsrEntry << 1, 1195 kOther = kOsrEntry << 1,
1241 kLastKind = kOther, 1196 kLastKind = kOther,
1242 kAnyKind = -1 1197 kAnyKind = -1
1243 }; 1198 };
1244 1199
1245 class MergedKindTry { 1200 class MergedKindTry {
1246 public: 1201 public:
1247 // Most of the time try_index will be small and merged field will fit into 1202 // Most of the time try_index will be small and merged field will fit into
1248 // one byte. 1203 // one byte.
1249 static intptr_t Encode(intptr_t kind, intptr_t try_index) { 1204 static intptr_t Encode(intptr_t kind, intptr_t try_index) {
1250 intptr_t kind_shift = Utils::ShiftForPowerOfTwo(kind); 1205 intptr_t kind_shift = Utils::ShiftForPowerOfTwo(kind);
1251 ASSERT(Utils::IsUint(kKindShiftSize, kind_shift)); 1206 ASSERT(Utils::IsUint(kKindShiftSize, kind_shift));
1252 ASSERT(Utils::IsInt(kTryIndexSize, try_index)); 1207 ASSERT(Utils::IsInt(kTryIndexSize, try_index));
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
1308 // 1263 //
1309 // The bit map representation is optimized for dense and small bit maps, without 1264 // The bit map representation is optimized for dense and small bit maps, without
1310 // any upper bound. 1265 // any upper bound.
1311 class RawStackmap : public RawObject { 1266 class RawStackmap : public RawObject {
1312 RAW_HEAP_OBJECT_IMPLEMENTATION(Stackmap); 1267 RAW_HEAP_OBJECT_IMPLEMENTATION(Stackmap);
1313 1268
1314 // Regarding changing this to a bitfield: ARM64 requires register_bit_count_ 1269 // Regarding changing this to a bitfield: ARM64 requires register_bit_count_
1315 // to be as large as 96, meaning 7 bits, leaving 25 bits for the length, or 1270 // to be as large as 96, meaning 7 bits, leaving 25 bits for the length, or
1316 // as large as ~33 million entries. If that is sufficient, then these two 1271 // as large as ~33 million entries. If that is sufficient, then these two
1317 // fields can be merged into a BitField. 1272 // fields can be merged into a BitField.
1318 int32_t length_; // Length of payload, in bits. 1273 int32_t length_; // Length of payload, in bits.
1319 int32_t slow_path_bit_count_; // Slow path live values, included in length_. 1274 int32_t slow_path_bit_count_; // Slow path live values, included in length_.
1320 1275
1321 // Offset from code entry point corresponding to this stack map 1276 // Offset from code entry point corresponding to this stack map
1322 // representation. 1277 // representation.
1323 uint32_t pc_offset_; 1278 uint32_t pc_offset_;
1324 1279
1325 // Variable length data follows here (bitmap of the stack layout). 1280 // Variable length data follows here (bitmap of the stack layout).
1326 uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); } 1281 uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); }
1327 const uint8_t* data() const { OPEN_ARRAY_START(uint8_t, uint8_t); } 1282 const uint8_t* data() const { OPEN_ARRAY_START(uint8_t, uint8_t); }
1328 }; 1283 };
(...skipping 14 matching lines...) Expand all
1343 kIndexPos = kKindPos + kKindSize, 1298 kIndexPos = kKindPos + kKindSize,
1344 // Since there are 24 bits for the stack slot index, Functions can have 1299 // Since there are 24 bits for the stack slot index, Functions can have
1345 // only ~16.7 million stack slots. 1300 // only ~16.7 million stack slots.
1346 kPayloadSize = sizeof(int32_t) * kBitsPerByte, 1301 kPayloadSize = sizeof(int32_t) * kBitsPerByte,
1347 kIndexSize = kPayloadSize - kIndexPos, 1302 kIndexSize = kPayloadSize - kIndexPos,
1348 kIndexBias = 1 << (kIndexSize - 1), 1303 kIndexBias = 1 << (kIndexSize - 1),
1349 kMaxIndex = (1 << (kIndexSize - 1)) - 1, 1304 kMaxIndex = (1 << (kIndexSize - 1)) - 1,
1350 }; 1305 };
1351 1306
1352 class IndexBits : public BitField<int32_t, int32_t, kIndexPos, kIndexSize> {}; 1307 class IndexBits : public BitField<int32_t, int32_t, kIndexPos, kIndexSize> {};
1353 class KindBits : public BitField<int32_t, int8_t, kKindPos, kKindSize>{}; 1308 class KindBits : public BitField<int32_t, int8_t, kKindPos, kKindSize> {};
1354 1309
1355 struct VarInfo { 1310 struct VarInfo {
1356 int32_t index_kind; // Bitfield for slot index on stack or in context, 1311 int32_t index_kind; // Bitfield for slot index on stack or in context,
1357 // and Entry kind of type VarInfoKind. 1312 // and Entry kind of type VarInfoKind.
1358 TokenPosition declaration_pos; // Token position of declaration. 1313 TokenPosition declaration_pos; // Token position of declaration.
1359 TokenPosition begin_pos; // Token position of scope start. 1314 TokenPosition begin_pos; // Token position of scope start.
1360 TokenPosition end_pos; // Token position of scope end. 1315 TokenPosition end_pos; // Token position of scope end.
1361 int16_t scope_id; // Scope to which the variable belongs. 1316 int16_t scope_id; // Scope to which the variable belongs.
1362 1317
1363 VarInfoKind kind() const { 1318 VarInfoKind kind() const {
1364 return static_cast<VarInfoKind>(KindBits::decode(index_kind)); 1319 return static_cast<VarInfoKind>(KindBits::decode(index_kind));
1365 } 1320 }
1366 void set_kind(VarInfoKind kind) { 1321 void set_kind(VarInfoKind kind) {
1367 index_kind = KindBits::update(kind, index_kind); 1322 index_kind = KindBits::update(kind, index_kind);
1368 } 1323 }
1369 int32_t index() const { 1324 int32_t index() const { return IndexBits::decode(index_kind) - kIndexBias; }
1370 return IndexBits::decode(index_kind) - kIndexBias;
1371 }
1372 void set_index(int32_t index) { 1325 void set_index(int32_t index) {
1373 index_kind = IndexBits::update(index + kIndexBias, index_kind); 1326 index_kind = IndexBits::update(index + kIndexBias, index_kind);
1374 } 1327 }
1375 }; 1328 };
1376 1329
1377 private: 1330 private:
1378 RAW_HEAP_OBJECT_IMPLEMENTATION(LocalVarDescriptors); 1331 RAW_HEAP_OBJECT_IMPLEMENTATION(LocalVarDescriptors);
1379 int32_t num_entries_; // Number of descriptors. 1332 int32_t num_entries_; // Number of descriptors.
1380 1333
1381 RawObject** from() { 1334 RawObject** from() {
1382 return reinterpret_cast<RawObject**>(&ptr()->names()[0]); 1335 return reinterpret_cast<RawObject**>(&ptr()->names()[0]);
1383 } 1336 }
1384 RawString** names() { 1337 RawString** names() {
1385 // Array of [num_entries_] variable names. 1338 // Array of [num_entries_] variable names.
1386 OPEN_ARRAY_START(RawString*, RawString*); 1339 OPEN_ARRAY_START(RawString*, RawString*);
1387 } 1340 }
1388 RawString** nameAddrAt(intptr_t i) { 1341 RawString** nameAddrAt(intptr_t i) { return &(ptr()->names()[i]); }
1389 return &(ptr()->names()[i]);
1390 }
1391 1342
1392 RawObject** to(intptr_t num_entries) { 1343 RawObject** to(intptr_t num_entries) {
1393 return reinterpret_cast<RawObject**>(nameAddrAt(num_entries - 1)); 1344 return reinterpret_cast<RawObject**>(nameAddrAt(num_entries - 1));
1394 } 1345 }
1395 1346
1396 // Variable info with [num_entries_] entries. 1347 // Variable info with [num_entries_] entries.
1397 VarInfo* data() { 1348 VarInfo* data() {
1398 return reinterpret_cast<VarInfo*>(nameAddrAt(ptr()->num_entries_)); 1349 return reinterpret_cast<VarInfo*>(nameAddrAt(ptr()->num_entries_));
1399 } 1350 }
1400 1351
1401 friend class Object; 1352 friend class Object;
1402 }; 1353 };
1403 1354
1404 1355
1405 class RawExceptionHandlers : public RawObject { 1356 class RawExceptionHandlers : public RawObject {
1406 public: 1357 public:
1407 // The index into the ExceptionHandlers table corresponds to 1358 // The index into the ExceptionHandlers table corresponds to
1408 // the try_index of the handler. 1359 // the try_index of the handler.
1409 struct HandlerInfo { 1360 struct HandlerInfo {
1410 uint32_t handler_pc_offset; // PC offset value of handler. 1361 uint32_t handler_pc_offset; // PC offset value of handler.
1411 int16_t outer_try_index; // Try block index of enclosing try block. 1362 int16_t outer_try_index; // Try block index of enclosing try block.
1412 int8_t needs_stacktrace; // True if a stacktrace is needed. 1363 int8_t needs_stacktrace; // True if a stacktrace is needed.
1413 int8_t has_catch_all; // Catches all exceptions. 1364 int8_t has_catch_all; // Catches all exceptions.
1414 }; 1365 };
1415 1366
1416 private: 1367 private:
1417 RAW_HEAP_OBJECT_IMPLEMENTATION(ExceptionHandlers); 1368 RAW_HEAP_OBJECT_IMPLEMENTATION(ExceptionHandlers);
1418 1369
1419 // Number of exception handler entries. 1370 // Number of exception handler entries.
1420 int32_t num_entries_; 1371 int32_t num_entries_;
1421 1372
1422 // Array with [num_entries_] entries. Each entry is an array of all handled 1373 // Array with [num_entries_] entries. Each entry is an array of all handled
1423 // exception types. 1374 // exception types.
(...skipping 10 matching lines...) Expand all
1434 class RawContext : public RawObject { 1385 class RawContext : public RawObject {
1435 RAW_HEAP_OBJECT_IMPLEMENTATION(Context); 1386 RAW_HEAP_OBJECT_IMPLEMENTATION(Context);
1436 1387
1437 int32_t num_variables_; 1388 int32_t num_variables_;
1438 1389
1439 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->parent_); } 1390 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->parent_); }
1440 RawContext* parent_; 1391 RawContext* parent_;
1441 1392
1442 // Variable length data follows here. 1393 // Variable length data follows here.
1443 RawObject** data() { OPEN_ARRAY_START(RawObject*, RawObject*); } 1394 RawObject** data() { OPEN_ARRAY_START(RawObject*, RawObject*); }
1444 RawObject* const* data() const { 1395 RawObject* const* data() const { OPEN_ARRAY_START(RawObject*, RawObject*); }
1445 OPEN_ARRAY_START(RawObject*, RawObject*);
1446 }
1447 RawObject** to(intptr_t num_vars) { 1396 RawObject** to(intptr_t num_vars) {
1448 return reinterpret_cast<RawObject**>(&ptr()->data()[num_vars - 1]); 1397 return reinterpret_cast<RawObject**>(&ptr()->data()[num_vars - 1]);
1449 } 1398 }
1450 1399
1451 friend class SnapshotReader; 1400 friend class SnapshotReader;
1452 }; 1401 };
1453 1402
1454 1403
1455 class RawContextScope : public RawObject { 1404 class RawContextScope : public RawObject {
1456 RAW_HEAP_OBJECT_IMPLEMENTATION(ContextScope); 1405 RAW_HEAP_OBJECT_IMPLEMENTATION(ContextScope);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1492 } 1441 }
1493 1442
1494 friend class Object; 1443 friend class Object;
1495 friend class RawClosureData; 1444 friend class RawClosureData;
1496 friend class SnapshotReader; 1445 friend class SnapshotReader;
1497 }; 1446 };
1498 1447
1499 1448
1500 class RawSingleTargetCache : public RawObject { 1449 class RawSingleTargetCache : public RawObject {
1501 RAW_HEAP_OBJECT_IMPLEMENTATION(SingleTargetCache); 1450 RAW_HEAP_OBJECT_IMPLEMENTATION(SingleTargetCache);
1502 RawObject** from() { 1451 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->target_); }
1503 return reinterpret_cast<RawObject**>(&ptr()->target_);
1504 }
1505 RawCode* target_; 1452 RawCode* target_;
1506 RawObject** to() { 1453 RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->target_); }
1507 return reinterpret_cast<RawObject**>(&ptr()->target_);
1508 }
1509 uword entry_point_; 1454 uword entry_point_;
1510 classid_t lower_limit_; 1455 classid_t lower_limit_;
1511 classid_t upper_limit_; 1456 classid_t upper_limit_;
1512 }; 1457 };
1513 1458
1514 1459
1515 class RawUnlinkedCall : public RawObject { 1460 class RawUnlinkedCall : public RawObject {
1516 RAW_HEAP_OBJECT_IMPLEMENTATION(UnlinkedCall); 1461 RAW_HEAP_OBJECT_IMPLEMENTATION(UnlinkedCall);
1517 RawObject** from() { 1462 RawObject** from() {
1518 return reinterpret_cast<RawObject**>(&ptr()->target_name_); 1463 return reinterpret_cast<RawObject**>(&ptr()->target_name_);
1519 } 1464 }
1520 RawString* target_name_; 1465 RawString* target_name_;
1521 RawArray* args_descriptor_; 1466 RawArray* args_descriptor_;
1522 RawObject** to() { 1467 RawObject** to() {
1523 return reinterpret_cast<RawObject**>(&ptr()->args_descriptor_); 1468 return reinterpret_cast<RawObject**>(&ptr()->args_descriptor_);
1524 } 1469 }
1525 }; 1470 };
1526 1471
1527 1472
1528 class RawICData : public RawObject { 1473 class RawICData : public RawObject {
1529 RAW_HEAP_OBJECT_IMPLEMENTATION(ICData); 1474 RAW_HEAP_OBJECT_IMPLEMENTATION(ICData);
1530 1475
1531 RawObject** from() { 1476 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->ic_data_); }
1532 return reinterpret_cast<RawObject**>(&ptr()->ic_data_); 1477 RawArray* ic_data_; // Contains class-ids, target and count.
1533 } 1478 RawString* target_name_; // Name of target function.
1534 RawArray* ic_data_; // Contains class-ids, target and count.
1535 RawString* target_name_; // Name of target function.
1536 RawArray* args_descriptor_; // Arguments descriptor. 1479 RawArray* args_descriptor_; // Arguments descriptor.
1537 RawObject* owner_; // Parent/calling function or original IC of cloned IC. 1480 RawObject* owner_; // Parent/calling function or original IC of cloned IC.
1538 RawObject** to() { 1481 RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->owner_); }
1539 return reinterpret_cast<RawObject**>(&ptr()->owner_);
1540 }
1541 RawObject** to_snapshot(Snapshot::Kind kind) { 1482 RawObject** to_snapshot(Snapshot::Kind kind) {
1542 switch (kind) { 1483 switch (kind) {
1543 case Snapshot::kAppNoJIT: 1484 case Snapshot::kAppNoJIT:
1544 return reinterpret_cast<RawObject**>(&ptr()->args_descriptor_); 1485 return reinterpret_cast<RawObject**>(&ptr()->args_descriptor_);
1545 case Snapshot::kCore: 1486 case Snapshot::kCore:
1546 case Snapshot::kScript: 1487 case Snapshot::kScript:
1547 case Snapshot::kAppWithJIT: 1488 case Snapshot::kAppWithJIT:
1548 return to(); 1489 return to();
1549 case Snapshot::kMessage: 1490 case Snapshot::kMessage:
1550 case Snapshot::kNone: 1491 case Snapshot::kNone:
1551 case Snapshot::kInvalid: 1492 case Snapshot::kInvalid:
1552 break; 1493 break;
1553 } 1494 }
1554 UNREACHABLE(); 1495 UNREACHABLE();
1555 return NULL; 1496 return NULL;
1556 } 1497 }
1557 NOT_IN_PRECOMPILED(int32_t deopt_id_); 1498 NOT_IN_PRECOMPILED(int32_t deopt_id_);
1558 uint32_t state_bits_; // Number of arguments tested in IC, deopt reasons. 1499 uint32_t state_bits_; // Number of arguments tested in IC, deopt reasons.
1559 #if defined(TAG_IC_DATA) 1500 #if defined(TAG_IC_DATA)
1560 intptr_t tag_; // Debugging, verifying that the icdata is assigned to the 1501 intptr_t tag_; // Debugging, verifying that the icdata is assigned to the
1561 // same instruction again. Store -1 or Instruction::Tag. 1502 // same instruction again. Store -1 or Instruction::Tag.
1562 #endif 1503 #endif
1563 }; 1504 };
1564 1505
1565 1506
1566 class RawMegamorphicCache : public RawObject { 1507 class RawMegamorphicCache : public RawObject {
1567 RAW_HEAP_OBJECT_IMPLEMENTATION(MegamorphicCache); 1508 RAW_HEAP_OBJECT_IMPLEMENTATION(MegamorphicCache);
1568 1509
1569 RawObject** from() { 1510 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->buckets_); }
1570 return reinterpret_cast<RawObject**>(&ptr()->buckets_);
1571 }
1572 RawArray* buckets_; 1511 RawArray* buckets_;
1573 RawSmi* mask_; 1512 RawSmi* mask_;
1574 RawString* target_name_; // Name of target function. 1513 RawString* target_name_; // Name of target function.
1575 RawArray* args_descriptor_; // Arguments descriptor. 1514 RawArray* args_descriptor_; // Arguments descriptor.
1576 RawObject** to() { 1515 RawObject** to() {
1577 return reinterpret_cast<RawObject**>(&ptr()->args_descriptor_); 1516 return reinterpret_cast<RawObject**>(&ptr()->args_descriptor_);
1578 } 1517 }
1579 1518
1580 int32_t filled_entry_count_; 1519 int32_t filled_entry_count_;
1581 }; 1520 };
1582 1521
1583 1522
1584 class RawSubtypeTestCache : public RawObject { 1523 class RawSubtypeTestCache : public RawObject {
1585 RAW_HEAP_OBJECT_IMPLEMENTATION(SubtypeTestCache); 1524 RAW_HEAP_OBJECT_IMPLEMENTATION(SubtypeTestCache);
1586 RawArray* cache_; 1525 RawArray* cache_;
1587 }; 1526 };
1588 1527
1589 1528
1590 class RawError : public RawObject { 1529 class RawError : public RawObject {
1591 RAW_HEAP_OBJECT_IMPLEMENTATION(Error); 1530 RAW_HEAP_OBJECT_IMPLEMENTATION(Error);
1592 }; 1531 };
1593 1532
1594 1533
1595 class RawApiError : public RawError { 1534 class RawApiError : public RawError {
1596 RAW_HEAP_OBJECT_IMPLEMENTATION(ApiError); 1535 RAW_HEAP_OBJECT_IMPLEMENTATION(ApiError);
1597 1536
1598 RawObject** from() { 1537 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->message_); }
1599 return reinterpret_cast<RawObject**>(&ptr()->message_);
1600 }
1601 RawString* message_; 1538 RawString* message_;
1602 RawObject** to() { 1539 RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->message_); }
1603 return reinterpret_cast<RawObject**>(&ptr()->message_);
1604 }
1605 }; 1540 };
1606 1541
1607 1542
1608 class RawLanguageError : public RawError { 1543 class RawLanguageError : public RawError {
1609 RAW_HEAP_OBJECT_IMPLEMENTATION(LanguageError); 1544 RAW_HEAP_OBJECT_IMPLEMENTATION(LanguageError);
1610 1545
1611 RawObject** from() { 1546 RawObject** from() {
1612 return reinterpret_cast<RawObject**>(&ptr()->previous_error_); 1547 return reinterpret_cast<RawObject**>(&ptr()->previous_error_);
1613 } 1548 }
1614 RawError* previous_error_; // May be null. 1549 RawError* previous_error_; // May be null.
1615 RawScript* script_; 1550 RawScript* script_;
1616 RawString* message_; 1551 RawString* message_;
1617 RawString* formatted_message_; // Incl. previous error's formatted message. 1552 RawString* formatted_message_; // Incl. previous error's formatted message.
1618 RawObject** to() { 1553 RawObject** to() {
1619 return reinterpret_cast<RawObject**>(&ptr()->formatted_message_); 1554 return reinterpret_cast<RawObject**>(&ptr()->formatted_message_);
1620 } 1555 }
1621 TokenPosition token_pos_; // Source position in script_. 1556 TokenPosition token_pos_; // Source position in script_.
1622 bool report_after_token_; // Report message at or after the token. 1557 bool report_after_token_; // Report message at or after the token.
1623 int8_t kind_; // Of type Report::Kind. 1558 int8_t kind_; // Of type Report::Kind.
1624 }; 1559 };
1625 1560
1626 1561
1627 class RawUnhandledException : public RawError { 1562 class RawUnhandledException : public RawError {
1628 RAW_HEAP_OBJECT_IMPLEMENTATION(UnhandledException); 1563 RAW_HEAP_OBJECT_IMPLEMENTATION(UnhandledException);
1629 1564
1630 RawObject** from() { 1565 RawObject** from() {
1631 return reinterpret_cast<RawObject**>(&ptr()->exception_); 1566 return reinterpret_cast<RawObject**>(&ptr()->exception_);
1632 } 1567 }
1633 RawInstance* exception_; 1568 RawInstance* exception_;
1634 RawInstance* stacktrace_; 1569 RawInstance* stacktrace_;
1635 RawObject** to() { 1570 RawObject** to() {
1636 return reinterpret_cast<RawObject**>(&ptr()->stacktrace_); 1571 return reinterpret_cast<RawObject**>(&ptr()->stacktrace_);
1637 } 1572 }
1638 }; 1573 };
1639 1574
1640 1575
1641 class RawUnwindError : public RawError { 1576 class RawUnwindError : public RawError {
1642 RAW_HEAP_OBJECT_IMPLEMENTATION(UnwindError); 1577 RAW_HEAP_OBJECT_IMPLEMENTATION(UnwindError);
1643 1578
1644 RawObject** from() { 1579 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->message_); }
1645 return reinterpret_cast<RawObject**>(&ptr()->message_);
1646 }
1647 RawString* message_; 1580 RawString* message_;
1648 RawObject** to() { 1581 RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->message_); }
1649 return reinterpret_cast<RawObject**>(&ptr()->message_);
1650 }
1651 bool is_user_initiated_; 1582 bool is_user_initiated_;
1652 bool is_vm_restart_; 1583 bool is_vm_restart_;
1653 }; 1584 };
1654 1585
1655 1586
1656 class RawInstance : public RawObject { 1587 class RawInstance : public RawObject {
1657 RAW_HEAP_OBJECT_IMPLEMENTATION(Instance); 1588 RAW_HEAP_OBJECT_IMPLEMENTATION(Instance);
1658 }; 1589 };
1659 1590
1660 1591
1661 class RawLibraryPrefix : public RawInstance { 1592 class RawLibraryPrefix : public RawInstance {
1662 RAW_HEAP_OBJECT_IMPLEMENTATION(LibraryPrefix); 1593 RAW_HEAP_OBJECT_IMPLEMENTATION(LibraryPrefix);
1663 1594
1664 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->name_); } 1595 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->name_); }
1665 RawString* name_; // Library prefix name. 1596 RawString* name_; // Library prefix name.
1666 RawLibrary* importer_; // Library which declares this prefix. 1597 RawLibrary* importer_; // Library which declares this prefix.
1667 RawArray* imports_; // Libraries imported with this prefix. 1598 RawArray* imports_; // Libraries imported with this prefix.
1668 RawArray* dependent_code_; // Code that refers to deferred, unloaded 1599 RawArray* dependent_code_; // Code that refers to deferred, unloaded
1669 // library prefix. 1600 // library prefix.
1670 RawObject** to() { 1601 RawObject** to() {
1671 return reinterpret_cast<RawObject**>(&ptr()->dependent_code_); 1602 return reinterpret_cast<RawObject**>(&ptr()->dependent_code_);
1672 } 1603 }
1673 RawObject** to_snapshot(Snapshot::Kind kind) { 1604 RawObject** to_snapshot(Snapshot::Kind kind) {
1674 switch (kind) { 1605 switch (kind) {
1675 case Snapshot::kCore: 1606 case Snapshot::kCore:
1676 case Snapshot::kScript: 1607 case Snapshot::kScript:
1677 case Snapshot::kAppWithJIT: 1608 case Snapshot::kAppWithJIT:
1678 return reinterpret_cast<RawObject**>(&ptr()->imports_); 1609 return reinterpret_cast<RawObject**>(&ptr()->imports_);
1679 case Snapshot::kAppNoJIT: 1610 case Snapshot::kAppNoJIT:
1680 return reinterpret_cast<RawObject**>(&ptr()->importer_); 1611 return reinterpret_cast<RawObject**>(&ptr()->importer_);
1681 case Snapshot::kMessage: 1612 case Snapshot::kMessage:
1682 case Snapshot::kNone: 1613 case Snapshot::kNone:
1683 case Snapshot::kInvalid: 1614 case Snapshot::kInvalid:
1684 break; 1615 break;
1685 } 1616 }
1686 UNREACHABLE(); 1617 UNREACHABLE();
1687 return NULL; 1618 return NULL;
1688 } 1619 }
1689 uint16_t num_imports_; // Number of library entries in libraries_. 1620 uint16_t num_imports_; // Number of library entries in libraries_.
1690 bool is_deferred_load_; 1621 bool is_deferred_load_;
1691 bool is_loaded_; 1622 bool is_loaded_;
1692 }; 1623 };
1693 1624
1694 1625
1695 class RawAbstractType : public RawInstance { 1626 class RawAbstractType : public RawInstance {
1696 protected: 1627 protected:
1697 enum TypeState { 1628 enum TypeState {
1698 kAllocated, // Initial state. 1629 kAllocated, // Initial state.
1699 kResolved, // Type class and type arguments resolved. 1630 kResolved, // Type class and type arguments resolved.
1700 kBeingFinalized, // In the process of being finalized. 1631 kBeingFinalized, // In the process of being finalized.
1701 kFinalizedInstantiated, // Instantiated type ready for use. 1632 kFinalizedInstantiated, // Instantiated type ready for use.
1702 kFinalizedUninstantiated, // Uninstantiated type ready for use. 1633 kFinalizedUninstantiated, // Uninstantiated type ready for use.
1703 }; 1634 };
1704 1635
1705 private: 1636 private:
1706 RAW_HEAP_OBJECT_IMPLEMENTATION(AbstractType); 1637 RAW_HEAP_OBJECT_IMPLEMENTATION(AbstractType);
1707 1638
1708 friend class ObjectStore; 1639 friend class ObjectStore;
1709 }; 1640 };
1710 1641
1711 1642
1712 class RawType : public RawAbstractType { 1643 class RawType : public RawAbstractType {
1713 private: 1644 private:
1714 RAW_HEAP_OBJECT_IMPLEMENTATION(Type); 1645 RAW_HEAP_OBJECT_IMPLEMENTATION(Type);
1715 1646
1716 RawObject** from() { 1647 RawObject** from() {
1717 return reinterpret_cast<RawObject**>(&ptr()->type_class_id_); 1648 return reinterpret_cast<RawObject**>(&ptr()->type_class_id_);
1718 } 1649 }
1719 // Either the id of the resolved class as a Smi or an UnresolvedClass. 1650 // Either the id of the resolved class as a Smi or an UnresolvedClass.
1720 RawObject* type_class_id_; 1651 RawObject* type_class_id_;
1721 RawTypeArguments* arguments_; 1652 RawTypeArguments* arguments_;
1722 RawSmi* hash_; 1653 RawSmi* hash_;
1723 // This type object represents a function type if its signature field is a 1654 // This type object represents a function type if its signature field is a
1724 // non-null function object. 1655 // non-null function object.
1725 // If this type is malformed or malbounded, the signature field gets 1656 // If this type is malformed or malbounded, the signature field gets
1726 // overwritten by the error object in order to save space. If the type is a 1657 // overwritten by the error object in order to save space. If the type is a
1727 // function type, its signature is lost, but the message in the error object 1658 // function type, its signature is lost, but the message in the error object
1728 // can describe the issue without needing the signature. 1659 // can describe the issue without needing the signature.
1729 union { 1660 union {
1730 RawFunction* signature_; // If not null, this type is a function type. 1661 RawFunction* signature_; // If not null, this type is a function type.
1731 RawLanguageError* error_; // If not null, type is malformed or malbounded. 1662 RawLanguageError* error_; // If not null, type is malformed or malbounded.
1732 } sig_or_err_; 1663 } sig_or_err_;
1733 RawObject** to() { 1664 RawObject** to() {
1734 return reinterpret_cast<RawObject**>(&ptr()->sig_or_err_.error_); 1665 return reinterpret_cast<RawObject**>(&ptr()->sig_or_err_.error_);
1735 } 1666 }
1736 TokenPosition token_pos_; 1667 TokenPosition token_pos_;
1737 int8_t type_state_; 1668 int8_t type_state_;
1738 1669
1739 friend class CidRewriteVisitor; 1670 friend class CidRewriteVisitor;
1740 }; 1671 };
1741 1672
1742 1673
1743 class RawTypeRef : public RawAbstractType { 1674 class RawTypeRef : public RawAbstractType {
1744 private: 1675 private:
1745 RAW_HEAP_OBJECT_IMPLEMENTATION(TypeRef); 1676 RAW_HEAP_OBJECT_IMPLEMENTATION(TypeRef);
1746 1677
1747 RawObject** from() { 1678 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->type_); }
1748 return reinterpret_cast<RawObject**>(&ptr()->type_);
1749 }
1750 RawAbstractType* type_; // The referenced type. 1679 RawAbstractType* type_; // The referenced type.
1751 RawObject** to() { 1680 RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->type_); }
1752 return reinterpret_cast<RawObject**>(&ptr()->type_);
1753 }
1754 }; 1681 };
1755 1682
1756 1683
1757 class RawTypeParameter : public RawAbstractType { 1684 class RawTypeParameter : public RawAbstractType {
1758 private: 1685 private:
1759 RAW_HEAP_OBJECT_IMPLEMENTATION(TypeParameter); 1686 RAW_HEAP_OBJECT_IMPLEMENTATION(TypeParameter);
1760 1687
1761 RawObject** from() { 1688 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->name_); }
1762 return reinterpret_cast<RawObject**>(&ptr()->name_);
1763 }
1764 RawString* name_; 1689 RawString* name_;
1765 RawSmi* hash_; 1690 RawSmi* hash_;
1766 RawAbstractType* bound_; // ObjectType if no explicit bound specified. 1691 RawAbstractType* bound_; // ObjectType if no explicit bound specified.
1767 RawFunction* parameterized_function_; 1692 RawFunction* parameterized_function_;
1768 RawObject** to() { 1693 RawObject** to() {
1769 return reinterpret_cast<RawObject**>(&ptr()->parameterized_function_); 1694 return reinterpret_cast<RawObject**>(&ptr()->parameterized_function_);
1770 } 1695 }
1771 classid_t parameterized_class_id_; 1696 classid_t parameterized_class_id_;
1772 TokenPosition token_pos_; 1697 TokenPosition token_pos_;
1773 int16_t index_; 1698 int16_t index_;
1774 uint8_t parent_level_; // Max 255 levels of nested generic functions is OK. 1699 uint8_t parent_level_; // Max 255 levels of nested generic functions is OK.
1775 int8_t type_state_; 1700 int8_t type_state_;
1776 1701
1777 friend class CidRewriteVisitor; 1702 friend class CidRewriteVisitor;
1778 }; 1703 };
1779 1704
1780 1705
1781 class RawBoundedType : public RawAbstractType { 1706 class RawBoundedType : public RawAbstractType {
1782 private: 1707 private:
1783 RAW_HEAP_OBJECT_IMPLEMENTATION(BoundedType); 1708 RAW_HEAP_OBJECT_IMPLEMENTATION(BoundedType);
1784 1709
1785 RawObject** from() { 1710 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->type_); }
1786 return reinterpret_cast<RawObject**>(&ptr()->type_);
1787 }
1788 RawAbstractType* type_; 1711 RawAbstractType* type_;
1789 RawAbstractType* bound_; 1712 RawAbstractType* bound_;
1790 RawSmi* hash_; 1713 RawSmi* hash_;
1791 RawTypeParameter* type_parameter_; // For more detailed error reporting. 1714 RawTypeParameter* type_parameter_; // For more detailed error reporting.
1792 RawObject** to() { 1715 RawObject** to() {
1793 return reinterpret_cast<RawObject**>(&ptr()->type_parameter_); 1716 return reinterpret_cast<RawObject**>(&ptr()->type_parameter_);
1794 } 1717 }
1795 }; 1718 };
1796 1719
1797 1720
(...skipping 18 matching lines...) Expand all
1816 RAW_HEAP_OBJECT_IMPLEMENTATION(Closure); 1739 RAW_HEAP_OBJECT_IMPLEMENTATION(Closure);
1817 1740
1818 RawObject** from() { 1741 RawObject** from() {
1819 return reinterpret_cast<RawObject**>(&ptr()->type_arguments_); 1742 return reinterpret_cast<RawObject**>(&ptr()->type_arguments_);
1820 } 1743 }
1821 1744
1822 RawTypeArguments* type_arguments_; 1745 RawTypeArguments* type_arguments_;
1823 RawFunction* function_; 1746 RawFunction* function_;
1824 RawContext* context_; 1747 RawContext* context_;
1825 1748
1826 RawObject** to() { 1749 RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->context_); }
1827 return reinterpret_cast<RawObject**>(&ptr()->context_);
1828 }
1829 }; 1750 };
1830 1751
1831 1752
1832 class RawNumber : public RawInstance { 1753 class RawNumber : public RawInstance {
1833 RAW_OBJECT_IMPLEMENTATION(Number); 1754 RAW_OBJECT_IMPLEMENTATION(Number);
1834 }; 1755 };
1835 1756
1836 1757
1837 class RawInteger : public RawNumber { 1758 class RawInteger : public RawNumber {
1838 RAW_OBJECT_IMPLEMENTATION(Integer); 1759 RAW_OBJECT_IMPLEMENTATION(Integer);
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
1908 1829
1909 // Variable length data follows here. 1830 // Variable length data follows here.
1910 uint16_t* data() { OPEN_ARRAY_START(uint16_t, uint16_t); } 1831 uint16_t* data() { OPEN_ARRAY_START(uint16_t, uint16_t); }
1911 const uint16_t* data() const { OPEN_ARRAY_START(uint16_t, uint16_t); } 1832 const uint16_t* data() const { OPEN_ARRAY_START(uint16_t, uint16_t); }
1912 1833
1913 friend class SnapshotReader; 1834 friend class SnapshotReader;
1914 friend class RODataSerializationCluster; 1835 friend class RODataSerializationCluster;
1915 }; 1836 };
1916 1837
1917 1838
1918 template<typename T> 1839 template <typename T>
1919 class ExternalStringData { 1840 class ExternalStringData {
1920 public: 1841 public:
1921 ExternalStringData(const T* data, void* peer, Dart_PeerFinalizer callback) : 1842 ExternalStringData(const T* data, void* peer, Dart_PeerFinalizer callback)
1922 data_(data), peer_(peer), callback_(callback) { 1843 : data_(data), peer_(peer), callback_(callback) {}
1923 }
1924 ~ExternalStringData() { 1844 ~ExternalStringData() {
1925 if (callback_ != NULL) (*callback_)(peer_); 1845 if (callback_ != NULL) (*callback_)(peer_);
1926 } 1846 }
1927 1847
1928 const T* data() { 1848 const T* data() { return data_; }
1929 return data_; 1849 void* peer() { return peer_; }
1930 }
1931 void* peer() {
1932 return peer_;
1933 }
1934 1850
1935 static intptr_t data_offset() { 1851 static intptr_t data_offset() {
1936 return OFFSET_OF(ExternalStringData<T>, data_); 1852 return OFFSET_OF(ExternalStringData<T>, data_);
1937 } 1853 }
1938 1854
1939 private: 1855 private:
1940 const T* data_; 1856 const T* data_;
1941 void* peer_; 1857 void* peer_;
1942 Dart_PeerFinalizer callback_; 1858 Dart_PeerFinalizer callback_;
1943 }; 1859 };
1944 1860
1945 1861
1946 class RawExternalOneByteString : public RawString { 1862 class RawExternalOneByteString : public RawString {
1947 RAW_HEAP_OBJECT_IMPLEMENTATION(ExternalOneByteString); 1863 RAW_HEAP_OBJECT_IMPLEMENTATION(ExternalOneByteString);
1864
1948 public: 1865 public:
1949 typedef ExternalStringData<uint8_t> ExternalData; 1866 typedef ExternalStringData<uint8_t> ExternalData;
1950 1867
1951 private: 1868 private:
1952 ExternalData* external_data_; 1869 ExternalData* external_data_;
1953 friend class Api; 1870 friend class Api;
1954 }; 1871 };
1955 1872
1956 1873
1957 class RawExternalTwoByteString : public RawString { 1874 class RawExternalTwoByteString : public RawString {
1958 RAW_HEAP_OBJECT_IMPLEMENTATION(ExternalTwoByteString); 1875 RAW_HEAP_OBJECT_IMPLEMENTATION(ExternalTwoByteString);
1876
1959 public: 1877 public:
1960 typedef ExternalStringData<uint16_t> ExternalData; 1878 typedef ExternalStringData<uint16_t> ExternalData;
1961 1879
1962 private: 1880 private:
1963 ExternalData* external_data_; 1881 ExternalData* external_data_;
1964 friend class Api; 1882 friend class Api;
1965 }; 1883 };
1966 1884
1967 1885
1968 class RawBool : public RawInstance { 1886 class RawBool : public RawInstance {
(...skipping 21 matching lines...) Expand all
1990 friend class LinkedHashMapSerializationCluster; 1908 friend class LinkedHashMapSerializationCluster;
1991 friend class LinkedHashMapDeserializationCluster; 1909 friend class LinkedHashMapDeserializationCluster;
1992 friend class Deserializer; 1910 friend class Deserializer;
1993 friend class RawCode; 1911 friend class RawCode;
1994 friend class RawImmutableArray; 1912 friend class RawImmutableArray;
1995 friend class SnapshotReader; 1913 friend class SnapshotReader;
1996 friend class GrowableObjectArray; 1914 friend class GrowableObjectArray;
1997 friend class LinkedHashMap; 1915 friend class LinkedHashMap;
1998 friend class RawLinkedHashMap; 1916 friend class RawLinkedHashMap;
1999 friend class Object; 1917 friend class Object;
2000 friend class ICData; // For high performance access. 1918 friend class ICData; // For high performance access.
2001 friend class SubtypeTestCache; // For high performance access. 1919 friend class SubtypeTestCache; // For high performance access.
2002 }; 1920 };
2003 1921
2004 1922
2005 class RawImmutableArray : public RawArray { 1923 class RawImmutableArray : public RawArray {
2006 RAW_HEAP_OBJECT_IMPLEMENTATION(ImmutableArray); 1924 RAW_HEAP_OBJECT_IMPLEMENTATION(ImmutableArray);
2007 1925
2008 friend class SnapshotReader; 1926 friend class SnapshotReader;
2009 }; 1927 };
2010 1928
2011 1929
2012 class RawGrowableObjectArray : public RawInstance { 1930 class RawGrowableObjectArray : public RawInstance {
2013 RAW_HEAP_OBJECT_IMPLEMENTATION(GrowableObjectArray); 1931 RAW_HEAP_OBJECT_IMPLEMENTATION(GrowableObjectArray);
2014 1932
2015 RawObject** from() { 1933 RawObject** from() {
2016 return reinterpret_cast<RawObject**>(&ptr()->type_arguments_); 1934 return reinterpret_cast<RawObject**>(&ptr()->type_arguments_);
2017 } 1935 }
2018 RawTypeArguments* type_arguments_; 1936 RawTypeArguments* type_arguments_;
2019 RawSmi* length_; 1937 RawSmi* length_;
2020 RawArray* data_; 1938 RawArray* data_;
2021 RawObject** to() { 1939 RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->data_); }
2022 return reinterpret_cast<RawObject**>(&ptr()->data_);
2023 }
2024 1940
2025 friend class SnapshotReader; 1941 friend class SnapshotReader;
2026 }; 1942 };
2027 1943
2028 1944
2029 class RawLinkedHashMap : public RawInstance { 1945 class RawLinkedHashMap : public RawInstance {
2030 RAW_HEAP_OBJECT_IMPLEMENTATION(LinkedHashMap); 1946 RAW_HEAP_OBJECT_IMPLEMENTATION(LinkedHashMap);
2031 1947
2032 RawObject** from() { 1948 RawObject** from() {
2033 return reinterpret_cast<RawObject**>(&ptr()->type_arguments_); 1949 return reinterpret_cast<RawObject**>(&ptr()->type_arguments_);
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
2157 2073
2158 2074
2159 class RawReceivePort : public RawInstance { 2075 class RawReceivePort : public RawInstance {
2160 RAW_HEAP_OBJECT_IMPLEMENTATION(ReceivePort); 2076 RAW_HEAP_OBJECT_IMPLEMENTATION(ReceivePort);
2161 2077
2162 RawObject** from() { 2078 RawObject** from() {
2163 return reinterpret_cast<RawObject**>(&ptr()->send_port_); 2079 return reinterpret_cast<RawObject**>(&ptr()->send_port_);
2164 } 2080 }
2165 RawSendPort* send_port_; 2081 RawSendPort* send_port_;
2166 RawInstance* handler_; 2082 RawInstance* handler_;
2167 RawObject** to() { 2083 RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->handler_); }
2168 return reinterpret_cast<RawObject**>(&ptr()->handler_);
2169 }
2170 }; 2084 };
2171 2085
2172 2086
2173 // VM type for capturing stacktraces when exceptions are thrown, 2087 // VM type for capturing stacktraces when exceptions are thrown,
2174 // Currently we don't have any interface that this object is supposed 2088 // Currently we don't have any interface that this object is supposed
2175 // to implement so we just support the 'toString' method which 2089 // to implement so we just support the 'toString' method which
2176 // converts the stack trace into a string. 2090 // converts the stack trace into a string.
2177 class RawStacktrace : public RawInstance { 2091 class RawStacktrace : public RawInstance {
2178 RAW_HEAP_OBJECT_IMPLEMENTATION(Stacktrace); 2092 RAW_HEAP_OBJECT_IMPLEMENTATION(Stacktrace);
2179 2093
2180 RawObject** from() { 2094 RawObject** from() {
2181 return reinterpret_cast<RawObject**>(&ptr()->code_array_); 2095 return reinterpret_cast<RawObject**>(&ptr()->code_array_);
2182 } 2096 }
2183 RawArray* code_array_; // Code object for each frame in the stack trace. 2097 RawArray* code_array_; // Code object for each frame in the stack trace.
2184 RawArray* pc_offset_array_; // Offset of PC for each frame. 2098 RawArray* pc_offset_array_; // Offset of PC for each frame.
2185 RawObject** to() { 2099 RawObject** to() {
2186 return reinterpret_cast<RawObject**>(&ptr()->pc_offset_array_); 2100 return reinterpret_cast<RawObject**>(&ptr()->pc_offset_array_);
2187 } 2101 }
2188 // False for pre-allocated stack trace (used in OOM and Stack overflow). 2102 // False for pre-allocated stack trace (used in OOM and Stack overflow).
2189 bool expand_inlined_; 2103 bool expand_inlined_;
2190 }; 2104 };
2191 2105
2192 2106
2193 // VM type for capturing JS regular expressions. 2107 // VM type for capturing JS regular expressions.
(...skipping 20 matching lines...) Expand all
2214 // A bitfield with two fields: 2128 // A bitfield with two fields:
2215 // type: Uninitialized, simple or complex. 2129 // type: Uninitialized, simple or complex.
2216 // flags: Represents global/local, case insensitive, multiline. 2130 // flags: Represents global/local, case insensitive, multiline.
2217 int8_t type_flags_; 2131 int8_t type_flags_;
2218 }; 2132 };
2219 2133
2220 2134
2221 class RawWeakProperty : public RawInstance { 2135 class RawWeakProperty : public RawInstance {
2222 RAW_HEAP_OBJECT_IMPLEMENTATION(WeakProperty); 2136 RAW_HEAP_OBJECT_IMPLEMENTATION(WeakProperty);
2223 2137
2224 RawObject** from() { 2138 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->key_); }
2225 return reinterpret_cast<RawObject**>(&ptr()->key_);
2226 }
2227 RawObject* key_; 2139 RawObject* key_;
2228 RawObject* value_; 2140 RawObject* value_;
2229 RawObject** to() { 2141 RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->value_); }
2230 return reinterpret_cast<RawObject**>(&ptr()->value_);
2231 }
2232 2142
2233 // Linked list is chaining all pending weak properties. 2143 // Linked list is chaining all pending weak properties.
2234 // Untyped to make it clear that it is not to be visited by GC. 2144 // Untyped to make it clear that it is not to be visited by GC.
2235 uword next_; 2145 uword next_;
2236 2146
2237 friend class GCMarker; 2147 friend class GCMarker;
2238 template<bool> friend class MarkingVisitorBase; 2148 template <bool>
2149 friend class MarkingVisitorBase;
2239 friend class Scavenger; 2150 friend class Scavenger;
2240 friend class ScavengerVisitor; 2151 friend class ScavengerVisitor;
2241 }; 2152 };
2242 2153
2243 // MirrorReferences are used by mirrors to hold reflectees that are VM 2154 // MirrorReferences are used by mirrors to hold reflectees that are VM
2244 // internal objects, such as libraries, classes, functions or types. 2155 // internal objects, such as libraries, classes, functions or types.
2245 class RawMirrorReference : public RawInstance { 2156 class RawMirrorReference : public RawInstance {
2246 RAW_HEAP_OBJECT_IMPLEMENTATION(MirrorReference); 2157 RAW_HEAP_OBJECT_IMPLEMENTATION(MirrorReference);
2247 2158
2248 RawObject** from() { 2159 RawObject** from() {
2249 return reinterpret_cast<RawObject**>(&ptr()->referent_); 2160 return reinterpret_cast<RawObject**>(&ptr()->referent_);
2250 } 2161 }
2251 RawObject* referent_; 2162 RawObject* referent_;
2252 RawObject** to() { 2163 RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->referent_); }
2253 return reinterpret_cast<RawObject**>(&ptr()->referent_);
2254 }
2255 }; 2164 };
2256 2165
2257 2166
2258 // UserTag are used by the profiler to track Dart script state. 2167 // UserTag are used by the profiler to track Dart script state.
2259 class RawUserTag : public RawInstance { 2168 class RawUserTag : public RawInstance {
2260 RAW_HEAP_OBJECT_IMPLEMENTATION(UserTag); 2169 RAW_HEAP_OBJECT_IMPLEMENTATION(UserTag);
2261 2170
2262 RawObject** from() { 2171 RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->label_); }
2263 return reinterpret_cast<RawObject**>(&ptr()->label_);
2264 }
2265 2172
2266 RawString* label_; 2173 RawString* label_;
2267 2174
2268 RawObject** to() { 2175 RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->label_); }
2269 return reinterpret_cast<RawObject**>(&ptr()->label_);
2270 }
2271 2176
2272 // Isolate unique tag. 2177 // Isolate unique tag.
2273 uword tag_; 2178 uword tag_;
2274 2179
2275 friend class SnapshotReader; 2180 friend class SnapshotReader;
2276 friend class Object; 2181 friend class Object;
2277 2182
2278 public: 2183 public:
2279 uword tag() const { return tag_; } 2184 uword tag() const { return tag_; }
2280 }; 2185 };
2281 2186
2282 // Class Id predicates. 2187 // Class Id predicates.
2283 2188
2284 inline bool RawObject::IsErrorClassId(intptr_t index) { 2189 inline bool RawObject::IsErrorClassId(intptr_t index) {
2285 // Make sure this function is updated when new Error types are added. 2190 // Make sure this function is updated when new Error types are added.
2286 COMPILE_ASSERT(kApiErrorCid == kErrorCid + 1 && 2191 COMPILE_ASSERT(
2287 kLanguageErrorCid == kErrorCid + 2 && 2192 kApiErrorCid == kErrorCid + 1 && kLanguageErrorCid == kErrorCid + 2 &&
2288 kUnhandledExceptionCid == kErrorCid + 3 && 2193 kUnhandledExceptionCid == kErrorCid + 3 &&
2289 kUnwindErrorCid == kErrorCid + 4 && 2194 kUnwindErrorCid == kErrorCid + 4 && kInstanceCid == kErrorCid + 5);
2290 kInstanceCid == kErrorCid + 5);
2291 return (index >= kErrorCid && index < kInstanceCid); 2195 return (index >= kErrorCid && index < kInstanceCid);
2292 } 2196 }
2293 2197
2294 2198
2295 inline bool RawObject::IsNumberClassId(intptr_t index) { 2199 inline bool RawObject::IsNumberClassId(intptr_t index) {
2296 // Make sure this function is updated when new Number types are added. 2200 // Make sure this function is updated when new Number types are added.
2297 COMPILE_ASSERT(kIntegerCid == kNumberCid + 1 && 2201 COMPILE_ASSERT(kIntegerCid == kNumberCid + 1 && kSmiCid == kNumberCid + 2 &&
2298 kSmiCid == kNumberCid + 2 && 2202 kMintCid == kNumberCid + 3 && kBigintCid == kNumberCid + 4 &&
2299 kMintCid == kNumberCid + 3 &&
2300 kBigintCid == kNumberCid + 4 &&
2301 kDoubleCid == kNumberCid + 5); 2203 kDoubleCid == kNumberCid + 5);
2302 return (index >= kNumberCid && index < kBoolCid); 2204 return (index >= kNumberCid && index < kBoolCid);
2303 } 2205 }
2304 2206
2305 2207
2306 inline bool RawObject::IsIntegerClassId(intptr_t index) { 2208 inline bool RawObject::IsIntegerClassId(intptr_t index) {
2307 // Make sure this function is updated when new Integer types are added. 2209 // Make sure this function is updated when new Integer types are added.
2308 COMPILE_ASSERT(kSmiCid == kIntegerCid + 1 && 2210 COMPILE_ASSERT(kSmiCid == kIntegerCid + 1 && kMintCid == kIntegerCid + 2 &&
2309 kMintCid == kIntegerCid + 2 &&
2310 kBigintCid == kIntegerCid + 3 && 2211 kBigintCid == kIntegerCid + 3 &&
2311 kDoubleCid == kIntegerCid + 4); 2212 kDoubleCid == kIntegerCid + 4);
2312 return (index >= kIntegerCid && index < kDoubleCid); 2213 return (index >= kIntegerCid && index < kDoubleCid);
2313 } 2214 }
2314 2215
2315 2216
2316 inline bool RawObject::IsStringClassId(intptr_t index) { 2217 inline bool RawObject::IsStringClassId(intptr_t index) {
2317 // Make sure this function is updated when new StringCid types are added. 2218 // Make sure this function is updated when new StringCid types are added.
2318 COMPILE_ASSERT(kOneByteStringCid == kStringCid + 1 && 2219 COMPILE_ASSERT(kOneByteStringCid == kStringCid + 1 &&
2319 kTwoByteStringCid == kStringCid + 2 && 2220 kTwoByteStringCid == kStringCid + 2 &&
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
2351 kExternalTwoByteStringCid == kStringCid + 4); 2252 kExternalTwoByteStringCid == kStringCid + 4);
2352 return (index == kExternalOneByteStringCid || 2253 return (index == kExternalOneByteStringCid ||
2353 index == kExternalTwoByteStringCid); 2254 index == kExternalTwoByteStringCid);
2354 } 2255 }
2355 2256
2356 2257
2357 inline bool RawObject::IsBuiltinListClassId(intptr_t index) { 2258 inline bool RawObject::IsBuiltinListClassId(intptr_t index) {
2358 // Make sure this function is updated when new builtin List types are added. 2259 // Make sure this function is updated when new builtin List types are added.
2359 COMPILE_ASSERT(kImmutableArrayCid == kArrayCid + 1); 2260 COMPILE_ASSERT(kImmutableArrayCid == kArrayCid + 1);
2360 return ((index >= kArrayCid && index <= kImmutableArrayCid) || 2261 return ((index >= kArrayCid && index <= kImmutableArrayCid) ||
2361 (index == kGrowableObjectArrayCid) || 2262 (index == kGrowableObjectArrayCid) || IsTypedDataClassId(index) ||
2362 IsTypedDataClassId(index) || 2263 IsTypedDataViewClassId(index) || IsExternalTypedDataClassId(index) ||
2363 IsTypedDataViewClassId(index) ||
2364 IsExternalTypedDataClassId(index) ||
2365 (index == kByteBufferCid)); 2264 (index == kByteBufferCid));
2366 } 2265 }
2367 2266
2368 2267
2369 inline bool RawObject::IsTypedDataClassId(intptr_t index) { 2268 inline bool RawObject::IsTypedDataClassId(intptr_t index) {
2370 // Make sure this is updated when new TypedData types are added. 2269 // Make sure this is updated when new TypedData types are added.
2371 COMPILE_ASSERT(kTypedDataUint8ArrayCid == kTypedDataInt8ArrayCid + 1 && 2270 COMPILE_ASSERT(kTypedDataUint8ArrayCid == kTypedDataInt8ArrayCid + 1 &&
2372 kTypedDataUint8ClampedArrayCid == kTypedDataInt8ArrayCid + 2 && 2271 kTypedDataUint8ClampedArrayCid == kTypedDataInt8ArrayCid + 2 &&
2373 kTypedDataInt16ArrayCid == kTypedDataInt8ArrayCid + 3 && 2272 kTypedDataInt16ArrayCid == kTypedDataInt8ArrayCid + 3 &&
2374 kTypedDataUint16ArrayCid == kTypedDataInt8ArrayCid + 4 && 2273 kTypedDataUint16ArrayCid == kTypedDataInt8ArrayCid + 4 &&
(...skipping 23 matching lines...) Expand all
2398 kTypedDataUint32ArrayViewCid == kTypedDataInt8ArrayViewCid + 6 && 2297 kTypedDataUint32ArrayViewCid == kTypedDataInt8ArrayViewCid + 6 &&
2399 kTypedDataInt64ArrayViewCid == kTypedDataInt8ArrayViewCid + 7 && 2298 kTypedDataInt64ArrayViewCid == kTypedDataInt8ArrayViewCid + 7 &&
2400 kTypedDataUint64ArrayViewCid == kTypedDataInt8ArrayViewCid + 8 && 2299 kTypedDataUint64ArrayViewCid == kTypedDataInt8ArrayViewCid + 8 &&
2401 kTypedDataFloat32ArrayViewCid == kTypedDataInt8ArrayViewCid + 9 && 2300 kTypedDataFloat32ArrayViewCid == kTypedDataInt8ArrayViewCid + 9 &&
2402 kTypedDataFloat64ArrayViewCid == kTypedDataInt8ArrayViewCid + 10 && 2301 kTypedDataFloat64ArrayViewCid == kTypedDataInt8ArrayViewCid + 10 &&
2403 kTypedDataFloat32x4ArrayViewCid == kTypedDataInt8ArrayViewCid + 11 && 2302 kTypedDataFloat32x4ArrayViewCid == kTypedDataInt8ArrayViewCid + 11 &&
2404 kTypedDataInt32x4ArrayViewCid == kTypedDataInt8ArrayViewCid + 12 && 2303 kTypedDataInt32x4ArrayViewCid == kTypedDataInt8ArrayViewCid + 12 &&
2405 kTypedDataFloat64x2ArrayViewCid == kTypedDataInt8ArrayViewCid + 13 && 2304 kTypedDataFloat64x2ArrayViewCid == kTypedDataInt8ArrayViewCid + 13 &&
2406 kByteDataViewCid == kTypedDataInt8ArrayViewCid + 14 && 2305 kByteDataViewCid == kTypedDataInt8ArrayViewCid + 14 &&
2407 kExternalTypedDataInt8ArrayCid == kTypedDataInt8ArrayViewCid + 15); 2306 kExternalTypedDataInt8ArrayCid == kTypedDataInt8ArrayViewCid + 15);
2408 return (index >= kTypedDataInt8ArrayViewCid && 2307 return (index >= kTypedDataInt8ArrayViewCid && index <= kByteDataViewCid);
2409 index <= kByteDataViewCid);
2410 } 2308 }
2411 2309
2412 2310
2413 inline bool RawObject::IsExternalTypedDataClassId(intptr_t index) { 2311 inline bool RawObject::IsExternalTypedDataClassId(intptr_t index) {
2414 // Make sure this is updated when new ExternalTypedData types are added. 2312 // Make sure this is updated when new ExternalTypedData types are added.
2415 COMPILE_ASSERT( 2313 COMPILE_ASSERT(
2416 (kExternalTypedDataUint8ArrayCid == 2314 (kExternalTypedDataUint8ArrayCid == kExternalTypedDataInt8ArrayCid + 1) &&
2417 kExternalTypedDataInt8ArrayCid + 1) &&
2418 (kExternalTypedDataUint8ClampedArrayCid == 2315 (kExternalTypedDataUint8ClampedArrayCid ==
2419 kExternalTypedDataInt8ArrayCid + 2) && 2316 kExternalTypedDataInt8ArrayCid + 2) &&
2420 (kExternalTypedDataInt16ArrayCid == 2317 (kExternalTypedDataInt16ArrayCid == kExternalTypedDataInt8ArrayCid + 3) &&
2421 kExternalTypedDataInt8ArrayCid + 3) &&
2422 (kExternalTypedDataUint16ArrayCid == 2318 (kExternalTypedDataUint16ArrayCid ==
2423 kExternalTypedDataInt8ArrayCid + 4) && 2319 kExternalTypedDataInt8ArrayCid + 4) &&
2424 (kExternalTypedDataInt32ArrayCid == 2320 (kExternalTypedDataInt32ArrayCid == kExternalTypedDataInt8ArrayCid + 5) &&
2425 kExternalTypedDataInt8ArrayCid + 5) &&
2426 (kExternalTypedDataUint32ArrayCid == 2321 (kExternalTypedDataUint32ArrayCid ==
2427 kExternalTypedDataInt8ArrayCid + 6) && 2322 kExternalTypedDataInt8ArrayCid + 6) &&
2428 (kExternalTypedDataInt64ArrayCid == 2323 (kExternalTypedDataInt64ArrayCid == kExternalTypedDataInt8ArrayCid + 7) &&
2429 kExternalTypedDataInt8ArrayCid + 7) &&
2430 (kExternalTypedDataUint64ArrayCid == 2324 (kExternalTypedDataUint64ArrayCid ==
2431 kExternalTypedDataInt8ArrayCid + 8) && 2325 kExternalTypedDataInt8ArrayCid + 8) &&
2432 (kExternalTypedDataFloat32ArrayCid == 2326 (kExternalTypedDataFloat32ArrayCid ==
2433 kExternalTypedDataInt8ArrayCid + 9) && 2327 kExternalTypedDataInt8ArrayCid + 9) &&
2434 (kExternalTypedDataFloat64ArrayCid == 2328 (kExternalTypedDataFloat64ArrayCid ==
2435 kExternalTypedDataInt8ArrayCid + 10) && 2329 kExternalTypedDataInt8ArrayCid + 10) &&
2436 (kExternalTypedDataFloat32x4ArrayCid == 2330 (kExternalTypedDataFloat32x4ArrayCid ==
2437 kExternalTypedDataInt8ArrayCid + 11) && 2331 kExternalTypedDataInt8ArrayCid + 11) &&
2438 (kExternalTypedDataInt32x4ArrayCid == 2332 (kExternalTypedDataInt32x4ArrayCid ==
2439 kExternalTypedDataInt8ArrayCid + 12) && 2333 kExternalTypedDataInt8ArrayCid + 12) &&
2440 (kExternalTypedDataFloat64x2ArrayCid == 2334 (kExternalTypedDataFloat64x2ArrayCid ==
2441 kExternalTypedDataInt8ArrayCid + 13) && 2335 kExternalTypedDataInt8ArrayCid + 13) &&
2442 (kByteBufferCid == kExternalTypedDataInt8ArrayCid + 14)); 2336 (kByteBufferCid == kExternalTypedDataInt8ArrayCid + 14));
2443 return (index >= kExternalTypedDataInt8ArrayCid && 2337 return (index >= kExternalTypedDataInt8ArrayCid &&
2444 index <= kExternalTypedDataFloat64x2ArrayCid); 2338 index <= kExternalTypedDataFloat64x2ArrayCid);
2445 } 2339 }
2446 2340
2447 2341
2448 inline bool RawObject::IsInternalVMdefinedClassId(intptr_t index) { 2342 inline bool RawObject::IsInternalVMdefinedClassId(intptr_t index) {
2449 return ((index < kNumPredefinedCids) && 2343 return ((index < kNumPredefinedCids) &&
2450 !RawObject::IsImplicitFieldClassId(index)); 2344 !RawObject::IsImplicitFieldClassId(index));
2451 } 2345 }
2452 2346
2453 2347
2454 inline bool RawObject::IsVariableSizeClassId(intptr_t index) { 2348 inline bool RawObject::IsVariableSizeClassId(intptr_t index) {
2455 return (index == kArrayCid) || 2349 return (index == kArrayCid) || (index == kImmutableArrayCid) ||
2456 (index == kImmutableArrayCid) ||
2457 RawObject::IsOneByteStringClassId(index) || 2350 RawObject::IsOneByteStringClassId(index) ||
2458 RawObject::IsTwoByteStringClassId(index) || 2351 RawObject::IsTwoByteStringClassId(index) ||
2459 RawObject::IsTypedDataClassId(index) || 2352 RawObject::IsTypedDataClassId(index) || (index == kContextCid) ||
2460 (index == kContextCid) || 2353 (index == kTypeArgumentsCid) || (index == kInstructionsCid) ||
2461 (index == kTypeArgumentsCid) || 2354 (index == kObjectPoolCid) || (index == kPcDescriptorsCid) ||
2462 (index == kInstructionsCid) || 2355 (index == kCodeSourceMapCid) || (index == kStackmapCid) ||
2463 (index == kObjectPoolCid) ||
2464 (index == kPcDescriptorsCid) ||
2465 (index == kCodeSourceMapCid) ||
2466 (index == kStackmapCid) ||
2467 (index == kLocalVarDescriptorsCid) || 2356 (index == kLocalVarDescriptorsCid) ||
2468 (index == kExceptionHandlersCid) || 2357 (index == kExceptionHandlersCid) || (index == kCodeCid) ||
2469 (index == kCodeCid) || 2358 (index == kContextScopeCid) || (index == kInstanceCid) ||
2470 (index == kContextScopeCid) ||
2471 (index == kInstanceCid) ||
2472 (index == kRegExpCid); 2359 (index == kRegExpCid);
2473 } 2360 }
2474 2361
2475 2362
2476 // This is a set of classes that are not Dart classes whose representation 2363 // This is a set of classes that are not Dart classes whose representation
2477 // is defined by the VM but are used in the VM code by computing the 2364 // is defined by the VM but are used in the VM code by computing the
2478 // implicit field offsets of the various fields in the dart object. 2365 // implicit field offsets of the various fields in the dart object.
2479 inline bool RawObject::IsImplicitFieldClassId(intptr_t index) { 2366 inline bool RawObject::IsImplicitFieldClassId(intptr_t index) {
2480 return (IsTypedDataViewClassId(index) || index == kByteBufferCid); 2367 return (IsTypedDataViewClassId(index) || index == kByteBufferCid);
2481 } 2368 }
2482 2369
2483 2370
2484 inline intptr_t RawObject::NumberOfTypedDataClasses() { 2371 inline intptr_t RawObject::NumberOfTypedDataClasses() {
2485 // Make sure this is updated when new TypedData types are added. 2372 // Make sure this is updated when new TypedData types are added.
2486 COMPILE_ASSERT(kTypedDataInt8ArrayViewCid == kTypedDataInt8ArrayCid + 14); 2373 COMPILE_ASSERT(kTypedDataInt8ArrayViewCid == kTypedDataInt8ArrayCid + 14);
2487 COMPILE_ASSERT(kExternalTypedDataInt8ArrayCid == 2374 COMPILE_ASSERT(kExternalTypedDataInt8ArrayCid ==
2488 kTypedDataInt8ArrayViewCid + 15); 2375 kTypedDataInt8ArrayViewCid + 15);
2489 COMPILE_ASSERT(kByteBufferCid == kExternalTypedDataInt8ArrayCid + 14); 2376 COMPILE_ASSERT(kByteBufferCid == kExternalTypedDataInt8ArrayCid + 14);
2490 COMPILE_ASSERT(kNullCid == kByteBufferCid + 1); 2377 COMPILE_ASSERT(kNullCid == kByteBufferCid + 1);
2491 return (kNullCid - kTypedDataInt8ArrayCid); 2378 return (kNullCid - kTypedDataInt8ArrayCid);
2492 } 2379 }
2493 2380
2494 } // namespace dart 2381 } // namespace dart
2495 2382
2496 #endif // RUNTIME_VM_RAW_OBJECT_H_ 2383 #endif // RUNTIME_VM_RAW_OBJECT_H_
OLDNEW
« no previous file with comments | « runtime/vm/random.h ('k') | runtime/vm/raw_object.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698