Index: runtime/vm/raw_object.h |
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h |
index 40d90726467cd8b8fa9f7bd4cc0b0ba499b383cd..ef257734235e7c244b86ce1b4ffe76c194a979a0 100644 |
--- a/runtime/vm/raw_object.h |
+++ b/runtime/vm/raw_object.h |
@@ -89,6 +89,7 @@ namespace dart { |
V(Closure) \ |
V(Stacktrace) \ |
V(JSRegExp) \ |
+ V(WeakProperty) \ |
#define CLASS_LIST(V) \ |
V(Object) \ |
@@ -184,8 +185,9 @@ class RawObject { |
kMarkBit = 1, |
kCanonicalBit = 2, |
kFromSnapshotBit = 3, |
- kReservedTagBit = 4, // kReservedBit{10K,100K,1M,10M} |
- kReservedTagSize = 4, |
+ kWatchedBit = 4, |
Ivan Posva
2012/08/14 00:26:39
I was wondering whether you considered using the k
cshapiro
2012/08/14 04:58:18
This might be strictly true in old space but the u
Ivan Posva
2012/08/14 15:23:36
We can consolidate the bits later, I was under the
|
+ kReservedTagBit = 5, // kReservedBit{10K,100K,1M,10M} |
+ kReservedTagSize = 3, |
kSizeTagBit = 8, |
kSizeTagSize = 8, |
kClassIdTagBit = kSizeTagBit + kSizeTagSize, |
@@ -256,6 +258,21 @@ class RawObject { |
ptr()->tags_ = MarkBit::update(false, tags); |
} |
+ // Support for GC watched bit. |
+ bool IsWatched() const { |
+ return WatchedBit::decode(ptr()->tags_); |
+ } |
+ void SetWatchedBit() { |
+ ASSERT(!IsWatched()); |
+ uword tags = ptr()->tags_; |
+ ptr()->tags_ = WatchedBit::update(true, tags); |
+ } |
+ void ClearWatchedBit() { |
+ ASSERT(IsWatched()); |
+ uword tags = ptr()->tags_; |
+ ptr()->tags_ = WatchedBit::update(false, tags); |
+ } |
+ |
// Support for object tags. |
bool IsCanonical() const { |
return CanonicalObjectTag::decode(ptr()->tags_); |
@@ -325,6 +342,8 @@ class RawObject { |
class MarkBit : public BitField<bool, kMarkBit, 1> {}; |
+ class WatchedBit : public BitField<bool, kWatchedBit, 1> {}; |
+ |
class CanonicalObjectTag : public BitField<bool, kCanonicalBit, 1> {}; |
class CreatedFromSnapshotTag : public BitField<bool, kFromSnapshotBit, 1> {}; |
@@ -351,6 +370,7 @@ class RawObject { |
friend class Api; |
friend class Array; |
friend class FreeListElement; |
+ friend class GCMarker; |
friend class Heap; |
friend class HeapProfiler; |
friend class HeapProfilerRootVisitor; |
@@ -358,6 +378,7 @@ class RawObject { |
friend class Object; |
friend class RawInstructions; |
friend class RawInstance; |
+ friend class Scavenger; |
friend class SnapshotReader; |
friend class SnapshotWriter; |
@@ -1492,6 +1513,28 @@ class RawJSRegExp : public RawInstance { |
uint8_t data_[0]; |
}; |
+ |
+class RawWeakProperty : public RawInstance { |
+ RAW_HEAP_OBJECT_IMPLEMENTATION(WeakProperty); |
+ |
+ RawObject** from() { |
+ return reinterpret_cast<RawObject**>(&ptr()->key_); |
+ } |
+ RawObject* key_; |
+ RawObject* value_; |
+ RawObject** to() { |
+ return reinterpret_cast<RawObject**>(&ptr()->value_); |
+ } |
+ |
+ RawWeakProperty* next_; // This field is owned by the garbage collector. |
turnidge
2012/08/09 18:34:34
Even more, it is only used during garbage collecti
cshapiro
2012/08/14 04:58:18
Yes. Removed.
|
+ |
+ friend class GCMarker; |
+ friend class MarkingVisitor; |
+ friend class Scavenger; |
+ friend class ScavengerVisitor; |
+}; |
+ |
+ |
// ObjectKind predicates. |
inline bool RawObject::IsErrorClassId(intptr_t index) { |