Index: tools/clang/blink_gc_plugin/CheckFinalizerVisitor.h |
diff --git a/tools/clang/blink_gc_plugin/CheckFinalizerVisitor.h b/tools/clang/blink_gc_plugin/CheckFinalizerVisitor.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f926a0d14b0c19e396e249fda40f207ab9fa8e88 |
--- /dev/null |
+++ b/tools/clang/blink_gc_plugin/CheckFinalizerVisitor.h |
@@ -0,0 +1,57 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef TOOLS_BLINK_GC_PLUGIN_CHECK_FINALIZER_VISITOR_H_ |
+#define TOOLS_BLINK_GC_PLUGIN_CHECK_FINALIZER_VISITOR_H_ |
+ |
+#include <set> |
+#include <vector> |
+ |
+#include "Edge.h" |
+#include "RecordInfo.h" |
+#include "clang/AST/RecursiveASTVisitor.h" |
+ |
+// This visitor checks that a finalizer method does not have invalid access to |
+// fields that are potentially finalized. A potentially finalized field is |
+// either a Member, a heap-allocated collection or an off-heap collection that |
+// contains Members. Invalid uses are currently identified as passing the field |
+// as the argument of a procedure call or using the -> or [] operators on it. |
+class CheckFinalizerVisitor |
+ : public clang::RecursiveASTVisitor<CheckFinalizerVisitor> { |
+ public: |
+ struct Error { |
+ Error(clang::MemberExpr* member, |
+ bool as_eagerly_finalized, |
+ FieldPoint* field) |
+ : member(member), |
+ as_eagerly_finalized(as_eagerly_finalized), |
+ field(field) {} |
+ |
+ clang::MemberExpr* member; |
+ bool as_eagerly_finalized; |
+ FieldPoint* field; |
+ }; |
+ |
+ typedef std::vector<Error> Errors; |
+ |
+ CheckFinalizerVisitor(RecordCache* cache, bool is_eagerly_finalized); |
+ |
+ Errors& finalized_fields(); |
+ |
+ bool WalkUpFromCXXOperatorCallExpr(clang::CXXOperatorCallExpr* expr); |
+ bool WalkUpFromCallExpr(clang::CallExpr* expr); |
+ |
+ bool VisitMemberExpr(clang::MemberExpr* member); |
+ |
+ private: |
+ bool MightBeCollected(FieldPoint* point, bool* as_eagerly_finalized); |
+ |
+ bool blacklist_context_; |
+ Errors finalized_fields_; |
+ std::set<clang::MemberExpr*> seen_members_; |
+ RecordCache* cache_; |
+ bool is_eagerly_finalized_; |
+}; |
+ |
+#endif // TOOLS_BLINK_GC_PLUGIN_CHECK_FINALIZER_VISITOR_H_ |