Index: tools/clang/blink_gc_plugin/BlinkGCPlugin.cpp |
diff --git a/tools/clang/blink_gc_plugin/BlinkGCPlugin.cpp b/tools/clang/blink_gc_plugin/BlinkGCPlugin.cpp |
index 7dae3810150a394785d0f80835ba81534bccac30..2924fd304fac91fe76adc32866d7c371b0f42c57 100644 |
--- a/tools/clang/blink_gc_plugin/BlinkGCPlugin.cpp |
+++ b/tools/clang/blink_gc_plugin/BlinkGCPlugin.cpp |
@@ -201,8 +201,7 @@ class CollectVisitor : public RecursiveASTVisitor<CollectVisitor> { |
// Collect tracing method definitions, but don't traverse method bodies. |
bool TraverseCXXMethodDecl(CXXMethodDecl* method) { |
- if (method->isThisDeclarationADefinition() && |
- Config::IsTraceMethod(method, nullptr)) |
+ if (method->isThisDeclarationADefinition() && Config::IsTraceMethod(method)) |
trace_decls_.push_back(method); |
return true; |
} |
@@ -384,7 +383,7 @@ class CheckTraceVisitor : public RecursiveASTVisitor<CheckTraceVisitor> { |
CXXRecordDecl* decl = base->getPointeeType()->getAsCXXRecordDecl(); |
if (decl) |
CheckTraceFieldCall(expr->getMemberName().getAsString(), decl, arg); |
- if (expr->getMemberName().getAsString() == kTraceImplName) |
+ if (Config::IsTraceImplName(expr->getMemberName().getAsString())) |
delegates_to_traceimpl_ = true; |
return true; |
} |
@@ -393,7 +392,7 @@ class CheckTraceVisitor : public RecursiveASTVisitor<CheckTraceVisitor> { |
if (CheckTraceFieldCall(expr) || CheckRegisterWeakMembers(expr)) |
return true; |
- if (expr->getMethodDecl()->getNameAsString() == kTraceImplName) { |
+ if (Config::IsTraceImplName(expr->getMethodDecl()->getNameAsString())) { |
delegates_to_traceimpl_ = true; |
return true; |
} |
@@ -467,12 +466,15 @@ class CheckTraceVisitor : public RecursiveASTVisitor<CheckTraceVisitor> { |
return false; |
FunctionDecl* fn = dyn_cast<FunctionDecl>(callee->getMemberDecl()); |
- if (!fn || !Config::IsTraceMethod(fn, nullptr)) |
+ if (!fn || !Config::IsTraceMethod(fn)) |
return false; |
if (trace_->getName() == kTraceImplName) { |
if (fn->getName() != kTraceName) |
return false; |
+ } else if (trace_->getName() == kTraceAfterDispatchImplName) { |
+ if (fn->getName() != kTraceAfterDispatchName) |
+ return false; |
} else { |
// Currently, a manually dispatched class cannot have mixin bases (having |
// one would add a vtable which we explicitly check against). This means |
@@ -1313,21 +1315,20 @@ class BlinkGCPluginConsumer : public ASTConsumer { |
// Determine what type of tracing method this is (dispatch or trace). |
void CheckTraceOrDispatchMethod(RecordInfo* parent, CXXMethodDecl* method) { |
- bool isTraceAfterDispatch; |
- if (Config::IsTraceMethod(method, &isTraceAfterDispatch)) { |
- if (isTraceAfterDispatch || !parent->GetTraceDispatchMethod()) { |
- CheckTraceMethod(parent, method, isTraceAfterDispatch); |
- } |
- // Dispatch methods are checked when we identify subclasses. |
+ Config::TraceMethodType trace_type = Config::GetTraceMethodType(method); |
+ if (trace_type != Config::TRACE_METHOD || |
+ !parent->GetTraceDispatchMethod()) { |
+ CheckTraceMethod(parent, method, trace_type); |
} |
+ // Dispatch methods are checked when we identify subclasses. |
} |
// Check an actual trace method. |
void CheckTraceMethod(RecordInfo* parent, |
CXXMethodDecl* trace, |
- bool isTraceAfterDispatch) { |
+ Config::TraceMethodType trace_type) { |
// A trace method must not override any non-virtual trace methods. |
- if (!isTraceAfterDispatch) { |
+ if (trace_type == Config::TRACE_METHOD) { |
for (RecordInfo::Bases::iterator it = parent->GetBases().begin(); |
it != parent->GetBases().end(); |
++it) { |
@@ -1341,7 +1342,8 @@ class BlinkGCPluginConsumer : public ASTConsumer { |
visitor.TraverseCXXMethodDecl(trace); |
// Skip reporting if this trace method is a just delegate to |
- // traceImpl method. We will report on CheckTraceMethod on traceImpl method. |
+ // traceImpl (or traceAfterDispatchImpl) method. We will report on |
+ // CheckTraceMethod on traceImpl method. |
if (visitor.delegates_to_traceimpl()) |
return; |