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

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

Issue 2588943002: Disallow heap objects containing unsafe on-heap iterators. (Closed)
Patch Set: formatting Created 4 years 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
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 <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
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_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698