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_OBJECT_H_ | 5 #ifndef VM_OBJECT_H_ |
6 #define VM_OBJECT_H_ | 6 #define VM_OBJECT_H_ |
7 | 7 |
8 #include "include/dart_api.h" | 8 #include "include/dart_api.h" |
9 #include "platform/assert.h" | 9 #include "platform/assert.h" |
10 #include "platform/utils.h" | 10 #include "platform/utils.h" |
(...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
433 uword this_addr = RawObject::ToAddr(raw()); | 433 uword this_addr = RawObject::ToAddr(raw()); |
434 return (addr >= this_addr) && (addr < (this_addr + this_size)); | 434 return (addr >= this_addr) && (addr < (this_addr + this_size)); |
435 } | 435 } |
436 | 436 |
437 template<typename type> void StorePointer(type* addr, type value) const { | 437 template<typename type> void StorePointer(type* addr, type value) const { |
438 // Ensure that this object contains the addr. | 438 // Ensure that this object contains the addr. |
439 ASSERT(Contains(reinterpret_cast<uword>(addr))); | 439 ASSERT(Contains(reinterpret_cast<uword>(addr))); |
440 *addr = value; | 440 *addr = value; |
441 // Filter stores based on source and target. | 441 // Filter stores based on source and target. |
442 if (!value->IsHeapObject()) return; | 442 if (!value->IsHeapObject()) return; |
443 if (value->IsNewObject() && raw()->IsOldObject()) { | 443 if (value->IsNewObject() && raw()->IsOldObject() && |
| 444 !raw()->IsRemembered()) { |
| 445 raw()->SetRememberedBit(); |
444 uword ptr = reinterpret_cast<uword>(raw()); | 446 uword ptr = reinterpret_cast<uword>(raw()); |
445 Isolate::Current()->store_buffer()->AddPointer(ptr); | 447 Isolate::Current()->store_buffer()->AddPointer(ptr); |
446 } | 448 } |
447 } | 449 } |
448 | 450 |
449 RawObject* raw_; // The raw object reference. | 451 RawObject* raw_; // The raw object reference. |
450 | 452 |
451 private: | 453 private: |
452 static void InitializeObject(uword address, intptr_t id, intptr_t size); | 454 static void InitializeObject(uword address, intptr_t id, intptr_t size); |
453 | 455 |
(...skipping 4502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4956 intptr_t data_size = data()->Size(); | 4958 intptr_t data_size = data()->Size(); |
4957 uword data_addr = RawObject::ToAddr(data()); | 4959 uword data_addr = RawObject::ToAddr(data()); |
4958 return (addr >= data_addr) && (addr < (data_addr + data_size)); | 4960 return (addr >= data_addr) && (addr < (data_addr + data_size)); |
4959 } | 4961 } |
4960 void DataStorePointer(RawObject** addr, RawObject* value) const { | 4962 void DataStorePointer(RawObject** addr, RawObject* value) const { |
4961 // Ensure that the backing array object contains the addr. | 4963 // Ensure that the backing array object contains the addr. |
4962 ASSERT(DataContains(reinterpret_cast<uword>(addr))); | 4964 ASSERT(DataContains(reinterpret_cast<uword>(addr))); |
4963 *addr = value; | 4965 *addr = value; |
4964 // Filter stores based on source and target. | 4966 // Filter stores based on source and target. |
4965 if (!value->IsHeapObject()) return; | 4967 if (!value->IsHeapObject()) return; |
4966 if (value->IsNewObject() && data()->IsOldObject()) { | 4968 if (value->IsNewObject() && data()->IsOldObject() && |
| 4969 !data()->IsRemembered()) { |
| 4970 data()->SetRememberedBit(); |
4967 uword ptr = reinterpret_cast<uword>(data()); | 4971 uword ptr = reinterpret_cast<uword>(data()); |
4968 Isolate::Current()->store_buffer()->AddPointer(ptr); | 4972 Isolate::Current()->store_buffer()->AddPointer(ptr); |
4969 } | 4973 } |
4970 } | 4974 } |
4971 | 4975 |
4972 static const int kDefaultInitialCapacity = 4; | 4976 static const int kDefaultInitialCapacity = 4; |
4973 | 4977 |
4974 FINAL_HEAP_OBJECT_IMPLEMENTATION(GrowableObjectArray, Instance); | 4978 FINAL_HEAP_OBJECT_IMPLEMENTATION(GrowableObjectArray, Instance); |
4975 friend class Array; | 4979 friend class Array; |
4976 friend class Class; | 4980 friend class Class; |
(...skipping 734 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5711 | 5715 |
5712 | 5716 |
5713 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, | 5717 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, |
5714 intptr_t index) { | 5718 intptr_t index) { |
5715 return array.At((index * kEntryLength) + kTargetFunctionIndex); | 5719 return array.At((index * kEntryLength) + kTargetFunctionIndex); |
5716 } | 5720 } |
5717 | 5721 |
5718 } // namespace dart | 5722 } // namespace dart |
5719 | 5723 |
5720 #endif // VM_OBJECT_H_ | 5724 #endif // VM_OBJECT_H_ |
OLD | NEW |