| 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_
 | 
| 
 |