Commit 747d1833 authored by zerny@chromium.org's avatar zerny@chromium.org

Blink GC plugin: require that trace call base::trace and traceAfterDispatch...

Blink GC plugin: require that trace call base::trace and traceAfterDispatch call base::traceAfterDispatch.

BUG=334149
R=wibling@chromium.org
NOTRY=true

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

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@270057 0039d316-1c4b-4281-b951-d872f2087c98
parent c37fe20e
......@@ -356,10 +356,13 @@ class CheckTraceVisitor : public RecursiveASTVisitor<CheckTraceVisitor> {
return true;
}
// TODO: It is possible to have multiple bases, where one must be traced
// using a traceAfterDispatch. In such a case we should also check that
// the mixin does not add a vtable.
if (Config::IsTraceMethod(fn) && member->hasQualifier()) {
// Currently, a manually dispatched class cannot have mixin bases (having
// one would add a vtable which we explicitly check against). This means
// that we can only make calls to a trace method of the same name. Revisit
// this if our mixin/vtable assumption changes.
if (Config::IsTraceMethod(fn) &&
fn->getName() == trace_->getName() &&
member->hasQualifier()) {
if (const Type* type = member->getQualifier()->getAsType()) {
if (CXXRecordDecl* decl = type->getAsCXXRecordDecl()) {
RecordInfo::Bases::iterator it = info_->GetBases().find(decl);
......
......@@ -45,19 +45,19 @@ void A::finalizeGarbageCollectedObject()
void B::traceAfterDispatch(Visitor* visitor)
{
visitor->trace(m_a);
A::trace(visitor);
A::traceAfterDispatch(visitor);
}
void C::traceAfterDispatch(Visitor* visitor)
{
visitor->trace(m_a);
A::trace(visitor);
A::traceAfterDispatch(visitor);
}
void D::traceAfterDispatch(Visitor* visitor)
{
visitor->trace(m_a);
Abstract::trace(visitor);
Abstract::traceAfterDispatch(visitor);
}
}
......@@ -30,19 +30,21 @@ void A::traceAfterDispatch(Visitor* visitor)
void B::traceAfterDispatch(Visitor* visitor)
{
visitor->trace(m_a);
// Missing A::trace(visitor);
// Missing A::traceAfterDispatch(visitor);
// Also check that calling trace does not count.
A::trace(visitor);
}
void C::traceAfterDispatch(Visitor* visitor)
{
// Missing visitor->trace(m_a);
A::trace(visitor);
A::traceAfterDispatch(visitor);
}
void D::traceAfterDispatch(Visitor* visitor)
{
visitor->trace(m_a);
Abstract::trace(visitor);
Abstract::traceAfterDispatch(visitor);
}
}
......@@ -4,7 +4,7 @@ void A::trace(Visitor* visitor)
trace_after_dispatch.cpp:30:1: warning: [blink-gc] Base class 'A' of derived class 'B' requires tracing.
void B::traceAfterDispatch(Visitor* visitor)
^
trace_after_dispatch.cpp:36:1: warning: [blink-gc] Class 'C' has untraced fields that require tracing.
trace_after_dispatch.cpp:38:1: warning: [blink-gc] Class 'C' has untraced fields that require tracing.
void C::traceAfterDispatch(Visitor* visitor)
^
./trace_after_dispatch.h:36:5: note: [blink-gc] Untraced field 'm_a' declared here:
......
......@@ -24,7 +24,7 @@ void A::traceAfterDispatch(Visitor* visitor)
void B::traceAfterDispatch(Visitor* visitor)
{
visitor->trace(m_a);
A::trace(visitor);
A::traceAfterDispatch(visitor);
}
}
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