| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef TOOLS_BLINK_GC_PLUGIN_EDGE_H_ | 5 #ifndef TOOLS_BLINK_GC_PLUGIN_EDGE_H_ |
| 6 #define TOOLS_BLINK_GC_PLUGIN_EDGE_H_ | 6 #define TOOLS_BLINK_GC_PLUGIN_EDGE_H_ |
| 7 | 7 |
| 8 #include <cassert> | 8 #include <cassert> |
| 9 #include <deque> | 9 #include <deque> |
| 10 #include <vector> | 10 #include <vector> |
| 11 | 11 |
| 12 #include "TracingStatus.h" | 12 #include "TracingStatus.h" |
| 13 | 13 |
| 14 class RecordInfo; | 14 class RecordInfo; |
| 15 | 15 |
| 16 class Edge; | 16 class Edge; |
| 17 class Collection; | 17 class Collection; |
| 18 class CrossThreadPersistent; | 18 class CrossThreadPersistent; |
| 19 class Iterator; |
| 19 class Member; | 20 class Member; |
| 20 class OwnPtr; | 21 class OwnPtr; |
| 21 class Persistent; | 22 class Persistent; |
| 22 class RawPtr; | 23 class RawPtr; |
| 23 class RefPtr; | 24 class RefPtr; |
| 24 class UniquePtr; | 25 class UniquePtr; |
| 25 class Value; | 26 class Value; |
| 26 class WeakMember; | 27 class WeakMember; |
| 27 | 28 |
| 28 // Bare-bones visitor. | 29 // Bare-bones visitor. |
| 29 class EdgeVisitor { | 30 class EdgeVisitor { |
| 30 public: | 31 public: |
| 31 virtual ~EdgeVisitor() {} | 32 virtual ~EdgeVisitor() {} |
| 32 virtual void VisitValue(Value*) {} | 33 virtual void VisitValue(Value*) {} |
| 33 virtual void VisitRawPtr(RawPtr*) {} | 34 virtual void VisitRawPtr(RawPtr*) {} |
| 34 virtual void VisitRefPtr(RefPtr*) {} | 35 virtual void VisitRefPtr(RefPtr*) {} |
| 35 virtual void VisitOwnPtr(OwnPtr*) {} | 36 virtual void VisitOwnPtr(OwnPtr*) {} |
| 36 virtual void VisitUniquePtr(UniquePtr*) {} | 37 virtual void VisitUniquePtr(UniquePtr*) {} |
| 37 virtual void VisitMember(Member*) {} | 38 virtual void VisitMember(Member*) {} |
| 38 virtual void VisitWeakMember(WeakMember*) {} | 39 virtual void VisitWeakMember(WeakMember*) {} |
| 39 virtual void VisitPersistent(Persistent*) {} | 40 virtual void VisitPersistent(Persistent*) {} |
| 40 virtual void VisitCrossThreadPersistent(CrossThreadPersistent*) {} | 41 virtual void VisitCrossThreadPersistent(CrossThreadPersistent*) {} |
| 41 virtual void VisitCollection(Collection*) {} | 42 virtual void VisitCollection(Collection*) {} |
| 43 virtual void VisitIterator(Iterator*) {} |
| 42 }; | 44 }; |
| 43 | 45 |
| 44 // Recursive edge visitor. The traversed path is accessible in context. | 46 // Recursive edge visitor. The traversed path is accessible in context. |
| 45 class RecursiveEdgeVisitor : public EdgeVisitor { | 47 class RecursiveEdgeVisitor : public EdgeVisitor { |
| 46 public: | 48 public: |
| 47 // Overrides that recursively walk the edges and record the path. | 49 // Overrides that recursively walk the edges and record the path. |
| 48 void VisitValue(Value*) override; | 50 void VisitValue(Value*) override; |
| 49 void VisitRawPtr(RawPtr*) override; | 51 void VisitRawPtr(RawPtr*) override; |
| 50 void VisitRefPtr(RefPtr*) override; | 52 void VisitRefPtr(RefPtr*) override; |
| 51 void VisitOwnPtr(OwnPtr*) override; | 53 void VisitOwnPtr(OwnPtr*) override; |
| 52 void VisitUniquePtr(UniquePtr*) override; | 54 void VisitUniquePtr(UniquePtr*) override; |
| 53 void VisitMember(Member*) override; | 55 void VisitMember(Member*) override; |
| 54 void VisitWeakMember(WeakMember*) override; | 56 void VisitWeakMember(WeakMember*) override; |
| 55 void VisitPersistent(Persistent*) override; | 57 void VisitPersistent(Persistent*) override; |
| 56 void VisitCrossThreadPersistent(CrossThreadPersistent*) override; | 58 void VisitCrossThreadPersistent(CrossThreadPersistent*) override; |
| 57 void VisitCollection(Collection*) override; | 59 void VisitCollection(Collection*) override; |
| 60 void VisitIterator(Iterator*) override; |
| 58 | 61 |
| 59 protected: | 62 protected: |
| 60 typedef std::deque<Edge*> Context; | 63 typedef std::deque<Edge*> Context; |
| 61 Context& context() { return context_; } | 64 Context& context() { return context_; } |
| 62 Edge* Parent() { return context_.empty() ? 0 : context_.front(); } | 65 Edge* Parent() { return context_.empty() ? 0 : context_.front(); } |
| 63 void Enter(Edge* e) { return context_.push_front(e); } | 66 void Enter(Edge* e) { return context_.push_front(e); } |
| 64 void Leave() { context_.pop_front(); } | 67 void Leave() { context_.pop_front(); } |
| 65 | 68 |
| 66 // Default callback to overwrite in visitor subclass. | 69 // Default callback to overwrite in visitor subclass. |
| 67 virtual void AtValue(Value*); | 70 virtual void AtValue(Value*); |
| 68 virtual void AtRawPtr(RawPtr*); | 71 virtual void AtRawPtr(RawPtr*); |
| 69 virtual void AtRefPtr(RefPtr*); | 72 virtual void AtRefPtr(RefPtr*); |
| 70 virtual void AtOwnPtr(OwnPtr*); | 73 virtual void AtOwnPtr(OwnPtr*); |
| 71 virtual void AtUniquePtr(UniquePtr*); | 74 virtual void AtUniquePtr(UniquePtr*); |
| 72 virtual void AtMember(Member*); | 75 virtual void AtMember(Member*); |
| 73 virtual void AtWeakMember(WeakMember*); | 76 virtual void AtWeakMember(WeakMember*); |
| 74 virtual void AtPersistent(Persistent*); | 77 virtual void AtPersistent(Persistent*); |
| 75 virtual void AtCrossThreadPersistent(CrossThreadPersistent*); | 78 virtual void AtCrossThreadPersistent(CrossThreadPersistent*); |
| 76 virtual void AtCollection(Collection*); | 79 virtual void AtCollection(Collection*); |
| 80 virtual void AtIterator(Iterator*); |
| 77 | 81 |
| 78 private: | 82 private: |
| 79 Context context_; | 83 Context context_; |
| 80 }; | 84 }; |
| 81 | 85 |
| 82 // Base class for all edges. | 86 // Base class for all edges. |
| 83 class Edge { | 87 class Edge { |
| 84 public: | 88 public: |
| 85 enum NeedsTracingOption { kRecursive, kNonRecursive }; | 89 enum NeedsTracingOption { kRecursive, kNonRecursive }; |
| 86 enum LivenessKind { kWeak, kStrong, kRoot }; | 90 enum LivenessKind { kWeak, kStrong, kRoot }; |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 274 return status; | 278 return status; |
| 275 } | 279 } |
| 276 | 280 |
| 277 private: | 281 private: |
| 278 RecordInfo* info_; | 282 RecordInfo* info_; |
| 279 Members members_; | 283 Members members_; |
| 280 bool on_heap_; | 284 bool on_heap_; |
| 281 bool is_root_; | 285 bool is_root_; |
| 282 }; | 286 }; |
| 283 | 287 |
| 288 // An iterator edge is a direct edge to some iterator type. |
| 289 class Iterator : public Edge { |
| 290 public: |
| 291 Iterator(RecordInfo* info, bool on_heap, bool is_unsafe) |
| 292 : info_(info), on_heap_(on_heap), is_unsafe_(is_unsafe) {} |
| 293 ~Iterator() {} |
| 294 |
| 295 void Accept(EdgeVisitor* visitor) { visitor->VisitIterator(this); } |
| 296 LivenessKind Kind() override { return kStrong; } |
| 297 bool NeedsFinalization() { return false; } |
| 298 TracingStatus NeedsTracing(NeedsTracingOption) { |
| 299 if (on_heap_) |
| 300 return TracingStatus::Needed(); |
| 301 return TracingStatus::Unneeded(); |
| 302 } |
| 303 |
| 304 RecordInfo* info() const { return info_; } |
| 305 |
| 306 bool IsUnsafe() const { return is_unsafe_; } |
| 307 |
| 308 private: |
| 309 RecordInfo* info_; |
| 310 bool on_heap_; |
| 311 bool is_unsafe_; |
| 312 }; |
| 313 |
| 284 #endif // TOOLS_BLINK_GC_PLUGIN_EDGE_H_ | 314 #endif // TOOLS_BLINK_GC_PLUGIN_EDGE_H_ |
| OLD | NEW |