Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(310)

Side by Side Diff: tools/clang/blink_gc_plugin/Edge.h

Issue 192933002: Check that classes with non-trivial destructors have finalization support. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: mixin support Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 75
76 virtual ~Edge() { } 76 virtual ~Edge() { }
77 virtual void Accept(EdgeVisitor*) = 0; 77 virtual void Accept(EdgeVisitor*) = 0;
78 virtual bool NeedsFinalization() = 0;
78 virtual TracingStatus NeedsTracing(NeedsTracingOption) { 79 virtual TracingStatus NeedsTracing(NeedsTracingOption) {
79 return TracingStatus::Unknown(); 80 return TracingStatus::Unknown();
80 } 81 }
81 82
82 virtual bool IsValue() { return false; } 83 virtual bool IsValue() { return false; }
83 virtual bool IsRawPtr() { return false; } 84 virtual bool IsRawPtr() { return false; }
84 virtual bool IsRefPtr() { return false; } 85 virtual bool IsRefPtr() { return false; }
85 virtual bool IsOwnPtr() { return false; } 86 virtual bool IsOwnPtr() { return false; }
86 virtual bool IsMember() { return false; } 87 virtual bool IsMember() { return false; }
87 virtual bool IsWeakMember() { return false; } 88 virtual bool IsWeakMember() { return false; }
88 virtual bool IsPersistent() { return false; } 89 virtual bool IsPersistent() { return false; }
89 virtual bool IsCollection() { return false; } 90 virtual bool IsCollection() { return false; }
90 }; 91 };
91 92
92 // A value edge is a direct edge to some type, eg, part-object edges. 93 // A value edge is a direct edge to some type, eg, part-object edges.
93 class Value : public Edge { 94 class Value : public Edge {
94 public: 95 public:
95 explicit Value(RecordInfo* value) : value_(value) {}; 96 explicit Value(RecordInfo* value) : value_(value) {};
96 bool IsValue() { return true; } 97 bool IsValue() { return true; }
98 bool NeedsFinalization();
97 TracingStatus NeedsTracing(NeedsTracingOption); 99 TracingStatus NeedsTracing(NeedsTracingOption);
98 void Accept(EdgeVisitor* visitor) { visitor->VisitValue(this); } 100 void Accept(EdgeVisitor* visitor) { visitor->VisitValue(this); }
99 RecordInfo* value() { return value_; } 101 RecordInfo* value() { return value_; }
100 private: 102 private:
101 RecordInfo* value_; 103 RecordInfo* value_;
102 }; 104 };
103 105
104 // Shared base for smart-pointer edges. 106 // Shared base for smart-pointer edges.
105 class PtrEdge : public Edge { 107 class PtrEdge : public Edge {
106 public: 108 public:
107 ~PtrEdge() { delete ptr_; } 109 ~PtrEdge() { delete ptr_; }
108 Edge* ptr() { return ptr_; } 110 Edge* ptr() { return ptr_; }
109 protected: 111 protected:
110 PtrEdge(Edge* ptr) : ptr_(ptr) { 112 PtrEdge(Edge* ptr) : ptr_(ptr) {
111 assert(ptr && "EdgePtr pointer must be non-null"); 113 assert(ptr && "EdgePtr pointer must be non-null");
112 } 114 }
113 private: 115 private:
114 Edge* ptr_; 116 Edge* ptr_;
115 }; 117 };
116 118
117 class RawPtr : public PtrEdge { 119 class RawPtr : public PtrEdge {
118 public: 120 public:
119 explicit RawPtr(Edge* ptr) : PtrEdge(ptr) { } 121 explicit RawPtr(Edge* ptr) : PtrEdge(ptr) { }
120 bool IsRawPtr() { return true; } 122 bool IsRawPtr() { return true; }
123 bool NeedsFinalization() { return false; }
121 TracingStatus NeedsTracing(NeedsTracingOption) { 124 TracingStatus NeedsTracing(NeedsTracingOption) {
122 return TracingStatus::Unneeded(); 125 return TracingStatus::Unneeded();
123 } 126 }
124 void Accept(EdgeVisitor* visitor) { visitor->VisitRawPtr(this); } 127 void Accept(EdgeVisitor* visitor) { visitor->VisitRawPtr(this); }
125 }; 128 };
126 129
127 class RefPtr : public PtrEdge { 130 class RefPtr : public PtrEdge {
128 public: 131 public:
129 explicit RefPtr(Edge* ptr) : PtrEdge(ptr) { } 132 explicit RefPtr(Edge* ptr) : PtrEdge(ptr) { }
130 bool IsRefPtr() { return true; } 133 bool IsRefPtr() { return true; }
134 bool NeedsFinalization() { return true; }
131 TracingStatus NeedsTracing(NeedsTracingOption) { 135 TracingStatus NeedsTracing(NeedsTracingOption) {
132 return TracingStatus::Unneeded(); 136 return TracingStatus::Unneeded();
133 } 137 }
134 void Accept(EdgeVisitor* visitor) { visitor->VisitRefPtr(this); } 138 void Accept(EdgeVisitor* visitor) { visitor->VisitRefPtr(this); }
135 }; 139 };
136 140
137 class OwnPtr : public PtrEdge { 141 class OwnPtr : public PtrEdge {
138 public: 142 public:
139 explicit OwnPtr(Edge* ptr) : PtrEdge(ptr) { } 143 explicit OwnPtr(Edge* ptr) : PtrEdge(ptr) { }
140 bool IsOwnPtr() { return true; } 144 bool IsOwnPtr() { return true; }
145 bool NeedsFinalization() { return true; }
141 TracingStatus NeedsTracing(NeedsTracingOption) { 146 TracingStatus NeedsTracing(NeedsTracingOption) {
142 return TracingStatus::Unneeded(); 147 return TracingStatus::Unneeded();
143 } 148 }
144 void Accept(EdgeVisitor* visitor) { visitor->VisitOwnPtr(this); } 149 void Accept(EdgeVisitor* visitor) { visitor->VisitOwnPtr(this); }
145 }; 150 };
146 151
147 class Member : public PtrEdge { 152 class Member : public PtrEdge {
148 public: 153 public:
149 explicit Member(Edge* ptr) : PtrEdge(ptr) { } 154 explicit Member(Edge* ptr) : PtrEdge(ptr) { }
150 bool IsMember() { return true; } 155 bool IsMember() { return true; }
156 bool NeedsFinalization() { return false; }
151 TracingStatus NeedsTracing(NeedsTracingOption) { 157 TracingStatus NeedsTracing(NeedsTracingOption) {
152 return TracingStatus::Needed(); 158 return TracingStatus::Needed();
153 } 159 }
154 void Accept(EdgeVisitor* visitor) { visitor->VisitMember(this); } 160 void Accept(EdgeVisitor* visitor) { visitor->VisitMember(this); }
155 }; 161 };
156 162
157 class WeakMember : public PtrEdge { 163 class WeakMember : public PtrEdge {
158 public: 164 public:
159 explicit WeakMember(Edge* ptr) : PtrEdge(ptr) { } 165 explicit WeakMember(Edge* ptr) : PtrEdge(ptr) { }
160 bool IsWeakMember() { return true; } 166 bool IsWeakMember() { return true; }
167 bool NeedsFinalization() { return false; }
161 TracingStatus NeedsTracing(NeedsTracingOption) { 168 TracingStatus NeedsTracing(NeedsTracingOption) {
162 return TracingStatus::Needed(); 169 return TracingStatus::Needed();
163 } 170 }
164 void Accept(EdgeVisitor* visitor) { visitor->VisitWeakMember(this); } 171 void Accept(EdgeVisitor* visitor) { visitor->VisitWeakMember(this); }
165 }; 172 };
166 173
167 class Persistent : public PtrEdge { 174 class Persistent : public PtrEdge {
168 public: 175 public:
169 explicit Persistent(Edge* ptr) : PtrEdge(ptr) { } 176 explicit Persistent(Edge* ptr) : PtrEdge(ptr) { }
170 bool IsPersistent() { return true; } 177 bool IsPersistent() { return true; }
178 bool NeedsFinalization() { return true; }
171 TracingStatus NeedsTracing(NeedsTracingOption) { 179 TracingStatus NeedsTracing(NeedsTracingOption) {
172 return TracingStatus::Unneeded(); 180 return TracingStatus::Unneeded();
173 } 181 }
174 void Accept(EdgeVisitor* visitor) { visitor->VisitPersistent(this); } 182 void Accept(EdgeVisitor* visitor) { visitor->VisitPersistent(this); }
175 }; 183 };
176 184
177 class Collection : public Edge { 185 class Collection : public Edge {
178 public: 186 public:
179 typedef std::vector<Edge*> Members; 187 typedef std::vector<Edge*> Members;
180 Collection(bool on_heap, bool is_root) 188 Collection(RecordInfo* info, bool on_heap, bool is_root)
181 : on_heap_(on_heap), is_root_(is_root) {} 189 : info_(info),
190 on_heap_(on_heap),
191 is_root_(is_root) {}
182 ~Collection() { 192 ~Collection() {
183 for (Members::iterator it = members_.begin(); it != members_.end(); ++it) { 193 for (Members::iterator it = members_.begin(); it != members_.end(); ++it) {
184 assert(*it && "Collection-edge members must be non-null"); 194 assert(*it && "Collection-edge members must be non-null");
185 delete *it; 195 delete *it;
186 } 196 }
187 } 197 }
188 bool IsCollection() { return true; } 198 bool IsCollection() { return true; }
189 bool on_heap() { return on_heap_; } 199 bool on_heap() { return on_heap_; }
190 bool is_root() { return is_root_; } 200 bool is_root() { return is_root_; }
191 Members& members() { return members_; } 201 Members& members() { return members_; }
192 void Accept(EdgeVisitor* visitor) { visitor->VisitCollection(this); } 202 void Accept(EdgeVisitor* visitor) { visitor->VisitCollection(this); }
193 void AcceptMembers(EdgeVisitor* visitor) { 203 void AcceptMembers(EdgeVisitor* visitor) {
194 for (Members::iterator it = members_.begin(); it != members_.end(); ++it) 204 for (Members::iterator it = members_.begin(); it != members_.end(); ++it)
195 (*it)->Accept(visitor); 205 (*it)->Accept(visitor);
196 } 206 }
207 bool NeedsFinalization();
197 TracingStatus NeedsTracing(NeedsTracingOption) { 208 TracingStatus NeedsTracing(NeedsTracingOption) {
198 if (is_root_) 209 if (is_root_)
199 return TracingStatus::Unneeded(); 210 return TracingStatus::Unneeded();
200 if (on_heap_) 211 if (on_heap_)
201 return TracingStatus::Needed(); 212 return TracingStatus::Needed();
202 // For off-heap collections, determine tracing status of members. 213 // For off-heap collections, determine tracing status of members.
203 TracingStatus status = TracingStatus::Unneeded(); 214 TracingStatus status = TracingStatus::Unneeded();
204 for (Members::iterator it = members_.begin(); it != members_.end(); ++it) { 215 for (Members::iterator it = members_.begin(); it != members_.end(); ++it) {
205 // Do a non-recursive test here since members could equal the holder. 216 // Do a non-recursive test here since members could equal the holder.
206 status = status.LUB((*it)->NeedsTracing(kNonRecursive)); 217 status = status.LUB((*it)->NeedsTracing(kNonRecursive));
207 } 218 }
208 return status; 219 return status;
209 } 220 }
210 private: 221 private:
222 RecordInfo* info_;
211 Members members_; 223 Members members_;
212 bool on_heap_; 224 bool on_heap_;
213 bool is_root_; 225 bool is_root_;
214 }; 226 };
215 227
216 #endif // TOOLS_BLINK_GC_PLUGIN_EDGE_H_ 228 #endif // TOOLS_BLINK_GC_PLUGIN_EDGE_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698