diff options
author | Samuel Benzaquen <sbenza@google.com> | 2014-11-20 15:45:53 +0000 |
---|---|---|
committer | Samuel Benzaquen <sbenza@google.com> | 2014-11-20 15:45:53 +0000 |
commit | 2c15e8ccce4158570d02441fb34d5bb24ba3f868 (patch) | |
tree | def029c9f9d90600bf2e37bb50fc6edbaa0fb842 /clang/lib | |
parent | b1f871cdcb4776ccf46431625dfb8d57817ea52d (diff) | |
download | bcm5719-llvm-2c15e8ccce4158570d02441fb34d5bb24ba3f868.tar.gz bcm5719-llvm-2c15e8ccce4158570d02441fb34d5bb24ba3f868.zip |
Replace variadic operator function pointer with an enum value.
Summary:
Replace variadic operator function pointer with an enum value.
Hiding the implementation of the variadic matcher will allow to specialize them for the operation performed.
In particular, it will allow for a more efficient allOf() matcher.
Reviewers: klimek
Subscribers: klimek, cfe-commits
Differential Revision: http://reviews.llvm.org/D6293
llvm-svn: 222432
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/ASTMatchers/ASTMatchersInternal.cpp | 50 | ||||
-rw-r--r-- | clang/lib/ASTMatchers/Dynamic/Marshallers.h | 12 | ||||
-rw-r--r-- | clang/lib/ASTMatchers/Dynamic/VariantValue.cpp | 16 |
3 files changed, 59 insertions, 19 deletions
diff --git a/clang/lib/ASTMatchers/ASTMatchersInternal.cpp b/clang/lib/ASTMatchers/ASTMatchersInternal.cpp index af6f0abfb9b..c7d98b8a3a9 100644 --- a/clang/lib/ASTMatchers/ASTMatchersInternal.cpp +++ b/clang/lib/ASTMatchers/ASTMatchersInternal.cpp @@ -20,6 +20,26 @@ namespace clang { namespace ast_matchers { namespace internal { +bool NotUnaryOperator(const ast_type_traits::DynTypedNode DynNode, + ASTMatchFinder *Finder, BoundNodesTreeBuilder *Builder, + ArrayRef<DynTypedMatcher> InnerMatchers); + +bool AllOfVariadicOperator(const ast_type_traits::DynTypedNode DynNode, + ASTMatchFinder *Finder, + BoundNodesTreeBuilder *Builder, + ArrayRef<DynTypedMatcher> InnerMatchers); + +bool EachOfVariadicOperator(const ast_type_traits::DynTypedNode DynNode, + ASTMatchFinder *Finder, + BoundNodesTreeBuilder *Builder, + ArrayRef<DynTypedMatcher> InnerMatchers); + +bool AnyOfVariadicOperator(const ast_type_traits::DynTypedNode DynNode, + ASTMatchFinder *Finder, + BoundNodesTreeBuilder *Builder, + ArrayRef<DynTypedMatcher> InnerMatchers); + + void BoundNodesTreeBuilder::visitMatches(Visitor *ResultVisitor) { if (Bindings.empty()) Bindings.push_back(BoundNodesMap()); @@ -31,8 +51,12 @@ void BoundNodesTreeBuilder::visitMatches(Visitor *ResultVisitor) { namespace { class VariadicMatcher : public DynMatcherInterface { - public: - VariadicMatcher(DynTypedMatcher::VariadicOperatorFunction Func, +public: + typedef bool (*VariadicOperatorFunction)( + const ast_type_traits::DynTypedNode DynNode, ASTMatchFinder *Finder, + BoundNodesTreeBuilder *Builder, ArrayRef<DynTypedMatcher> InnerMatchers); + + VariadicMatcher(VariadicOperatorFunction Func, std::vector<DynTypedMatcher> InnerMatchers) : Func(Func), InnerMatchers(std::move(InnerMatchers)) {} @@ -42,8 +66,8 @@ class VariadicMatcher : public DynMatcherInterface { return Func(DynNode, Finder, Builder, InnerMatchers); } - private: - DynTypedMatcher::VariadicOperatorFunction Func; +private: + VariadicOperatorFunction Func; std::vector<DynTypedMatcher> InnerMatchers; }; @@ -86,7 +110,7 @@ static llvm::ManagedStatic<TrueMatcherImpl> TrueMatcherInstance; } // namespace DynTypedMatcher DynTypedMatcher::constructVariadic( - DynTypedMatcher::VariadicOperatorFunction Func, + DynTypedMatcher::VariadicOperator Op, std::vector<DynTypedMatcher> InnerMatchers) { assert(InnerMatchers.size() > 0 && "Array must not be empty."); assert(std::all_of(InnerMatchers.begin(), InnerMatchers.end(), @@ -100,6 +124,22 @@ DynTypedMatcher DynTypedMatcher::constructVariadic( // Make it the same as SupportedKind, since that is the broadest type we are // allowed to accept. auto SupportedKind = InnerMatchers[0].SupportedKind; + VariadicMatcher::VariadicOperatorFunction Func; + switch (Op) { + case VO_AllOf: + Func = AllOfVariadicOperator; + break; + case VO_AnyOf: + Func = AnyOfVariadicOperator; + break; + case VO_EachOf: + Func = EachOfVariadicOperator; + break; + case VO_UnaryNot: + Func = NotUnaryOperator; + break; + } + return DynTypedMatcher(SupportedKind, SupportedKind, new VariadicMatcher(Func, std::move(InnerMatchers))); } diff --git a/clang/lib/ASTMatchers/Dynamic/Marshallers.h b/clang/lib/ASTMatchers/Dynamic/Marshallers.h index 42c880e80ef..b78bc038199 100644 --- a/clang/lib/ASTMatchers/Dynamic/Marshallers.h +++ b/clang/lib/ASTMatchers/Dynamic/Marshallers.h @@ -556,10 +556,10 @@ private: /// \brief Variadic operator marshaller function. class VariadicOperatorMatcherDescriptor : public MatcherDescriptor { public: - typedef DynTypedMatcher::VariadicOperatorFunction VarFunc; + typedef DynTypedMatcher::VariadicOperator VarOp; VariadicOperatorMatcherDescriptor(unsigned MinCount, unsigned MaxCount, - VarFunc Func, StringRef MatcherName) - : MinCount(MinCount), MaxCount(MaxCount), Func(Func), + VarOp Op, StringRef MatcherName) + : MinCount(MinCount), MaxCount(MaxCount), Op(Op), MatcherName(MatcherName) {} virtual VariantMatcher create(const SourceRange &NameRange, @@ -584,7 +584,7 @@ public: } InnerArgs.push_back(Value.getMatcher()); } - return VariantMatcher::VariadicOperatorMatcher(Func, std::move(InnerArgs)); + return VariantMatcher::VariadicOperatorMatcher(Op, std::move(InnerArgs)); } bool isVariadic() const override { return true; } @@ -606,7 +606,7 @@ public: private: const unsigned MinCount; const unsigned MaxCount; - const VarFunc Func; + const VarOp Op; const StringRef MatcherName; }; @@ -699,7 +699,7 @@ MatcherDescriptor * makeMatcherAutoMarshall(ast_matchers::internal::VariadicOperatorMatcherFunc< MinCount, MaxCount> Func, StringRef MatcherName) { - return new VariadicOperatorMatcherDescriptor(MinCount, MaxCount, Func.Func, + return new VariadicOperatorMatcherDescriptor(MinCount, MaxCount, Func.Op, MatcherName); } diff --git a/clang/lib/ASTMatchers/Dynamic/VariantValue.cpp b/clang/lib/ASTMatchers/Dynamic/VariantValue.cpp index 08b3b1d3f31..a88b7070123 100644 --- a/clang/lib/ASTMatchers/Dynamic/VariantValue.cpp +++ b/clang/lib/ASTMatchers/Dynamic/VariantValue.cpp @@ -58,7 +58,7 @@ VariantMatcher::MatcherOps::canConstructFrom(const DynTypedMatcher &Matcher, llvm::Optional<DynTypedMatcher> VariantMatcher::MatcherOps::constructVariadicOperator( - DynTypedMatcher::VariadicOperatorFunction Func, + DynTypedMatcher::VariadicOperator Op, ArrayRef<VariantMatcher> InnerMatchers) const { std::vector<DynTypedMatcher> DynMatchers; for (const auto &InnerMatcher : InnerMatchers) { @@ -72,7 +72,7 @@ VariantMatcher::MatcherOps::constructVariadicOperator( return llvm::None; DynMatchers.push_back(*Inner); } - return DynTypedMatcher::constructVariadic(Func, DynMatchers); + return DynTypedMatcher::constructVariadic(Op, DynMatchers); } VariantMatcher::Payload::~Payload() {} @@ -176,9 +176,9 @@ public: class VariantMatcher::VariadicOpPayload : public VariantMatcher::Payload { public: - VariadicOpPayload(DynTypedMatcher::VariadicOperatorFunction Func, + VariadicOpPayload(DynTypedMatcher::VariadicOperator Op, std::vector<VariantMatcher> Args) - : Func(Func), Args(std::move(Args)) {} + : Op(Op), Args(std::move(Args)) {} llvm::Optional<DynTypedMatcher> getSingleMatcher() const override { return llvm::Optional<DynTypedMatcher>(); @@ -196,7 +196,7 @@ public: llvm::Optional<DynTypedMatcher> getTypedMatcher(const MatcherOps &Ops) const override { - return Ops.constructVariadicOperator(Func, Args); + return Ops.constructVariadicOperator(Op, Args); } bool isConvertibleTo(ast_type_traits::ASTNodeKind Kind, @@ -209,7 +209,7 @@ public: } private: - const DynTypedMatcher::VariadicOperatorFunction Func; + const DynTypedMatcher::VariadicOperator Op; const std::vector<VariantMatcher> Args; }; @@ -225,9 +225,9 @@ VariantMatcher::PolymorphicMatcher(std::vector<DynTypedMatcher> Matchers) { } VariantMatcher VariantMatcher::VariadicOperatorMatcher( - DynTypedMatcher::VariadicOperatorFunction Func, + DynTypedMatcher::VariadicOperator Op, std::vector<VariantMatcher> Args) { - return VariantMatcher(new VariadicOpPayload(Func, std::move(Args))); + return VariantMatcher(new VariadicOpPayload(Op, std::move(Args))); } llvm::Optional<DynTypedMatcher> VariantMatcher::getSingleMatcher() const { |