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

Side by Side Diff: tools/clang/blink_gc_plugin/RecordInfo.cpp

Issue 260073010: Fix IsGCMixin predicate to correctly identify classes with multiple mixin bases. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 #include "Config.h" 5 #include "Config.h"
6 #include "RecordInfo.h" 6 #include "RecordInfo.h"
7 7
8 using namespace clang; 8 using namespace clang;
9 using std::string; 9 using std::string;
10 10
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
127 if (it->size() < 2) continue; 127 if (it->size() < 2) continue;
128 const CXXBasePathElement& elem = (*it)[it->size() - 2]; 128 const CXXBasePathElement& elem = (*it)[it->size() - 2];
129 CXXRecordDecl* base = elem.Base->getType()->getAsCXXRecordDecl(); 129 CXXRecordDecl* base = elem.Base->getType()->getAsCXXRecordDecl();
130 if (Config::IsTreeSharedBase(base->getName())) 130 if (Config::IsTreeSharedBase(base->getName()))
131 return true; 131 return true;
132 } 132 }
133 return false; 133 return false;
134 } 134 }
135 135
136 // A GC mixin is a class that inherits from a GC mixin base and has 136 // A GC mixin is a class that inherits from a GC mixin base and has
137 // has not yet been "mixed in" with another GC base class. 137 // not yet been "mixed in" with another GC base class.
138 bool RecordInfo::IsGCMixin() { 138 bool RecordInfo::IsGCMixin() {
139 if (!IsGCDerived() || base_paths_->begin() == base_paths_->end()) 139 if (!IsGCDerived() || base_paths_->begin() == base_paths_->end())
140 return false; 140 return false;
141 // Get the last element of the first path. 141 for (CXXBasePaths::paths_iterator it = base_paths_->begin();
142 CXXBasePaths::paths_iterator it = base_paths_->begin(); 142 it != base_paths_->end();
143 const CXXBasePathElement& elem = (*it)[it->size() - 1]; 143 ++it) {
144 CXXRecordDecl* base = elem.Base->getType()->getAsCXXRecordDecl(); 144 // Get the last element of the path.
145 // If it is not a mixin base we are done. 145 const CXXBasePathElement& elem = (*it)[it->size() - 1];
146 if (!Config::IsGCMixinBase(base->getName())) 146 CXXRecordDecl* base = elem.Base->getType()->getAsCXXRecordDecl();
147 return false; 147 // If it is not a mixin base we are done.
148 // This is a mixin if there are no other paths to GC bases. 148 if (!Config::IsGCMixinBase(base->getName()))
149 return ++it == base_paths_->end(); 149 return false;
150 }
151 // This is a mixin if all GC bases are mixins.
152 return true;
150 } 153 }
151 154
152 // Test if a record is allocated on the managed heap. 155 // Test if a record is allocated on the managed heap.
153 bool RecordInfo::IsGCAllocated() { 156 bool RecordInfo::IsGCAllocated() {
154 return IsGCDerived() || IsHeapAllocatedCollection(); 157 return IsGCDerived() || IsHeapAllocatedCollection();
155 } 158 }
156 159
157 RecordInfo* RecordCache::Lookup(CXXRecordDecl* record) { 160 RecordInfo* RecordCache::Lookup(CXXRecordDecl* record) {
158 // Ignore classes annotated with the GC_PLUGIN_IGNORE macro. 161 // Ignore classes annotated with the GC_PLUGIN_IGNORE macro.
159 if (!record || Config::IsIgnoreAnnotated(record)) 162 if (!record || Config::IsIgnoreAnnotated(record))
(...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after
505 // We failed to create an edge so abort the entire edge construction. 508 // We failed to create an edge so abort the entire edge construction.
506 delete edge; // Will delete the already allocated members. 509 delete edge; // Will delete the already allocated members.
507 return 0; 510 return 0;
508 } 511 }
509 } 512 }
510 return edge; 513 return edge;
511 } 514 }
512 515
513 return new Value(info); 516 return new Value(info);
514 } 517 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698