| Index: src/objects-inl.h
|
| diff --git a/src/objects-inl.h b/src/objects-inl.h
|
| index 5ee91913251c81f4833f9230afc419b59f7db384..f7cbb34cb1827baa96f5e72fef0d5f47075d41e0 100644
|
| --- a/src/objects-inl.h
|
| +++ b/src/objects-inl.h
|
| @@ -1949,22 +1949,66 @@ void PropertyCell::set_type_raw(Object* val, WriteBarrierMode ignored) {
|
| }
|
|
|
|
|
| -Object* WeakCell::value() const { return READ_FIELD(this, kValueOffset); }
|
| +static const intptr_t kReadBarrierTag = 2;
|
| +static const intptr_t kReadBarrierMask = 2;
|
| +
|
| +
|
| +inline bool HasReadBarrierTag(Object* value) {
|
| + DCHECK(!HAS_SMI_TAG(value));
|
| + return (reinterpret_cast<intptr_t>(value) & kReadBarrierMask) ==
|
| + kReadBarrierTag;
|
| +}
|
| +
|
| +
|
| +inline Object* ReadBarrierTag(Object* value) {
|
| + DCHECK(!HAS_SMI_TAG(value));
|
| + intptr_t tagged = reinterpret_cast<intptr_t>(value) | kReadBarrierTag;
|
| + return reinterpret_cast<Object*>(tagged);
|
| +}
|
| +
|
| +
|
| +inline Object* ReadBarrierUntag(Object* value) {
|
| + DCHECK(!HAS_SMI_TAG(value));
|
| + intptr_t untagged = reinterpret_cast<intptr_t>(value) & kReadBarrierTag;
|
| + return reinterpret_cast<Object*>(untagged);
|
| +}
|
| +
|
| +
|
| +Object* WeakCell::value() {
|
| + Object* pointer = READ_FIELD(this, kValueOffsetDontForgetTheReadBarrier);
|
| + if (pointer != Smi::FromInt(0) && HasReadBarrierTag(pointer)) {
|
| + pointer = ReadBarrierUntag(pointer);
|
| + WRITE_FIELD(this, kValueOffsetDontForgetTheReadBarrier, pointer);
|
| + }
|
| +
|
| + return pointer;
|
| +}
|
| +
|
| +
|
| +Object* WeakCell::ValueNoReadBarrier() {
|
| + Object* pointer = READ_FIELD(this, kValueOffsetDontForgetTheReadBarrier);
|
| + if (pointer == Smi::FromInt(0)) return pointer;
|
| + DCHECK(!pointer->IsSmi());
|
| + return ReadBarrierUntag(pointer);
|
| +}
|
|
|
|
|
| void WeakCell::clear() {
|
| DCHECK(GetHeap()->gc_state() == Heap::MARK_COMPACT);
|
| - WRITE_FIELD(this, kValueOffset, Smi::FromInt(0));
|
| + WRITE_FIELD(this, kValueOffsetDontForgetTheReadBarrier, Smi::FromInt(0));
|
| }
|
|
|
|
|
| void WeakCell::initialize(HeapObject* val) {
|
| - WRITE_FIELD(this, kValueOffset, val);
|
| - WRITE_BARRIER(GetHeap(), this, kValueOffset, val);
|
| + WRITE_FIELD(this, kValueOffsetDontForgetTheReadBarrier, val);
|
| + WRITE_BARRIER(GetHeap(), this, kValueOffsetDontForgetTheReadBarrier, val);
|
| }
|
|
|
|
|
| -bool WeakCell::cleared() const { return value() == Smi::FromInt(0); }
|
| +bool WeakCell::cleared() const {
|
| + Object* pointer = READ_FIELD(this, kValueOffsetDontForgetTheReadBarrier);
|
| + return pointer == Smi::FromInt(0);
|
| +}
|
|
|
|
|
| Object* WeakCell::next() const { return READ_FIELD(this, kNextOffset); }
|
|
|