Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(234)

Unified Diff: src/objects-inl.h

Issue 892843002: Add mistagging-readbarrier to weak cell Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« src/ia32/macro-assembler-ia32.cc ('K') | « src/objects-debug.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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); }
« src/ia32/macro-assembler-ia32.cc ('K') | « src/objects-debug.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698