| Index: vm/object.h
|
| ===================================================================
|
| --- vm/object.h (revision 15744)
|
| +++ vm/object.h (working copy)
|
| @@ -4429,14 +4429,12 @@
|
| void SetAt(intptr_t index, const Object& value) const {
|
| ASSERT(!IsNull());
|
| ASSERT(index < Length());
|
| - const Array& arr = Array::Handle(data());
|
| - arr.SetAt(index, value);
|
| +
|
| + // TODO(iposva): Add storing NoGCScope.
|
| + DataStorePointer(ObjectAddr(index), value.raw());
|
| }
|
|
|
| void Add(const Object& value, Heap::Space space = Heap::kNew) const;
|
| - void Add(Isolate* isolate,
|
| - const Object& value,
|
| - Heap::Space space = Heap::kNew) const;
|
|
|
| void Grow(intptr_t new_capacity, Heap::Space space = Heap::kNew) const;
|
| RawObject* RemoveLast() const;
|
| @@ -4485,6 +4483,22 @@
|
| ASSERT((index >= 0) && (index < Length()));
|
| return &(DataArray()->data()[index]);
|
| }
|
| + bool DataContains(uword addr) const {
|
| + intptr_t data_size = data()->Size();
|
| + uword data_addr = RawObject::ToAddr(data());
|
| + return (addr >= data_addr) && (addr < (data_addr + data_size));
|
| + }
|
| + void DataStorePointer(RawObject** addr, RawObject* value) const {
|
| + // Ensure that the backing array object contains the addr.
|
| + ASSERT(DataContains(reinterpret_cast<uword>(addr)));
|
| + *addr = value;
|
| + // Filter stores based on source and target.
|
| + if (!value->IsHeapObject()) return;
|
| + if (value->IsNewObject() && data()->IsOldObject()) {
|
| + uword ptr = reinterpret_cast<uword>(addr);
|
| + Isolate::Current()->store_buffer()->AddPointer(ptr);
|
| + }
|
| + }
|
|
|
| static const int kDefaultInitialCapacity = 4;
|
|
|
|
|