| 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/globals.h" | 9 #include "vm/globals.h" |
| 10 #include "vm/token.h" | 10 #include "vm/token.h" |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 82 V(ExternalInt16Array) \ | 82 V(ExternalInt16Array) \ |
| 83 V(ExternalUint16Array) \ | 83 V(ExternalUint16Array) \ |
| 84 V(ExternalInt32Array) \ | 84 V(ExternalInt32Array) \ |
| 85 V(ExternalUint32Array) \ | 85 V(ExternalUint32Array) \ |
| 86 V(ExternalInt64Array) \ | 86 V(ExternalInt64Array) \ |
| 87 V(ExternalUint64Array) \ | 87 V(ExternalUint64Array) \ |
| 88 V(ExternalFloat32Array) \ | 88 V(ExternalFloat32Array) \ |
| 89 V(ExternalFloat64Array) \ | 89 V(ExternalFloat64Array) \ |
| 90 V(Stacktrace) \ | 90 V(Stacktrace) \ |
| 91 V(JSRegExp) \ | 91 V(JSRegExp) \ |
| 92 V(WeakProperty) \ |
| 92 V(Closure) \ | 93 V(Closure) \ |
| 93 | 94 |
| 94 #define CLASS_LIST(V) \ | 95 #define CLASS_LIST(V) \ |
| 95 V(Object) \ | 96 V(Object) \ |
| 96 CLASS_LIST_NO_OBJECT(V) | 97 CLASS_LIST_NO_OBJECT(V) |
| 97 | 98 |
| 98 | 99 |
| 99 // Forward declarations. | 100 // Forward declarations. |
| 100 class Isolate; | 101 class Isolate; |
| 101 #define DEFINE_FORWARD_DECLARATION(clazz) \ | 102 #define DEFINE_FORWARD_DECLARATION(clazz) \ |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 183 // be dereferenced (e.g. RawSmi). | 184 // be dereferenced (e.g. RawSmi). |
| 184 class RawObject { | 185 class RawObject { |
| 185 public: | 186 public: |
| 186 // The tags field which is a part of the object header uses the following | 187 // The tags field which is a part of the object header uses the following |
| 187 // bit fields for storing tags. | 188 // bit fields for storing tags. |
| 188 enum TagBits { | 189 enum TagBits { |
| 189 kFreeBit = 0, | 190 kFreeBit = 0, |
| 190 kMarkBit = 1, | 191 kMarkBit = 1, |
| 191 kCanonicalBit = 2, | 192 kCanonicalBit = 2, |
| 192 kFromSnapshotBit = 3, | 193 kFromSnapshotBit = 3, |
| 193 kReservedTagBit = 4, // kReservedBit{10K,100K,1M,10M} | 194 kWatchedBit = 4, |
| 194 kReservedTagSize = 4, | 195 kReservedTagBit = 5, // kReservedBit{10K,100K,1M,10M} |
| 196 kReservedTagSize = 3, |
| 195 kSizeTagBit = 8, | 197 kSizeTagBit = 8, |
| 196 kSizeTagSize = 8, | 198 kSizeTagSize = 8, |
| 197 kClassIdTagBit = kSizeTagBit + kSizeTagSize, | 199 kClassIdTagBit = kSizeTagBit + kSizeTagSize, |
| 198 kClassIdTagSize = 16 | 200 kClassIdTagSize = 16 |
| 199 }; | 201 }; |
| 200 | 202 |
| 201 // Encodes the object size in the tag in units of object alignment. | 203 // Encodes the object size in the tag in units of object alignment. |
| 202 class SizeTag { | 204 class SizeTag { |
| 203 public: | 205 public: |
| 204 static const intptr_t kMaxSizeTag = | 206 static const intptr_t kMaxSizeTag = |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 255 ASSERT(!IsMarked()); | 257 ASSERT(!IsMarked()); |
| 256 uword tags = ptr()->tags_; | 258 uword tags = ptr()->tags_; |
| 257 ptr()->tags_ = MarkBit::update(true, tags); | 259 ptr()->tags_ = MarkBit::update(true, tags); |
| 258 } | 260 } |
| 259 void ClearMarkBit() { | 261 void ClearMarkBit() { |
| 260 ASSERT(IsMarked()); | 262 ASSERT(IsMarked()); |
| 261 uword tags = ptr()->tags_; | 263 uword tags = ptr()->tags_; |
| 262 ptr()->tags_ = MarkBit::update(false, tags); | 264 ptr()->tags_ = MarkBit::update(false, tags); |
| 263 } | 265 } |
| 264 | 266 |
| 267 // Support for GC watched bit. |
| 268 bool IsWatched() const { |
| 269 return WatchedBit::decode(ptr()->tags_); |
| 270 } |
| 271 void SetWatchedBit() { |
| 272 ASSERT(!IsWatched()); |
| 273 uword tags = ptr()->tags_; |
| 274 ptr()->tags_ = WatchedBit::update(true, tags); |
| 275 } |
| 276 void ClearWatchedBit() { |
| 277 ASSERT(IsWatched()); |
| 278 uword tags = ptr()->tags_; |
| 279 ptr()->tags_ = WatchedBit::update(false, tags); |
| 280 } |
| 281 |
| 265 // Support for object tags. | 282 // Support for object tags. |
| 266 bool IsCanonical() const { | 283 bool IsCanonical() const { |
| 267 return CanonicalObjectTag::decode(ptr()->tags_); | 284 return CanonicalObjectTag::decode(ptr()->tags_); |
| 268 } | 285 } |
| 269 void SetCanonical() { | 286 void SetCanonical() { |
| 270 uword tags = ptr()->tags_; | 287 uword tags = ptr()->tags_; |
| 271 ptr()->tags_ = CanonicalObjectTag::update(true, tags); | 288 ptr()->tags_ = CanonicalObjectTag::update(true, tags); |
| 272 } | 289 } |
| 273 bool IsCreatedFromSnapshot() const { | 290 bool IsCreatedFromSnapshot() const { |
| 274 return CreatedFromSnapshotTag::decode(ptr()->tags_); | 291 return CreatedFromSnapshotTag::decode(ptr()->tags_); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 324 static bool IsByteArrayClassId(intptr_t index); | 341 static bool IsByteArrayClassId(intptr_t index); |
| 325 | 342 |
| 326 protected: | 343 protected: |
| 327 uword tags_; // Various object tags (bits). | 344 uword tags_; // Various object tags (bits). |
| 328 | 345 |
| 329 private: | 346 private: |
| 330 class FreeBit : public BitField<bool, kFreeBit, 1> {}; | 347 class FreeBit : public BitField<bool, kFreeBit, 1> {}; |
| 331 | 348 |
| 332 class MarkBit : public BitField<bool, kMarkBit, 1> {}; | 349 class MarkBit : public BitField<bool, kMarkBit, 1> {}; |
| 333 | 350 |
| 351 class WatchedBit : public BitField<bool, kWatchedBit, 1> {}; |
| 352 |
| 334 class CanonicalObjectTag : public BitField<bool, kCanonicalBit, 1> {}; | 353 class CanonicalObjectTag : public BitField<bool, kCanonicalBit, 1> {}; |
| 335 | 354 |
| 336 class CreatedFromSnapshotTag : public BitField<bool, kFromSnapshotBit, 1> {}; | 355 class CreatedFromSnapshotTag : public BitField<bool, kFromSnapshotBit, 1> {}; |
| 337 | 356 |
| 338 class ReservedBits : public BitField<intptr_t, | 357 class ReservedBits : public BitField<intptr_t, |
| 339 kReservedTagBit, | 358 kReservedTagBit, |
| 340 kReservedTagSize> {}; // NOLINT | 359 kReservedTagSize> {}; // NOLINT |
| 341 | 360 |
| 342 RawObject* ptr() const { | 361 RawObject* ptr() const { |
| 343 ASSERT(IsHeapObject()); | 362 ASSERT(IsHeapObject()); |
| 344 return reinterpret_cast<RawObject*>( | 363 return reinterpret_cast<RawObject*>( |
| 345 reinterpret_cast<uword>(this) - kHeapObjectTag); | 364 reinterpret_cast<uword>(this) - kHeapObjectTag); |
| 346 } | 365 } |
| 347 | 366 |
| 348 intptr_t SizeFromClass() const; | 367 intptr_t SizeFromClass() const; |
| 349 | 368 |
| 350 intptr_t GetClassId() const { | 369 intptr_t GetClassId() const { |
| 351 uword tags = ptr()->tags_; | 370 uword tags = ptr()->tags_; |
| 352 return ClassIdTag::decode(tags); | 371 return ClassIdTag::decode(tags); |
| 353 } | 372 } |
| 354 | 373 |
| 355 friend class Api; | 374 friend class Api; |
| 356 friend class Array; | 375 friend class Array; |
| 357 friend class FreeListElement; | 376 friend class FreeListElement; |
| 377 friend class GCMarker; |
| 358 friend class Heap; | 378 friend class Heap; |
| 359 friend class HeapProfiler; | 379 friend class HeapProfiler; |
| 360 friend class HeapProfilerRootVisitor; | 380 friend class HeapProfilerRootVisitor; |
| 361 friend class MarkingVisitor; | 381 friend class MarkingVisitor; |
| 362 friend class Object; | 382 friend class Object; |
| 363 friend class RawInstructions; | 383 friend class RawInstructions; |
| 364 friend class RawInstance; | 384 friend class RawInstance; |
| 385 friend class Scavenger; |
| 365 friend class SnapshotReader; | 386 friend class SnapshotReader; |
| 366 friend class SnapshotWriter; | 387 friend class SnapshotWriter; |
| 367 | 388 |
| 368 DISALLOW_ALLOCATION(); | 389 DISALLOW_ALLOCATION(); |
| 369 DISALLOW_IMPLICIT_CONSTRUCTORS(RawObject); | 390 DISALLOW_IMPLICIT_CONSTRUCTORS(RawObject); |
| 370 }; | 391 }; |
| 371 | 392 |
| 372 | 393 |
| 373 class RawClass : public RawObject { | 394 class RawClass : public RawObject { |
| 374 public: | 395 public: |
| (...skipping 1050 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1425 return reinterpret_cast<RawObject**>(&ptr()->pattern_); | 1446 return reinterpret_cast<RawObject**>(&ptr()->pattern_); |
| 1426 } | 1447 } |
| 1427 | 1448 |
| 1428 intptr_t type_; // Uninitialized, simple or complex. | 1449 intptr_t type_; // Uninitialized, simple or complex. |
| 1429 intptr_t flags_; // Represents global/local, case insensitive, multiline. | 1450 intptr_t flags_; // Represents global/local, case insensitive, multiline. |
| 1430 | 1451 |
| 1431 // Variable length data follows here. | 1452 // Variable length data follows here. |
| 1432 uint8_t data_[0]; | 1453 uint8_t data_[0]; |
| 1433 }; | 1454 }; |
| 1434 | 1455 |
| 1456 class RawWeakProperty : public RawInstance { |
| 1457 RAW_HEAP_OBJECT_IMPLEMENTATION(WeakProperty); |
| 1458 |
| 1459 RawObject** from() { |
| 1460 return reinterpret_cast<RawObject**>(&ptr()->key_); |
| 1461 } |
| 1462 RawObject* key_; |
| 1463 RawObject* value_; |
| 1464 RawObject** to() { |
| 1465 return reinterpret_cast<RawObject**>(&ptr()->value_); |
| 1466 } |
| 1467 |
| 1468 friend class GCMarker; |
| 1469 friend class MarkingVisitor; |
| 1470 friend class Scavenger; |
| 1471 friend class ScavengerVisitor; |
| 1472 }; |
| 1473 |
| 1435 // Class Id predicates. | 1474 // Class Id predicates. |
| 1436 | 1475 |
| 1437 inline bool RawObject::IsErrorClassId(intptr_t index) { | 1476 inline bool RawObject::IsErrorClassId(intptr_t index) { |
| 1438 // Make sure this function is updated when new Error types are added. | 1477 // Make sure this function is updated when new Error types are added. |
| 1439 ASSERT(kApiErrorCid == kErrorCid + 1 && | 1478 ASSERT(kApiErrorCid == kErrorCid + 1 && |
| 1440 kLanguageErrorCid == kErrorCid + 2 && | 1479 kLanguageErrorCid == kErrorCid + 2 && |
| 1441 kUnhandledExceptionCid == kErrorCid + 3 && | 1480 kUnhandledExceptionCid == kErrorCid + 3 && |
| 1442 kUnwindErrorCid == kErrorCid + 4 && | 1481 kUnwindErrorCid == kErrorCid + 4 && |
| 1443 kInstanceCid == kErrorCid + 5); | 1482 kInstanceCid == kErrorCid + 5); |
| 1444 return (index >= kErrorCid && index < kInstanceCid); | 1483 return (index >= kErrorCid && index < kInstanceCid); |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1548 kExternalUint64ArrayCid == kByteArrayCid + 18 && | 1587 kExternalUint64ArrayCid == kByteArrayCid + 18 && |
| 1549 kExternalFloat32ArrayCid == kByteArrayCid + 19 && | 1588 kExternalFloat32ArrayCid == kByteArrayCid + 19 && |
| 1550 kExternalFloat64ArrayCid == kByteArrayCid + 20 && | 1589 kExternalFloat64ArrayCid == kByteArrayCid + 20 && |
| 1551 kStacktraceCid == kByteArrayCid + 21); | 1590 kStacktraceCid == kByteArrayCid + 21); |
| 1552 return (index >= kByteArrayCid && index <= kExternalFloat64ArrayCid); | 1591 return (index >= kByteArrayCid && index <= kExternalFloat64ArrayCid); |
| 1553 } | 1592 } |
| 1554 | 1593 |
| 1555 } // namespace dart | 1594 } // namespace dart |
| 1556 | 1595 |
| 1557 #endif // VM_RAW_OBJECT_H_ | 1596 #endif // VM_RAW_OBJECT_H_ |
| OLD | NEW |