Author: jlebar Date: Mon Oct 10 11:26:40 2016 New Revision: 283773 URL: http://llvm.org/viewvc/llvm-project?rev=283773&view=rev Log: [AST] Convert Marshallers to use unique_ptr.
Reviewers: timshen Subscribers: cfe-commits, klimek Differential Revision: https://reviews.llvm.org/D25425 Modified: cfe/trunk/lib/ASTMatchers/Dynamic/Marshallers.h cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp Modified: cfe/trunk/lib/ASTMatchers/Dynamic/Marshallers.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ASTMatchers/Dynamic/Marshallers.h?rev=283773&r1=283772&r2=283773&view=diff ============================================================================== --- cfe/trunk/lib/ASTMatchers/Dynamic/Marshallers.h (original) +++ cfe/trunk/lib/ASTMatchers/Dynamic/Marshallers.h Mon Oct 10 11:26:40 2016 @@ -480,8 +480,8 @@ template <template <typename ToArg, type typename FromTypes, typename ToTypes> class AdaptativeOverloadCollector { public: - AdaptativeOverloadCollector(StringRef Name, - std::vector<MatcherDescriptor *> &Out) + AdaptativeOverloadCollector( + StringRef Name, std::vector<std::unique_ptr<MatcherDescriptor>> &Out) : Name(Name), Out(Out) { collect(FromTypes()); } @@ -499,7 +499,7 @@ private: inline void collect(FromTypeList); StringRef Name; - std::vector<MatcherDescriptor *> &Out; + std::vector<std::unique_ptr<MatcherDescriptor>> &Out; }; /// \brief MatcherDescriptor that wraps multiple "overloads" of the same @@ -509,8 +509,10 @@ private: /// more than one overloads match the arguments. class OverloadedMatcherDescriptor : public MatcherDescriptor { public: - OverloadedMatcherDescriptor(ArrayRef<MatcherDescriptor *> Callbacks) - : Overloads(Callbacks.begin(), Callbacks.end()) {} + OverloadedMatcherDescriptor( + MutableArrayRef<std::unique_ptr<MatcherDescriptor>> Callbacks) + : Overloads(std::make_move_iterator(Callbacks.begin()), + std::make_move_iterator(Callbacks.end())) {} ~OverloadedMatcherDescriptor() override {} @@ -641,36 +643,37 @@ private: /// \brief 0-arg overload template <typename ReturnType> -MatcherDescriptor *makeMatcherAutoMarshall(ReturnType (*Func)(), - StringRef MatcherName) { +std::unique_ptr<MatcherDescriptor> +makeMatcherAutoMarshall(ReturnType (*Func)(), StringRef MatcherName) { std::vector<ast_type_traits::ASTNodeKind> RetTypes; BuildReturnTypeVector<ReturnType>::build(RetTypes); - return new FixedArgCountMatcherDescriptor( + return llvm::make_unique<FixedArgCountMatcherDescriptor>( matcherMarshall0<ReturnType>, reinterpret_cast<void (*)()>(Func), MatcherName, RetTypes, None); } /// \brief 1-arg overload template <typename ReturnType, typename ArgType1> -MatcherDescriptor *makeMatcherAutoMarshall(ReturnType (*Func)(ArgType1), - StringRef MatcherName) { +std::unique_ptr<MatcherDescriptor> +makeMatcherAutoMarshall(ReturnType (*Func)(ArgType1), StringRef MatcherName) { std::vector<ast_type_traits::ASTNodeKind> RetTypes; BuildReturnTypeVector<ReturnType>::build(RetTypes); ArgKind AK = ArgTypeTraits<ArgType1>::getKind(); - return new FixedArgCountMatcherDescriptor( + return llvm::make_unique<FixedArgCountMatcherDescriptor>( matcherMarshall1<ReturnType, ArgType1>, reinterpret_cast<void (*)()>(Func), MatcherName, RetTypes, AK); } /// \brief 2-arg overload template <typename ReturnType, typename ArgType1, typename ArgType2> -MatcherDescriptor *makeMatcherAutoMarshall(ReturnType (*Func)(ArgType1, ArgType2), - StringRef MatcherName) { +std::unique_ptr<MatcherDescriptor> +makeMatcherAutoMarshall(ReturnType (*Func)(ArgType1, ArgType2), + StringRef MatcherName) { std::vector<ast_type_traits::ASTNodeKind> RetTypes; BuildReturnTypeVector<ReturnType>::build(RetTypes); ArgKind AKs[] = { ArgTypeTraits<ArgType1>::getKind(), ArgTypeTraits<ArgType2>::getKind() }; - return new FixedArgCountMatcherDescriptor( + return llvm::make_unique<FixedArgCountMatcherDescriptor>( matcherMarshall2<ReturnType, ArgType1, ArgType2>, reinterpret_cast<void (*)()>(Func), MatcherName, RetTypes, AKs); } @@ -678,10 +681,10 @@ MatcherDescriptor *makeMatcherAutoMarsha /// \brief Variadic overload. template <typename ResultT, typename ArgT, ResultT (*Func)(ArrayRef<const ArgT *>)> -MatcherDescriptor *makeMatcherAutoMarshall( +std::unique_ptr<MatcherDescriptor> makeMatcherAutoMarshall( ast_matchers::internal::VariadicFunction<ResultT, ArgT, Func> VarFunc, StringRef MatcherName) { - return new VariadicFuncMatcherDescriptor(VarFunc, MatcherName); + return llvm::make_unique<VariadicFuncMatcherDescriptor>(VarFunc, MatcherName); } /// \brief Overload for VariadicDynCastAllOfMatchers. @@ -689,24 +692,24 @@ MatcherDescriptor *makeMatcherAutoMarsha /// Not strictly necessary, but DynCastAllOfMatcherDescriptor gives us better /// completion results for that type of matcher. template <typename BaseT, typename DerivedT> -MatcherDescriptor * -makeMatcherAutoMarshall(ast_matchers::internal::VariadicDynCastAllOfMatcher< - BaseT, DerivedT> VarFunc, - StringRef MatcherName) { - return new DynCastAllOfMatcherDescriptor(VarFunc, MatcherName); +std::unique_ptr<MatcherDescriptor> makeMatcherAutoMarshall( + ast_matchers::internal::VariadicDynCastAllOfMatcher<BaseT, DerivedT> + VarFunc, + StringRef MatcherName) { + return llvm::make_unique<DynCastAllOfMatcherDescriptor>(VarFunc, MatcherName); } /// \brief Argument adaptative overload. template <template <typename ToArg, typename FromArg> class ArgumentAdapterT, typename FromTypes, typename ToTypes> -MatcherDescriptor * -makeMatcherAutoMarshall(ast_matchers::internal::ArgumentAdaptingMatcherFunc< - ArgumentAdapterT, FromTypes, ToTypes>, - StringRef MatcherName) { - std::vector<MatcherDescriptor *> Overloads; +std::unique_ptr<MatcherDescriptor> makeMatcherAutoMarshall( + ast_matchers::internal::ArgumentAdaptingMatcherFunc<ArgumentAdapterT, + FromTypes, ToTypes>, + StringRef MatcherName) { + std::vector<std::unique_ptr<MatcherDescriptor>> Overloads; AdaptativeOverloadCollector<ArgumentAdapterT, FromTypes, ToTypes>(MatcherName, Overloads); - return new OverloadedMatcherDescriptor(Overloads); + return llvm::make_unique<OverloadedMatcherDescriptor>(Overloads); } template <template <typename ToArg, typename FromArg> class ArgumentAdapterT, @@ -721,12 +724,12 @@ inline void AdaptativeOverloadCollector< /// \brief Variadic operator overload. template <unsigned MinCount, unsigned MaxCount> -MatcherDescriptor * -makeMatcherAutoMarshall(ast_matchers::internal::VariadicOperatorMatcherFunc< - MinCount, MaxCount> Func, - StringRef MatcherName) { - return new VariadicOperatorMatcherDescriptor(MinCount, MaxCount, Func.Op, - MatcherName); +std::unique_ptr<MatcherDescriptor> makeMatcherAutoMarshall( + ast_matchers::internal::VariadicOperatorMatcherFunc<MinCount, MaxCount> + Func, + StringRef MatcherName) { + return llvm::make_unique<VariadicOperatorMatcherDescriptor>( + MinCount, MaxCount, Func.Op, MatcherName); } } // namespace internal Modified: cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp?rev=283773&r1=283772&r2=283773&view=diff ============================================================================== --- cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp (original) +++ cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp Mon Oct 10 11:26:40 2016 @@ -31,7 +31,7 @@ namespace { using internal::MatcherDescriptor; -typedef llvm::StringMap<const MatcherDescriptor *> ConstructorMap; +typedef llvm::StringMap<std::unique_ptr<const MatcherDescriptor>> ConstructorMap; class RegistryMaps { public: RegistryMaps(); @@ -40,14 +40,16 @@ public: const ConstructorMap &constructors() const { return Constructors; } private: - void registerMatcher(StringRef MatcherName, MatcherDescriptor *Callback); + void registerMatcher(StringRef MatcherName, + std::unique_ptr<MatcherDescriptor> Callback); + ConstructorMap Constructors; }; -void RegistryMaps::registerMatcher(StringRef MatcherName, - MatcherDescriptor *Callback) { +void RegistryMaps::registerMatcher( + StringRef MatcherName, std::unique_ptr<MatcherDescriptor> Callback) { assert(Constructors.find(MatcherName) == Constructors.end()); - Constructors[MatcherName] = Callback; + Constructors[MatcherName] = std::move(Callback); } #define REGISTER_MATCHER(name) \ @@ -55,19 +57,19 @@ void RegistryMaps::registerMatcher(Strin ::clang::ast_matchers::name, #name)); #define SPECIFIC_MATCHER_OVERLOAD(name, Id) \ - static_cast< ::clang::ast_matchers::name##_Type##Id>( \ + static_cast<::clang::ast_matchers::name##_Type##Id>( \ ::clang::ast_matchers::name) #define REGISTER_OVERLOADED_2(name) \ do { \ - MatcherDescriptor *Callbacks[] = { \ - internal::makeMatcherAutoMarshall(SPECIFIC_MATCHER_OVERLOAD(name, 0), \ - #name), \ - internal::makeMatcherAutoMarshall(SPECIFIC_MATCHER_OVERLOAD(name, 1), \ - #name) \ - }; \ - registerMatcher(#name, \ - new internal::OverloadedMatcherDescriptor(Callbacks)); \ + std::unique_ptr<MatcherDescriptor> Callbacks[] = { \ + internal::makeMatcherAutoMarshall(SPECIFIC_MATCHER_OVERLOAD(name, 0), \ + #name), \ + internal::makeMatcherAutoMarshall(SPECIFIC_MATCHER_OVERLOAD(name, 1), \ + #name)}; \ + registerMatcher( \ + #name, \ + llvm::make_unique<internal::OverloadedMatcherDescriptor>(Callbacks)); \ } while (0) /// \brief Generate a registry map with all the known matchers. @@ -426,9 +428,7 @@ RegistryMaps::RegistryMaps() { REGISTER_MATCHER(withInitializer); } -RegistryMaps::~RegistryMaps() { - llvm::DeleteContainerSeconds(Constructors); -} +RegistryMaps::~RegistryMaps() {} static llvm::ManagedStatic<RegistryMaps> RegistryData; @@ -436,11 +436,10 @@ static llvm::ManagedStatic<RegistryMaps> // static llvm::Optional<MatcherCtor> Registry::lookupMatcherCtor(StringRef MatcherName) { - ConstructorMap::const_iterator it = - RegistryData->constructors().find(MatcherName); + auto it = RegistryData->constructors().find(MatcherName); return it == RegistryData->constructors().end() ? llvm::Optional<MatcherCtor>() - : it->second; + : it->second.get(); } namespace { @@ -499,12 +498,12 @@ Registry::getMatcherCompletions(ArrayRef // Search the registry for acceptable matchers. for (const auto &M : RegistryData->constructors()) { - const auto *Matcher = M.getValue(); + const MatcherDescriptor& Matcher = *M.getValue(); StringRef Name = M.getKey(); std::set<ASTNodeKind> RetKinds; - unsigned NumArgs = Matcher->isVariadic() ? 1 : Matcher->getNumArgs(); - bool IsPolymorphic = Matcher->isPolymorphic(); + unsigned NumArgs = Matcher.isVariadic() ? 1 : Matcher.getNumArgs(); + bool IsPolymorphic = Matcher.isPolymorphic(); std::vector<std::vector<ArgKind>> ArgsKinds(NumArgs); unsigned MaxSpecificity = 0; for (const ArgKind& Kind : AcceptedTypes) { @@ -512,13 +511,13 @@ Registry::getMatcherCompletions(ArrayRef continue; unsigned Specificity; ASTNodeKind LeastDerivedKind; - if (Matcher->isConvertibleTo(Kind.getMatcherKind(), &Specificity, - &LeastDerivedKind)) { + if (Matcher.isConvertibleTo(Kind.getMatcherKind(), &Specificity, + &LeastDerivedKind)) { if (MaxSpecificity < Specificity) MaxSpecificity = Specificity; RetKinds.insert(LeastDerivedKind); for (unsigned Arg = 0; Arg != NumArgs; ++Arg) - Matcher->getArgKinds(Kind.getMatcherKind(), Arg, ArgsKinds[Arg]); + Matcher.getArgKinds(Kind.getMatcherKind(), Arg, ArgsKinds[Arg]); if (IsPolymorphic) break; } @@ -554,7 +553,7 @@ Registry::getMatcherCompletions(ArrayRef } } } - if (Matcher->isVariadic()) + if (Matcher.isVariadic()) OS << "..."; OS << ")"; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits