From abe2a36b7eeac46d1b9c0aabf616e68125dd329d Mon Sep 17 00:00:00 2001 From: Daniel Jasper Date: Thu, 25 Jul 2013 09:32:14 +0000 Subject: Use memoization for has()-matcher. In TUs with large classes, a matcher like methodDecl(ofClass(recordDecl(has(varDecl())))) (finding all member functions of classes with static variables) becomes unbearably slow otherwise. llvm-svn: 187115 --- clang/lib/ASTMatchers/ASTMatchFinder.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'clang') diff --git a/clang/lib/ASTMatchers/ASTMatchFinder.cpp b/clang/lib/ASTMatchers/ASTMatchFinder.cpp index 9ed86177b7f..5dc67e17c97 100644 --- a/clang/lib/ASTMatchers/ASTMatchFinder.cpp +++ b/clang/lib/ASTMatchers/ASTMatchFinder.cpp @@ -419,8 +419,10 @@ public: BoundNodesTreeBuilder *Builder, TraversalKind Traversal, BindKind Bind) { - return matchesRecursively(Node, Matcher, Builder, 1, Traversal, - Bind); + if (ResultCache.size() > MaxMemoizationEntries) + ResultCache.clear(); + return memoizedMatchesRecursively(Node, Matcher, Builder, 1, Traversal, + Bind); } // Implements ASTMatchFinder::matchesDescendantOf. virtual bool matchesDescendantOf(const ast_type_traits::DynTypedNode &Node, -- cgit v1.2.3