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 dc36bef4145e325e87d5553d339eaeb673e33cc2..e298f2f907a96f7c2cecdbbabca34f44f69a79d3 100644 |
--- a/tools/clang/blink_gc_plugin/BlinkGCPlugin.cpp |
+++ b/tools/clang/blink_gc_plugin/BlinkGCPlugin.cpp |
@@ -388,17 +388,8 @@ class CheckTraceVisitor : public RecursiveASTVisitor<CheckTraceVisitor> { |
if (CheckTraceBaseCall(call)) |
return true; |
- // If we find a call to registerWeakMembers which is unresolved we |
- // unsoundly consider all weak members as traced. |
- // TODO: Find out how to validate weak member tracing for unresolved call. |
- if (expr->getMemberName().getAsString() == kRegisterWeakMembersName) { |
- for (RecordInfo::Fields::iterator it = info_->GetFields().begin(); |
- it != info_->GetFields().end(); |
- ++it) { |
- if (it->second.edge()->IsWeakMember()) |
- it->second.MarkTraced(); |
- } |
- } |
+ if (expr->getMemberName().getAsString() == kRegisterWeakMembersName) |
+ MarkAllWeakMembersTraced(); |
QualType base = expr->getBaseType(); |
if (!base->isPointerType()) |
@@ -454,18 +445,23 @@ class CheckTraceVisitor : public RecursiveASTVisitor<CheckTraceVisitor> { |
CXXDependentScopeMemberExpr* expr) { |
string fn_name = expr->getMember().getAsString(); |
- // Check for VisitorDispatcher::trace(field) |
+ // Check for VisitorDispatcher::trace(field) and |
+ // VisitorDispatcher::registerWeakMembers. |
if (!expr->isImplicitAccess()) { |
if (clang::DeclRefExpr* base_decl = |
clang::dyn_cast<clang::DeclRefExpr>(expr->getBase())) { |
- if (Config::IsVisitorDispatcherType(base_decl->getType()) && |
- call->getNumArgs() == 1 && fn_name == kTraceName) { |
- FindFieldVisitor finder; |
- finder.TraverseStmt(call->getArg(0)); |
- if (finder.field()) |
- FoundField(finder.field()); |
- |
- return; |
+ if (Config::IsVisitorDispatcherType(base_decl->getType())) { |
+ if (call->getNumArgs() == 1 && fn_name == kTraceName) { |
+ FindFieldVisitor finder; |
+ finder.TraverseStmt(call->getArg(0)); |
+ if (finder.field()) |
+ FoundField(finder.field()); |
+ |
+ return; |
+ } else if (call->getNumArgs() == 1 && |
+ fn_name == kRegisterWeakMembersName) { |
+ MarkAllWeakMembersTraced(); |
+ } |
} |
} |
} |
@@ -696,6 +692,16 @@ class CheckTraceVisitor : public RecursiveASTVisitor<CheckTraceVisitor> { |
} |
} |
+ void MarkAllWeakMembersTraced() { |
+ // If we find a call to registerWeakMembers which is unresolved we |
+ // unsoundly consider all weak members as traced. |
+ // TODO: Find out how to validate weak member tracing for unresolved call. |
+ for (auto& field : info_->GetFields()) { |
+ if (field.second.edge()->IsWeakMember()) |
+ field.second.MarkTraced(); |
+ } |
+ } |
+ |
CXXMethodDecl* trace_; |
RecordInfo* info_; |
RecordCache* cache_; |