OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #ifndef VM_RAW_OBJECT_H_ | 5 #ifndef VM_RAW_OBJECT_H_ |
6 #define VM_RAW_OBJECT_H_ | 6 #define VM_RAW_OBJECT_H_ |
7 | 7 |
8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
9 #include "vm/atomic.h" | 9 #include "vm/atomic.h" |
10 #include "vm/globals.h" | 10 #include "vm/globals.h" |
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
229 // class_ field not all raw objects are allocated in the heap and thus cannot | 229 // class_ field not all raw objects are allocated in the heap and thus cannot |
230 // be dereferenced (e.g. RawSmi). | 230 // be dereferenced (e.g. RawSmi). |
231 class RawObject { | 231 class RawObject { |
232 public: | 232 public: |
233 // The tags field which is a part of the object header uses the following | 233 // The tags field which is a part of the object header uses the following |
234 // bit fields for storing tags. | 234 // bit fields for storing tags. |
235 enum TagBits { | 235 enum TagBits { |
236 kWatchedBit = 0, | 236 kWatchedBit = 0, |
237 kMarkBit = 1, | 237 kMarkBit = 1, |
238 kCanonicalBit = 2, | 238 kCanonicalBit = 2, |
239 kFromSnapshotBit = 3, | 239 kVMHeapObjectBit = 3, |
240 kRememberedBit = 4, | 240 kRememberedBit = 4, |
241 #if defined(ARCH_IS_32_BIT) | 241 #if defined(ARCH_IS_32_BIT) |
242 kReservedTagPos = 5, // kReservedBit{100K,1M,10M} | 242 kReservedTagPos = 5, // kReservedBit{100K,1M,10M} |
243 kReservedTagSize = 3, | 243 kReservedTagSize = 3, |
244 kSizeTagPos = kReservedTagPos + kReservedTagSize, // = 8 | 244 kSizeTagPos = kReservedTagPos + kReservedTagSize, // = 8 |
245 kSizeTagSize = 8, | 245 kSizeTagSize = 8, |
246 kClassIdTagPos = kSizeTagPos + kSizeTagSize, // = 16 | 246 kClassIdTagPos = kSizeTagPos + kSizeTagSize, // = 16 |
247 kClassIdTagSize = 16, | 247 kClassIdTagSize = 16, |
248 #elif defined(ARCH_IS_64_BIT) | 248 #elif defined(ARCH_IS_64_BIT) |
249 kReservedTagPos = 5, // kReservedBit{100K,1M,10M} | 249 kReservedTagPos = 5, // kReservedBit{100K,1M,10M} |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
308 ASSERT(IsHeapObject()); | 308 ASSERT(IsHeapObject()); |
309 uword addr = reinterpret_cast<uword>(this); | 309 uword addr = reinterpret_cast<uword>(this); |
310 return (addr & kNewObjectAlignmentOffset) == kNewObjectAlignmentOffset; | 310 return (addr & kNewObjectAlignmentOffset) == kNewObjectAlignmentOffset; |
311 } | 311 } |
312 // Assumes this is a heap object. | 312 // Assumes this is a heap object. |
313 bool IsOldObject() const { | 313 bool IsOldObject() const { |
314 ASSERT(IsHeapObject()); | 314 ASSERT(IsHeapObject()); |
315 uword addr = reinterpret_cast<uword>(this); | 315 uword addr = reinterpret_cast<uword>(this); |
316 return (addr & kNewObjectAlignmentOffset) == kOldObjectAlignmentOffset; | 316 return (addr & kNewObjectAlignmentOffset) == kOldObjectAlignmentOffset; |
317 } | 317 } |
318 // Assumes this is a heap object. | |
319 bool IsVMHeapObject() const; | |
320 | 318 |
321 // Like !IsHeapObject() || IsOldObject(), but compiles to a single branch. | 319 // Like !IsHeapObject() || IsOldObject(), but compiles to a single branch. |
322 bool IsSmiOrOldObject() const { | 320 bool IsSmiOrOldObject() const { |
323 ASSERT(IsWellFormed()); | 321 ASSERT(IsWellFormed()); |
324 COMPILE_ASSERT(kHeapObjectTag == 1); | 322 COMPILE_ASSERT(kHeapObjectTag == 1); |
325 COMPILE_ASSERT(kNewObjectAlignmentOffset == kWordSize); | 323 COMPILE_ASSERT(kNewObjectAlignmentOffset == kWordSize); |
326 static const uword kNewObjectBits = | 324 static const uword kNewObjectBits = |
327 (kNewObjectAlignmentOffset | kHeapObjectTag); | 325 (kNewObjectAlignmentOffset | kHeapObjectTag); |
328 const uword addr = reinterpret_cast<uword>(this); | 326 const uword addr = reinterpret_cast<uword>(this); |
329 return (addr & kNewObjectBits) != kNewObjectBits; | 327 return (addr & kNewObjectBits) != kNewObjectBits; |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
365 // Support for object tags. | 363 // Support for object tags. |
366 bool IsCanonical() const { | 364 bool IsCanonical() const { |
367 return CanonicalObjectTag::decode(ptr()->tags_); | 365 return CanonicalObjectTag::decode(ptr()->tags_); |
368 } | 366 } |
369 void SetCanonical() { | 367 void SetCanonical() { |
370 UpdateTagBit<CanonicalObjectTag>(true); | 368 UpdateTagBit<CanonicalObjectTag>(true); |
371 } | 369 } |
372 void ClearCanonical() { | 370 void ClearCanonical() { |
373 UpdateTagBit<CanonicalObjectTag>(false); | 371 UpdateTagBit<CanonicalObjectTag>(false); |
374 } | 372 } |
375 bool IsCreatedFromSnapshot() const { | 373 bool IsVMHeapObject() const { |
376 return CreatedFromSnapshotTag::decode(ptr()->tags_); | 374 return VMHeapObjectTag::decode(ptr()->tags_); |
377 } | 375 } |
378 void SetCreatedFromSnapshot() { | 376 void SetVMHeapObject() { |
379 UpdateTagBit<CreatedFromSnapshotTag>(true); | 377 UpdateTagBit<VMHeapObjectTag>(true); |
380 } | 378 } |
381 | 379 |
382 // Support for GC remembered bit. | 380 // Support for GC remembered bit. |
383 bool IsRemembered() const { | 381 bool IsRemembered() const { |
384 return RememberedBit::decode(ptr()->tags_); | 382 return RememberedBit::decode(ptr()->tags_); |
385 } | 383 } |
386 void SetRememberedBit() { | 384 void SetRememberedBit() { |
387 ASSERT(!IsRemembered()); | 385 ASSERT(!IsRemembered()); |
388 UpdateTagBit<RememberedBit>(true); | 386 UpdateTagBit<RememberedBit>(true); |
389 } | 387 } |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
438 static RawObject* FromAddr(uword addr) { | 436 static RawObject* FromAddr(uword addr) { |
439 // We expect the untagged address here. | 437 // We expect the untagged address here. |
440 ASSERT((addr & kSmiTagMask) != kHeapObjectTag); | 438 ASSERT((addr & kSmiTagMask) != kHeapObjectTag); |
441 return reinterpret_cast<RawObject*>(addr + kHeapObjectTag); | 439 return reinterpret_cast<RawObject*>(addr + kHeapObjectTag); |
442 } | 440 } |
443 | 441 |
444 static uword ToAddr(const RawObject* raw_obj) { | 442 static uword ToAddr(const RawObject* raw_obj) { |
445 return reinterpret_cast<uword>(raw_obj->ptr()); | 443 return reinterpret_cast<uword>(raw_obj->ptr()); |
446 } | 444 } |
447 | 445 |
448 static bool IsCreatedFromSnapshot(intptr_t value) { | 446 static bool IsVMHeapObject(intptr_t value) { |
449 return CreatedFromSnapshotTag::decode(value); | 447 return VMHeapObjectTag::decode(value); |
450 } | 448 } |
451 | 449 |
452 static bool IsCanonical(intptr_t value) { | 450 static bool IsCanonical(intptr_t value) { |
453 return CanonicalObjectTag::decode(value); | 451 return CanonicalObjectTag::decode(value); |
454 } | 452 } |
455 | 453 |
456 // Class Id predicates. | 454 // Class Id predicates. |
457 static bool IsErrorClassId(intptr_t index); | 455 static bool IsErrorClassId(intptr_t index); |
458 static bool IsNumberClassId(intptr_t index); | 456 static bool IsNumberClassId(intptr_t index); |
459 static bool IsIntegerClassId(intptr_t index); | 457 static bool IsIntegerClassId(intptr_t index); |
(...skipping 15 matching lines...) Expand all Loading... |
475 uword tags_; // Various object tags (bits). | 473 uword tags_; // Various object tags (bits). |
476 | 474 |
477 class WatchedBit : public BitField<bool, kWatchedBit, 1> {}; | 475 class WatchedBit : public BitField<bool, kWatchedBit, 1> {}; |
478 | 476 |
479 class MarkBit : public BitField<bool, kMarkBit, 1> {}; | 477 class MarkBit : public BitField<bool, kMarkBit, 1> {}; |
480 | 478 |
481 class RememberedBit : public BitField<bool, kRememberedBit, 1> {}; | 479 class RememberedBit : public BitField<bool, kRememberedBit, 1> {}; |
482 | 480 |
483 class CanonicalObjectTag : public BitField<bool, kCanonicalBit, 1> {}; | 481 class CanonicalObjectTag : public BitField<bool, kCanonicalBit, 1> {}; |
484 | 482 |
485 class CreatedFromSnapshotTag : public BitField<bool, kFromSnapshotBit, 1> {}; | 483 class VMHeapObjectTag : public BitField<bool, kVMHeapObjectBit, 1> {}; |
486 | 484 |
487 class ReservedBits : public | 485 class ReservedBits : public |
488 BitField<intptr_t, kReservedTagPos, kReservedTagSize> {}; // NOLINT | 486 BitField<intptr_t, kReservedTagPos, kReservedTagSize> {}; // NOLINT |
489 | 487 |
490 // TODO(koda): After handling tags_, return const*, like Object::raw_ptr(). | 488 // TODO(koda): After handling tags_, return const*, like Object::raw_ptr(). |
491 RawObject* ptr() const { | 489 RawObject* ptr() const { |
492 ASSERT(IsHeapObject()); | 490 ASSERT(IsHeapObject()); |
493 return reinterpret_cast<RawObject*>( | 491 return reinterpret_cast<RawObject*>( |
494 reinterpret_cast<uword>(this) - kHeapObjectTag); | 492 reinterpret_cast<uword>(this) - kHeapObjectTag); |
495 } | 493 } |
(...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
943 | 941 |
944 Dart_NativeEntryResolver native_entry_resolver_; // Resolves natives. | 942 Dart_NativeEntryResolver native_entry_resolver_; // Resolves natives. |
945 Dart_NativeEntrySymbol native_entry_symbol_resolver_; | 943 Dart_NativeEntrySymbol native_entry_symbol_resolver_; |
946 classid_t index_; // Library id number. | 944 classid_t index_; // Library id number. |
947 classid_t num_anonymous_; // Number of entries in anonymous_classes_. | 945 classid_t num_anonymous_; // Number of entries in anonymous_classes_. |
948 uint16_t num_imports_; // Number of entries in imports_. | 946 uint16_t num_imports_; // Number of entries in imports_. |
949 int8_t load_state_; // Of type LibraryState. | 947 int8_t load_state_; // Of type LibraryState. |
950 bool corelib_imported_; | 948 bool corelib_imported_; |
951 bool is_dart_scheme_; | 949 bool is_dart_scheme_; |
952 bool debuggable_; // True if debugger can stop in library. | 950 bool debuggable_; // True if debugger can stop in library. |
| 951 bool is_in_fullsnapshot_; // True if library is in a full snapshot. |
953 | 952 |
| 953 friend class Class; |
954 friend class Isolate; | 954 friend class Isolate; |
955 }; | 955 }; |
956 | 956 |
957 | 957 |
958 class RawNamespace : public RawObject { | 958 class RawNamespace : public RawObject { |
959 RAW_HEAP_OBJECT_IMPLEMENTATION(Namespace); | 959 RAW_HEAP_OBJECT_IMPLEMENTATION(Namespace); |
960 | 960 |
961 RawObject** from() { | 961 RawObject** from() { |
962 return reinterpret_cast<RawObject**>(&ptr()->library_); | 962 return reinterpret_cast<RawObject**>(&ptr()->library_); |
963 } | 963 } |
(...skipping 1230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2194 COMPILE_ASSERT(kExternalTypedDataInt8ArrayCid == | 2194 COMPILE_ASSERT(kExternalTypedDataInt8ArrayCid == |
2195 kTypedDataInt8ArrayViewCid + 15); | 2195 kTypedDataInt8ArrayViewCid + 15); |
2196 COMPILE_ASSERT(kByteBufferCid == kExternalTypedDataInt8ArrayCid + 14); | 2196 COMPILE_ASSERT(kByteBufferCid == kExternalTypedDataInt8ArrayCid + 14); |
2197 COMPILE_ASSERT(kNullCid == kByteBufferCid + 1); | 2197 COMPILE_ASSERT(kNullCid == kByteBufferCid + 1); |
2198 return (kNullCid - kTypedDataInt8ArrayCid); | 2198 return (kNullCid - kTypedDataInt8ArrayCid); |
2199 } | 2199 } |
2200 | 2200 |
2201 } // namespace dart | 2201 } // namespace dart |
2202 | 2202 |
2203 #endif // VM_RAW_OBJECT_H_ | 2203 #endif // VM_RAW_OBJECT_H_ |
OLD | NEW |