Index: tools/clang/blink_gc_plugin/Edge.h |
diff --git a/tools/clang/blink_gc_plugin/Edge.h b/tools/clang/blink_gc_plugin/Edge.h |
index 36ff1e83f9de27b83cf3fd480ffcd2fae35a17ff..d0d521e65c8f160b63efa91e879bb64d97bdff34 100644 |
--- a/tools/clang/blink_gc_plugin/Edge.h |
+++ b/tools/clang/blink_gc_plugin/Edge.h |
@@ -72,8 +72,10 @@ class RecursiveEdgeVisitor : public EdgeVisitor { |
class Edge { |
public: |
enum NeedsTracingOption { kRecursive, kNonRecursive }; |
+ enum LivenessKind { kWeak, kStrong, kRoot }; |
virtual ~Edge() { } |
+ virtual LivenessKind Kind() = 0; |
virtual void Accept(EdgeVisitor*) = 0; |
virtual bool NeedsFinalization() = 0; |
virtual TracingStatus NeedsTracing(NeedsTracingOption) { |
@@ -95,6 +97,7 @@ class Value : public Edge { |
public: |
explicit Value(RecordInfo* value) : value_(value) {}; |
bool IsValue() { return true; } |
+ LivenessKind Kind() { return kStrong; } |
bool NeedsFinalization(); |
TracingStatus NeedsTracing(NeedsTracingOption); |
void Accept(EdgeVisitor* visitor) { visitor->VisitValue(this); } |
@@ -120,6 +123,7 @@ class RawPtr : public PtrEdge { |
public: |
explicit RawPtr(Edge* ptr) : PtrEdge(ptr) { } |
bool IsRawPtr() { return true; } |
+ LivenessKind Kind() { return kWeak; } |
bool NeedsFinalization() { return false; } |
TracingStatus NeedsTracing(NeedsTracingOption) { |
return TracingStatus::Unneeded(); |
@@ -131,6 +135,7 @@ class RefPtr : public PtrEdge { |
public: |
explicit RefPtr(Edge* ptr) : PtrEdge(ptr) { } |
bool IsRefPtr() { return true; } |
+ LivenessKind Kind() { return kStrong; } |
bool NeedsFinalization() { return true; } |
TracingStatus NeedsTracing(NeedsTracingOption) { |
return TracingStatus::Unneeded(); |
@@ -142,6 +147,7 @@ class OwnPtr : public PtrEdge { |
public: |
explicit OwnPtr(Edge* ptr) : PtrEdge(ptr) { } |
bool IsOwnPtr() { return true; } |
+ LivenessKind Kind() { return kStrong; } |
bool NeedsFinalization() { return true; } |
TracingStatus NeedsTracing(NeedsTracingOption) { |
return TracingStatus::Unneeded(); |
@@ -153,6 +159,7 @@ class Member : public PtrEdge { |
public: |
explicit Member(Edge* ptr) : PtrEdge(ptr) { } |
bool IsMember() { return true; } |
+ LivenessKind Kind() { return kStrong; } |
bool NeedsFinalization() { return false; } |
TracingStatus NeedsTracing(NeedsTracingOption) { |
return TracingStatus::Needed(); |
@@ -164,6 +171,7 @@ class WeakMember : public PtrEdge { |
public: |
explicit WeakMember(Edge* ptr) : PtrEdge(ptr) { } |
bool IsWeakMember() { return true; } |
+ LivenessKind Kind() { return kWeak; } |
bool NeedsFinalization() { return false; } |
TracingStatus NeedsTracing(NeedsTracingOption) { |
return TracingStatus::Needed(); |
@@ -175,6 +183,7 @@ class Persistent : public PtrEdge { |
public: |
explicit Persistent(Edge* ptr) : PtrEdge(ptr) { } |
bool IsPersistent() { return true; } |
+ LivenessKind Kind() { return kRoot; } |
bool NeedsFinalization() { return true; } |
TracingStatus NeedsTracing(NeedsTracingOption) { |
return TracingStatus::Unneeded(); |
@@ -196,6 +205,7 @@ class Collection : public Edge { |
} |
} |
bool IsCollection() { return true; } |
+ LivenessKind Kind() { return is_root_ ? kRoot : kStrong; } |
bool on_heap() { return on_heap_; } |
bool is_root() { return is_root_; } |
Members& members() { return members_; } |