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 <deque> | 8 #include <deque> |
9 | 9 |
10 #include "TracingStatus.h" | 10 #include "TracingStatus.h" |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
65 virtual void AtCollection(Collection*); | 65 virtual void AtCollection(Collection*); |
66 | 66 |
67 private: | 67 private: |
68 Context context_; | 68 Context context_; |
69 }; | 69 }; |
70 | 70 |
71 // Base class for all edges. | 71 // Base class for all edges. |
72 class Edge { | 72 class Edge { |
73 public: | 73 public: |
74 enum NeedsTracingOption { kRecursive, kNonRecursive }; | 74 enum NeedsTracingOption { kRecursive, kNonRecursive }; |
| 75 enum LivenessKind { kWeak, kStrong, kRoot }; |
75 | 76 |
76 virtual ~Edge() { } | 77 virtual ~Edge() { } |
| 78 virtual LivenessKind Kind() = 0; |
77 virtual void Accept(EdgeVisitor*) = 0; | 79 virtual void Accept(EdgeVisitor*) = 0; |
78 virtual bool NeedsFinalization() = 0; | 80 virtual bool NeedsFinalization() = 0; |
79 virtual TracingStatus NeedsTracing(NeedsTracingOption) { | 81 virtual TracingStatus NeedsTracing(NeedsTracingOption) { |
80 return TracingStatus::Unknown(); | 82 return TracingStatus::Unknown(); |
81 } | 83 } |
82 | 84 |
83 virtual bool IsValue() { return false; } | 85 virtual bool IsValue() { return false; } |
84 virtual bool IsRawPtr() { return false; } | 86 virtual bool IsRawPtr() { return false; } |
85 virtual bool IsRefPtr() { return false; } | 87 virtual bool IsRefPtr() { return false; } |
86 virtual bool IsOwnPtr() { return false; } | 88 virtual bool IsOwnPtr() { return false; } |
87 virtual bool IsMember() { return false; } | 89 virtual bool IsMember() { return false; } |
88 virtual bool IsWeakMember() { return false; } | 90 virtual bool IsWeakMember() { return false; } |
89 virtual bool IsPersistent() { return false; } | 91 virtual bool IsPersistent() { return false; } |
90 virtual bool IsCollection() { return false; } | 92 virtual bool IsCollection() { return false; } |
91 }; | 93 }; |
92 | 94 |
93 // A value edge is a direct edge to some type, eg, part-object edges. | 95 // A value edge is a direct edge to some type, eg, part-object edges. |
94 class Value : public Edge { | 96 class Value : public Edge { |
95 public: | 97 public: |
96 explicit Value(RecordInfo* value) : value_(value) {}; | 98 explicit Value(RecordInfo* value) : value_(value) {}; |
97 bool IsValue() { return true; } | 99 bool IsValue() { return true; } |
| 100 LivenessKind Kind() { return kStrong; } |
98 bool NeedsFinalization(); | 101 bool NeedsFinalization(); |
99 TracingStatus NeedsTracing(NeedsTracingOption); | 102 TracingStatus NeedsTracing(NeedsTracingOption); |
100 void Accept(EdgeVisitor* visitor) { visitor->VisitValue(this); } | 103 void Accept(EdgeVisitor* visitor) { visitor->VisitValue(this); } |
101 RecordInfo* value() { return value_; } | 104 RecordInfo* value() { return value_; } |
102 private: | 105 private: |
103 RecordInfo* value_; | 106 RecordInfo* value_; |
104 }; | 107 }; |
105 | 108 |
106 // Shared base for smart-pointer edges. | 109 // Shared base for smart-pointer edges. |
107 class PtrEdge : public Edge { | 110 class PtrEdge : public Edge { |
108 public: | 111 public: |
109 ~PtrEdge() { delete ptr_; } | 112 ~PtrEdge() { delete ptr_; } |
110 Edge* ptr() { return ptr_; } | 113 Edge* ptr() { return ptr_; } |
111 protected: | 114 protected: |
112 PtrEdge(Edge* ptr) : ptr_(ptr) { | 115 PtrEdge(Edge* ptr) : ptr_(ptr) { |
113 assert(ptr && "EdgePtr pointer must be non-null"); | 116 assert(ptr && "EdgePtr pointer must be non-null"); |
114 } | 117 } |
115 private: | 118 private: |
116 Edge* ptr_; | 119 Edge* ptr_; |
117 }; | 120 }; |
118 | 121 |
119 class RawPtr : public PtrEdge { | 122 class RawPtr : public PtrEdge { |
120 public: | 123 public: |
121 explicit RawPtr(Edge* ptr) : PtrEdge(ptr) { } | 124 explicit RawPtr(Edge* ptr) : PtrEdge(ptr) { } |
122 bool IsRawPtr() { return true; } | 125 bool IsRawPtr() { return true; } |
| 126 LivenessKind Kind() { return kWeak; } |
123 bool NeedsFinalization() { return false; } | 127 bool NeedsFinalization() { return false; } |
124 TracingStatus NeedsTracing(NeedsTracingOption) { | 128 TracingStatus NeedsTracing(NeedsTracingOption) { |
125 return TracingStatus::Unneeded(); | 129 return TracingStatus::Unneeded(); |
126 } | 130 } |
127 void Accept(EdgeVisitor* visitor) { visitor->VisitRawPtr(this); } | 131 void Accept(EdgeVisitor* visitor) { visitor->VisitRawPtr(this); } |
128 }; | 132 }; |
129 | 133 |
130 class RefPtr : public PtrEdge { | 134 class RefPtr : public PtrEdge { |
131 public: | 135 public: |
132 explicit RefPtr(Edge* ptr) : PtrEdge(ptr) { } | 136 explicit RefPtr(Edge* ptr) : PtrEdge(ptr) { } |
133 bool IsRefPtr() { return true; } | 137 bool IsRefPtr() { return true; } |
| 138 LivenessKind Kind() { return kStrong; } |
134 bool NeedsFinalization() { return true; } | 139 bool NeedsFinalization() { return true; } |
135 TracingStatus NeedsTracing(NeedsTracingOption) { | 140 TracingStatus NeedsTracing(NeedsTracingOption) { |
136 return TracingStatus::Unneeded(); | 141 return TracingStatus::Unneeded(); |
137 } | 142 } |
138 void Accept(EdgeVisitor* visitor) { visitor->VisitRefPtr(this); } | 143 void Accept(EdgeVisitor* visitor) { visitor->VisitRefPtr(this); } |
139 }; | 144 }; |
140 | 145 |
141 class OwnPtr : public PtrEdge { | 146 class OwnPtr : public PtrEdge { |
142 public: | 147 public: |
143 explicit OwnPtr(Edge* ptr) : PtrEdge(ptr) { } | 148 explicit OwnPtr(Edge* ptr) : PtrEdge(ptr) { } |
144 bool IsOwnPtr() { return true; } | 149 bool IsOwnPtr() { return true; } |
| 150 LivenessKind Kind() { return kStrong; } |
145 bool NeedsFinalization() { return true; } | 151 bool NeedsFinalization() { return true; } |
146 TracingStatus NeedsTracing(NeedsTracingOption) { | 152 TracingStatus NeedsTracing(NeedsTracingOption) { |
147 return TracingStatus::Unneeded(); | 153 return TracingStatus::Unneeded(); |
148 } | 154 } |
149 void Accept(EdgeVisitor* visitor) { visitor->VisitOwnPtr(this); } | 155 void Accept(EdgeVisitor* visitor) { visitor->VisitOwnPtr(this); } |
150 }; | 156 }; |
151 | 157 |
152 class Member : public PtrEdge { | 158 class Member : public PtrEdge { |
153 public: | 159 public: |
154 explicit Member(Edge* ptr) : PtrEdge(ptr) { } | 160 explicit Member(Edge* ptr) : PtrEdge(ptr) { } |
155 bool IsMember() { return true; } | 161 bool IsMember() { return true; } |
| 162 LivenessKind Kind() { return kStrong; } |
156 bool NeedsFinalization() { return false; } | 163 bool NeedsFinalization() { return false; } |
157 TracingStatus NeedsTracing(NeedsTracingOption) { | 164 TracingStatus NeedsTracing(NeedsTracingOption) { |
158 return TracingStatus::Needed(); | 165 return TracingStatus::Needed(); |
159 } | 166 } |
160 void Accept(EdgeVisitor* visitor) { visitor->VisitMember(this); } | 167 void Accept(EdgeVisitor* visitor) { visitor->VisitMember(this); } |
161 }; | 168 }; |
162 | 169 |
163 class WeakMember : public PtrEdge { | 170 class WeakMember : public PtrEdge { |
164 public: | 171 public: |
165 explicit WeakMember(Edge* ptr) : PtrEdge(ptr) { } | 172 explicit WeakMember(Edge* ptr) : PtrEdge(ptr) { } |
166 bool IsWeakMember() { return true; } | 173 bool IsWeakMember() { return true; } |
| 174 LivenessKind Kind() { return kWeak; } |
167 bool NeedsFinalization() { return false; } | 175 bool NeedsFinalization() { return false; } |
168 TracingStatus NeedsTracing(NeedsTracingOption) { | 176 TracingStatus NeedsTracing(NeedsTracingOption) { |
169 return TracingStatus::Needed(); | 177 return TracingStatus::Needed(); |
170 } | 178 } |
171 void Accept(EdgeVisitor* visitor) { visitor->VisitWeakMember(this); } | 179 void Accept(EdgeVisitor* visitor) { visitor->VisitWeakMember(this); } |
172 }; | 180 }; |
173 | 181 |
174 class Persistent : public PtrEdge { | 182 class Persistent : public PtrEdge { |
175 public: | 183 public: |
176 explicit Persistent(Edge* ptr) : PtrEdge(ptr) { } | 184 explicit Persistent(Edge* ptr) : PtrEdge(ptr) { } |
177 bool IsPersistent() { return true; } | 185 bool IsPersistent() { return true; } |
| 186 LivenessKind Kind() { return kRoot; } |
178 bool NeedsFinalization() { return true; } | 187 bool NeedsFinalization() { return true; } |
179 TracingStatus NeedsTracing(NeedsTracingOption) { | 188 TracingStatus NeedsTracing(NeedsTracingOption) { |
180 return TracingStatus::Unneeded(); | 189 return TracingStatus::Unneeded(); |
181 } | 190 } |
182 void Accept(EdgeVisitor* visitor) { visitor->VisitPersistent(this); } | 191 void Accept(EdgeVisitor* visitor) { visitor->VisitPersistent(this); } |
183 }; | 192 }; |
184 | 193 |
185 class Collection : public Edge { | 194 class Collection : public Edge { |
186 public: | 195 public: |
187 typedef std::vector<Edge*> Members; | 196 typedef std::vector<Edge*> Members; |
188 Collection(RecordInfo* info, bool on_heap, bool is_root) | 197 Collection(RecordInfo* info, bool on_heap, bool is_root) |
189 : info_(info), | 198 : info_(info), |
190 on_heap_(on_heap), | 199 on_heap_(on_heap), |
191 is_root_(is_root) {} | 200 is_root_(is_root) {} |
192 ~Collection() { | 201 ~Collection() { |
193 for (Members::iterator it = members_.begin(); it != members_.end(); ++it) { | 202 for (Members::iterator it = members_.begin(); it != members_.end(); ++it) { |
194 assert(*it && "Collection-edge members must be non-null"); | 203 assert(*it && "Collection-edge members must be non-null"); |
195 delete *it; | 204 delete *it; |
196 } | 205 } |
197 } | 206 } |
198 bool IsCollection() { return true; } | 207 bool IsCollection() { return true; } |
| 208 LivenessKind Kind() { return is_root_ ? kRoot : kStrong; } |
199 bool on_heap() { return on_heap_; } | 209 bool on_heap() { return on_heap_; } |
200 bool is_root() { return is_root_; } | 210 bool is_root() { return is_root_; } |
201 Members& members() { return members_; } | 211 Members& members() { return members_; } |
202 void Accept(EdgeVisitor* visitor) { visitor->VisitCollection(this); } | 212 void Accept(EdgeVisitor* visitor) { visitor->VisitCollection(this); } |
203 void AcceptMembers(EdgeVisitor* visitor) { | 213 void AcceptMembers(EdgeVisitor* visitor) { |
204 for (Members::iterator it = members_.begin(); it != members_.end(); ++it) | 214 for (Members::iterator it = members_.begin(); it != members_.end(); ++it) |
205 (*it)->Accept(visitor); | 215 (*it)->Accept(visitor); |
206 } | 216 } |
207 bool NeedsFinalization(); | 217 bool NeedsFinalization(); |
208 TracingStatus NeedsTracing(NeedsTracingOption) { | 218 TracingStatus NeedsTracing(NeedsTracingOption) { |
(...skipping 10 matching lines...) Expand all Loading... |
219 return status; | 229 return status; |
220 } | 230 } |
221 private: | 231 private: |
222 RecordInfo* info_; | 232 RecordInfo* info_; |
223 Members members_; | 233 Members members_; |
224 bool on_heap_; | 234 bool on_heap_; |
225 bool is_root_; | 235 bool is_root_; |
226 }; | 236 }; |
227 | 237 |
228 #endif // TOOLS_BLINK_GC_PLUGIN_EDGE_H_ | 238 #endif // TOOLS_BLINK_GC_PLUGIN_EDGE_H_ |
OLD | NEW |