Commit db4d24fd authored by zerny@chromium.org's avatar zerny@chromium.org

Fix IsGCMixin predicate to correctly identify classes with multiple mixin bases.

R=ager@chromium.org
NOTRY=true

Review URL: https://codereview.chromium.org/260073010

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@266851 0039d316-1c4b-4281-b951-d872f2087c98
parent ffdb1d5f
......@@ -134,19 +134,22 @@ bool RecordInfo::IsTreeShared() {
}
// A GC mixin is a class that inherits from a GC mixin base and has
// has not yet been "mixed in" with another GC base class.
// not yet been "mixed in" with another GC base class.
bool RecordInfo::IsGCMixin() {
if (!IsGCDerived() || base_paths_->begin() == base_paths_->end())
return false;
// Get the last element of the first path.
CXXBasePaths::paths_iterator it = base_paths_->begin();
const CXXBasePathElement& elem = (*it)[it->size() - 1];
CXXRecordDecl* base = elem.Base->getType()->getAsCXXRecordDecl();
// If it is not a mixin base we are done.
if (!Config::IsGCMixinBase(base->getName()))
return false;
// This is a mixin if there are no other paths to GC bases.
return ++it == base_paths_->end();
for (CXXBasePaths::paths_iterator it = base_paths_->begin();
it != base_paths_->end();
++it) {
// Get the last element of the path.
const CXXBasePathElement& elem = (*it)[it->size() - 1];
CXXRecordDecl* base = elem.Base->getType()->getAsCXXRecordDecl();
// If it is not a mixin base we are done.
if (!Config::IsGCMixinBase(base->getName()))
return false;
}
// This is a mixin if all GC bases are mixins.
return true;
}
// Test if a record is allocated on the managed heap.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment