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 |