]> granicus.if.org Git - clang/commitdiff
detemplatify setArgumentList and some other cleanups.
authorChris Lattner <sabre@nondot.org>
Fri, 20 Feb 2009 22:31:31 +0000 (22:31 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 20 Feb 2009 22:31:31 +0000 (22:31 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65187 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Lex/MacroInfo.h
lib/Lex/PPDirectives.cpp
lib/Lex/Preprocessor.cpp

index a09c564fd9c68535f1d8d13ce9f9962d0f2b1bf9..7c3136ac11e0eeef6e78b26c3780e2d2fb403280 100644 (file)
@@ -72,16 +72,26 @@ private:
   /// been used, or if it is not defined in the main file.  This is used to 
   /// emit -Wunused-macros diagnostics.
   bool IsUsed : 1;
-public:
-  MacroInfo(SourceLocation DefLoc);
   
   ~MacroInfo() {
     assert(ArgumentList == 0 && "Didn't call destroy before dtor!");
   }
   
-  void Destroy() {
+public:
+  MacroInfo(SourceLocation DefLoc);
+  
+  /// FreeArgumentList - Free the argument list of the macro, restoring it to a
+  /// state where it can be reused for other devious purposes.
+  void FreeArgumentList() {
     delete[] ArgumentList;
     ArgumentList = 0;
+    NumArguments = 0;
+  }
+  
+  /// Destroy - destroy this MacroInfo object.
+  void Destroy() {
+    FreeArgumentList();
+    this->~MacroInfo();
   }
   
   /// getDefinitionLoc - Return the location that the macro was defined at.
@@ -107,15 +117,15 @@ public:
 
   /// setArgumentList - Set the specified list of identifiers as the argument
   /// list for this macro.
-  template<typename ItTy>
-  void setArgumentList(ItTy ArgBegin, ItTy ArgEnd) {
-    assert(ArgumentList == 0 && "Argument list already set!");
-    unsigned NumArgs = ArgEnd-ArgBegin;
+  void setArgumentList(IdentifierInfo* const *List, unsigned NumArgs) {
+    assert(ArgumentList == 0 && NumArguments == 0 &&
+           "Argument list already set!");
     if (NumArgs == 0) return;
+    
     NumArguments = NumArgs;
     ArgumentList = new IdentifierInfo*[NumArgs];
-    for (unsigned i = 0; ArgBegin != ArgEnd; ++i, ++ArgBegin)
-      ArgumentList[i] = *ArgBegin;
+    for (unsigned i = 0; i != NumArgs; ++i)
+      ArgumentList[i] = List[i];
   }
   
   /// Arguments - The list of arguments for a function-like macro.  This can be
index 5a100995b8a685d200fcd68ab04022c6bd227c0e..e6b2f8464d6862580c1b8b6d3a4f40b77419278b 100644 (file)
@@ -40,7 +40,7 @@ MacroInfo *Preprocessor::AllocateMacroInfo(SourceLocation L) {
 ///  be reused for allocating new MacroInfo objects.
 void Preprocessor::ReleaseMacroInfo(MacroInfo* MI) {
   MICache.push_back(MI);
-  MI->Destroy();
+  MI->FreeArgumentList();
 }
 
 
@@ -1097,10 +1097,8 @@ bool Preprocessor::ReadMacroDefinitionArgList(MacroInfo *MI) {
     switch (Tok.getKind()) {
     case tok::r_paren:
       // Found the end of the argument list.
-      if (Arguments.empty()) {  // #define FOO()
-        MI->setArgumentList(Arguments.begin(), Arguments.end());
+      if (Arguments.empty())  // #define FOO()
         return false;
-      }
       // Otherwise we have #define FOO(A,)
       Diag(Tok, diag::err_pp_expected_ident_in_arg_list);
       return true;
@@ -1117,7 +1115,7 @@ bool Preprocessor::ReadMacroDefinitionArgList(MacroInfo *MI) {
       // Add the __VA_ARGS__ identifier as an argument.
       Arguments.push_back(Ident__VA_ARGS__);
       MI->setIsC99Varargs();
-      MI->setArgumentList(Arguments.begin(), Arguments.end());
+      MI->setArgumentList(&Arguments[0], Arguments.size());
       return false;
     case tok::eom:  // #define X(
       Diag(Tok, diag::err_pp_missing_rparen_in_macro_def);
@@ -1151,7 +1149,7 @@ bool Preprocessor::ReadMacroDefinitionArgList(MacroInfo *MI) {
         Diag(Tok, diag::err_pp_expected_comma_in_arg_list);
         return true;
       case tok::r_paren: // #define X(A)
-        MI->setArgumentList(Arguments.begin(), Arguments.end());
+        MI->setArgumentList(&Arguments[0], Arguments.size());
         return false;
       case tok::comma:  // #define X(A,
         break;
@@ -1167,7 +1165,7 @@ bool Preprocessor::ReadMacroDefinitionArgList(MacroInfo *MI) {
         }
           
         MI->setIsGNUVarargs();
-        MI->setArgumentList(Arguments.begin(), Arguments.end());
+        MI->setArgumentList(&Arguments[0], Arguments.size());
         return false;
       }
     }
index 7b34cb65e368464758c23cc51b803a5cf4871edf..a85b5db6d6064f7cf705f2e8367df522689ecf7c 100644 (file)
@@ -102,7 +102,6 @@ Preprocessor::~Preprocessor() {
     // destroyed. We still need to run the dstor, however, to free
     // memory alocated by MacroInfo.
     I->second->Destroy();
-    I->second->~MacroInfo();    
     I->first->setHasMacroDefinition(false);
   }