| 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 79aa409ca1db5cea3c804aeaa8e9f89efe85e6c9..d7af335dc63cb3d1098c9355e120e81c4d85cf68 100644
|
| --- a/tools/clang/blink_gc_plugin/Edge.h
|
| +++ b/tools/clang/blink_gc_plugin/Edge.h
|
| @@ -16,6 +16,7 @@ class RecordInfo;
|
| class Edge;
|
| class Collection;
|
| class CrossThreadPersistent;
|
| +class Iterator;
|
| class Member;
|
| class OwnPtr;
|
| class Persistent;
|
| @@ -39,6 +40,7 @@ class EdgeVisitor {
|
| virtual void VisitPersistent(Persistent*) {}
|
| virtual void VisitCrossThreadPersistent(CrossThreadPersistent*) {}
|
| virtual void VisitCollection(Collection*) {}
|
| + virtual void VisitIterator(Iterator*) {}
|
| };
|
|
|
| // Recursive edge visitor. The traversed path is accessible in context.
|
| @@ -55,6 +57,7 @@ class RecursiveEdgeVisitor : public EdgeVisitor {
|
| void VisitPersistent(Persistent*) override;
|
| void VisitCrossThreadPersistent(CrossThreadPersistent*) override;
|
| void VisitCollection(Collection*) override;
|
| + void VisitIterator(Iterator*) override;
|
|
|
| protected:
|
| typedef std::deque<Edge*> Context;
|
| @@ -74,6 +77,7 @@ class RecursiveEdgeVisitor : public EdgeVisitor {
|
| virtual void AtPersistent(Persistent*);
|
| virtual void AtCrossThreadPersistent(CrossThreadPersistent*);
|
| virtual void AtCollection(Collection*);
|
| + virtual void AtIterator(Iterator*);
|
|
|
| private:
|
| Context context_;
|
| @@ -281,4 +285,30 @@ class Collection : public Edge {
|
| bool is_root_;
|
| };
|
|
|
| +// An iterator edge is a direct edge to some iterator type.
|
| +class Iterator : public Edge {
|
| + public:
|
| + Iterator(RecordInfo* info, bool on_heap, bool is_unsafe)
|
| + : info_(info), on_heap_(on_heap), is_unsafe_(is_unsafe) {}
|
| + ~Iterator() {}
|
| +
|
| + void Accept(EdgeVisitor* visitor) { visitor->VisitIterator(this); }
|
| + LivenessKind Kind() override { return kStrong; }
|
| + bool NeedsFinalization() { return false; }
|
| + TracingStatus NeedsTracing(NeedsTracingOption) {
|
| + if (on_heap_)
|
| + return TracingStatus::Needed();
|
| + return TracingStatus::Unneeded();
|
| + }
|
| +
|
| + RecordInfo* info() const { return info_; }
|
| +
|
| + bool IsUnsafe() const { return is_unsafe_; }
|
| +
|
| + private:
|
| + RecordInfo* info_;
|
| + bool on_heap_;
|
| + bool is_unsafe_;
|
| +};
|
| +
|
| #endif // TOOLS_BLINK_GC_PLUGIN_EDGE_H_
|
|
|