Hi klimek,

Replace std::list<> and std::vector<> with plain arrays to reduce the number of 
symbols in the object file for Registry.cpp.
Some compilers where failing with this file because the number of symbols was 
above 2**15.

http://llvm-reviews.chandlerc.com/D948

Files:
  lib/ASTMatchers/Dynamic/Marshallers.h

Index: lib/ASTMatchers/Dynamic/Marshallers.h
===================================================================
--- lib/ASTMatchers/Dynamic/Marshallers.h
+++ lib/ASTMatchers/Dynamic/Marshallers.h
@@ -20,9 +20,7 @@
 #ifndef LLVM_CLANG_AST_MATCHERS_DYNAMIC_MARSHALLERS_H
 #define LLVM_CLANG_AST_MATCHERS_DYNAMIC_MARSHALLERS_H
 
-#include <list>
 #include <string>
-#include <vector>
 
 #include "clang/ASTMatchers/ASTMatchers.h"
 #include "clang/ASTMatchers/Dynamic/Diagnostics.h"
@@ -158,6 +156,9 @@
               ArgTypeTraits<ArgType2>::get(Args[1].Value)).clone();
 }
 
+#undef CHECK_ARG_COUNT
+#undef CHECK_ARG_TYPE
+
 /// \brief Variadic marshaller function.
 template <typename BaseType, typename DerivedType>
 class VariadicMatcherCreateCallback : public MatcherCreateCallback {
@@ -169,25 +170,37 @@
 
   DynTypedMatcher *run(const SourceRange &NameRange, ArrayRef<ParserValue> 
Args,
                        Diagnostics *Error) const {
-    std::list<DerivedMatcherType> References;
-    std::vector<const DerivedMatcherType *> InnerArgs(Args.size());
-    for (size_t i = 0, e = Args.size(); i != e; ++i) {
-      CHECK_ARG_TYPE(i, DerivedMatcherType);
-      References.push_back(
-          ArgTypeTraits<DerivedMatcherType>::get(Args[i].Value));
-      InnerArgs[i] = &References.back();
+    DerivedMatcherType **InnerArgs = new DerivedMatcherType *[Args.size()]();
+
+    bool HasError = false;
+    for (size_t I = 0, E = Args.size(); I != E; ++I) {
+      if (!Args[I].Value.isTypedMatcher<DerivedType>()) {
+        Error->pushErrorFrame(Args[I].Range, Error->ET_RegistryWrongArgType)
+            << MatcherName << (I + 1);
+        HasError = true;
+        break;
+      }
+      InnerArgs[I] =
+          new DerivedMatcherType(Args[I].Value.getTypedMatcher<DerivedType>());
+    }
+
+    DynTypedMatcher *Out = NULL;
+    if (!HasError) {
+      Out = ast_matchers::internal::makeDynCastAllOfComposite<BaseType>(
+          ArrayRef<const DerivedMatcherType *>(InnerArgs, 
Args.size())).clone();
     }
-    return ast_matchers::internal::makeDynCastAllOfComposite<BaseType>(
-        ArrayRef<const DerivedMatcherType *>(InnerArgs)).clone();
+
+    for (size_t I = 0, E = Args.size(); I != E; ++I) {
+      delete InnerArgs[I];
+    }
+    delete[] InnerArgs;
+    return Out;
   }
 
 private:
   const std::string MatcherName;
 };
 
-#undef CHECK_ARG_COUNT
-#undef CHECK_ARG_TYPE
-
 /// Helper functions to select the appropriate marshaller functions.
 /// They detects the number of arguments, arguments types and return type.
Index: lib/ASTMatchers/Dynamic/Marshallers.h
===================================================================
--- lib/ASTMatchers/Dynamic/Marshallers.h
+++ lib/ASTMatchers/Dynamic/Marshallers.h
@@ -20,9 +20,7 @@
 #ifndef LLVM_CLANG_AST_MATCHERS_DYNAMIC_MARSHALLERS_H
 #define LLVM_CLANG_AST_MATCHERS_DYNAMIC_MARSHALLERS_H
 
-#include <list>
 #include <string>
-#include <vector>
 
 #include "clang/ASTMatchers/ASTMatchers.h"
 #include "clang/ASTMatchers/Dynamic/Diagnostics.h"
@@ -158,6 +156,9 @@
               ArgTypeTraits<ArgType2>::get(Args[1].Value)).clone();
 }
 
+#undef CHECK_ARG_COUNT
+#undef CHECK_ARG_TYPE
+
 /// \brief Variadic marshaller function.
 template <typename BaseType, typename DerivedType>
 class VariadicMatcherCreateCallback : public MatcherCreateCallback {
@@ -169,25 +170,37 @@
 
   DynTypedMatcher *run(const SourceRange &NameRange, ArrayRef<ParserValue> Args,
                        Diagnostics *Error) const {
-    std::list<DerivedMatcherType> References;
-    std::vector<const DerivedMatcherType *> InnerArgs(Args.size());
-    for (size_t i = 0, e = Args.size(); i != e; ++i) {
-      CHECK_ARG_TYPE(i, DerivedMatcherType);
-      References.push_back(
-          ArgTypeTraits<DerivedMatcherType>::get(Args[i].Value));
-      InnerArgs[i] = &References.back();
+    DerivedMatcherType **InnerArgs = new DerivedMatcherType *[Args.size()]();
+
+    bool HasError = false;
+    for (size_t I = 0, E = Args.size(); I != E; ++I) {
+      if (!Args[I].Value.isTypedMatcher<DerivedType>()) {
+        Error->pushErrorFrame(Args[I].Range, Error->ET_RegistryWrongArgType)
+            << MatcherName << (I + 1);
+        HasError = true;
+        break;
+      }
+      InnerArgs[I] =
+          new DerivedMatcherType(Args[I].Value.getTypedMatcher<DerivedType>());
+    }
+
+    DynTypedMatcher *Out = NULL;
+    if (!HasError) {
+      Out = ast_matchers::internal::makeDynCastAllOfComposite<BaseType>(
+          ArrayRef<const DerivedMatcherType *>(InnerArgs, Args.size())).clone();
     }
-    return ast_matchers::internal::makeDynCastAllOfComposite<BaseType>(
-        ArrayRef<const DerivedMatcherType *>(InnerArgs)).clone();
+
+    for (size_t I = 0, E = Args.size(); I != E; ++I) {
+      delete InnerArgs[I];
+    }
+    delete[] InnerArgs;
+    return Out;
   }
 
 private:
   const std::string MatcherName;
 };
 
-#undef CHECK_ARG_COUNT
-#undef CHECK_ARG_TYPE
-
 /// Helper functions to select the appropriate marshaller functions.
 /// They detects the number of arguments, arguments types and return type.
 
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to