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

Unified Diff: tools/clang/blink_gc_plugin/BlinkGCPlugin.cpp

Issue 975683003: GCPlugin: Recognize templated registerWeakMembers() call. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 10 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | tools/clang/blink_gc_plugin/tests/heap/stubs.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_;
« no previous file with comments | « no previous file | tools/clang/blink_gc_plugin/tests/heap/stubs.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698