| 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 377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 388 ptr()->tags_ = RememberedBit::update(false, tags); | 388 ptr()->tags_ = RememberedBit::update(false, tags); |
| 389 } | 389 } |
| 390 | 390 |
| 391 bool IsDartInstance() { | 391 bool IsDartInstance() { |
| 392 return (!IsHeapObject() || (GetClassId() >= kInstanceCid)); | 392 return (!IsHeapObject() || (GetClassId() >= kInstanceCid)); |
| 393 } | 393 } |
| 394 bool IsFreeListElement() { | 394 bool IsFreeListElement() { |
| 395 return ((GetClassId() == kFreeListElement)); | 395 return ((GetClassId() == kFreeListElement)); |
| 396 } | 396 } |
| 397 | 397 |
| 398 // Uses the class table of the current isolate, when needed. | |
| 399 intptr_t Size() const { | 398 intptr_t Size() const { |
| 400 uword tags = ptr()->tags_; | 399 uword tags = ptr()->tags_; |
| 401 intptr_t result = SizeTag::decode(tags); | 400 intptr_t result = SizeTag::decode(tags); |
| 402 if (result != 0) { | 401 if (result != 0) { |
| 403 ASSERT(result == SizeFromClass()); | 402 ASSERT(result == SizeFromClass()); |
| 404 return result; | 403 return result; |
| 405 } | 404 } |
| 406 result = SizeFromClass(); | 405 result = SizeFromClass(); |
| 407 ASSERT(result > SizeTag::kMaxSizeTag); | 406 ASSERT(result > SizeTag::kMaxSizeTag); |
| 408 return result; | 407 return result; |
| 409 } | 408 } |
| 410 | 409 |
| 411 // Like above, but avoids Thread/Isolate::Current. | |
| 412 intptr_t Size(const ClassTable* class_table) const { | |
| 413 uword tags = ptr()->tags_; | |
| 414 intptr_t result = SizeTag::decode(tags); | |
| 415 if (result != 0) { | |
| 416 ASSERT(result == SizeFromClass(class_table)); | |
| 417 return result; | |
| 418 } | |
| 419 result = SizeFromClass(class_table); | |
| 420 ASSERT(result > SizeTag::kMaxSizeTag); | |
| 421 return result; | |
| 422 } | |
| 423 | |
| 424 bool Contains(uword addr) const { | 410 bool Contains(uword addr) const { |
| 425 intptr_t this_size = Size(); | 411 intptr_t this_size = Size(); |
| 426 uword this_addr = RawObject::ToAddr(this); | 412 uword this_addr = RawObject::ToAddr(this); |
| 427 return (addr >= this_addr) && (addr < (this_addr + this_size)); | 413 return (addr >= this_addr) && (addr < (this_addr + this_size)); |
| 428 } | 414 } |
| 429 | 415 |
| 430 void Validate(Isolate* isolate) const; | 416 void Validate(Isolate* isolate) const; |
| 431 intptr_t VisitPointers(ObjectPointerVisitor* visitor); | 417 intptr_t VisitPointers(ObjectPointerVisitor* visitor); |
| 432 bool FindObject(FindObjectVisitor* visitor); | 418 bool FindObject(FindObjectVisitor* visitor); |
| 433 | 419 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 484 BitField<intptr_t, kReservedTagPos, kReservedTagSize> {}; // NOLINT | 470 BitField<intptr_t, kReservedTagPos, kReservedTagSize> {}; // NOLINT |
| 485 | 471 |
| 486 // TODO(koda): After handling tags_, return const*, like Object::raw_ptr(). | 472 // TODO(koda): After handling tags_, return const*, like Object::raw_ptr(). |
| 487 RawObject* ptr() const { | 473 RawObject* ptr() const { |
| 488 ASSERT(IsHeapObject()); | 474 ASSERT(IsHeapObject()); |
| 489 return reinterpret_cast<RawObject*>( | 475 return reinterpret_cast<RawObject*>( |
| 490 reinterpret_cast<uword>(this) - kHeapObjectTag); | 476 reinterpret_cast<uword>(this) - kHeapObjectTag); |
| 491 } | 477 } |
| 492 | 478 |
| 493 intptr_t SizeFromClass() const; | 479 intptr_t SizeFromClass() const; |
| 494 intptr_t SizeFromClass(const ClassTable* class_table) const; | |
| 495 | 480 |
| 496 intptr_t GetClassId() const { | 481 intptr_t GetClassId() const { |
| 497 uword tags = ptr()->tags_; | 482 uword tags = ptr()->tags_; |
| 498 return ClassIdTag::decode(tags); | 483 return ClassIdTag::decode(tags); |
| 499 } | 484 } |
| 500 | 485 |
| 501 template<class TagBitField> | 486 template<class TagBitField> |
| 502 void UpdateTagBit(bool value) { | 487 void UpdateTagBit(bool value) { |
| 503 uword tags = ptr()->tags_; | 488 uword tags = ptr()->tags_; |
| 504 uword old_tags; | 489 uword old_tags; |
| (...skipping 1686 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2191 COMPILE_ASSERT(kExternalTypedDataInt8ArrayCid == | 2176 COMPILE_ASSERT(kExternalTypedDataInt8ArrayCid == |
| 2192 kTypedDataInt8ArrayViewCid + 15); | 2177 kTypedDataInt8ArrayViewCid + 15); |
| 2193 COMPILE_ASSERT(kByteBufferCid == kExternalTypedDataInt8ArrayCid + 14); | 2178 COMPILE_ASSERT(kByteBufferCid == kExternalTypedDataInt8ArrayCid + 14); |
| 2194 COMPILE_ASSERT(kNullCid == kByteBufferCid + 1); | 2179 COMPILE_ASSERT(kNullCid == kByteBufferCid + 1); |
| 2195 return (kNullCid - kTypedDataInt8ArrayCid); | 2180 return (kNullCid - kTypedDataInt8ArrayCid); |
| 2196 } | 2181 } |
| 2197 | 2182 |
| 2198 } // namespace dart | 2183 } // namespace dart |
| 2199 | 2184 |
| 2200 #endif // VM_RAW_OBJECT_H_ | 2185 #endif // VM_RAW_OBJECT_H_ |
| OLD | NEW |