Просмотр исходного кода

For macros make sure the FilePath points to a valid pointer in the args.

Bill Hoffman 15 лет назад
Родитель
Сommit
cd626ea66e
2 измененных файлов с 10 добавлено и 3 удалено
  1. 10 2
      Source/cmMacroCommand.cxx
  2. 0 1
      Source/cmMacroCommand.h

+ 10 - 2
Source/cmMacroCommand.cxx

@@ -31,6 +31,7 @@ public:
     // we must copy when we clone
     newC->Args = this->Args;
     newC->Functions = this->Functions;
+    newC->FilePath = this->FilePath;
     newC->Policies = this->Policies;
     return newC;
   }
@@ -78,6 +79,7 @@ public:
   std::vector<std::string> Args;
   std::vector<cmListFileFunction> Functions;
   cmPolicies::PolicyMap Policies;
+  std::string FilePath;
 };
 
 
@@ -121,7 +123,10 @@ bool cmMacroHelperCommand::InvokeInitialPass
   std::string argnDef;
   bool argnDefInitialized = false;
   bool argvDefInitialized = false;
-
+  if( this->Functions.size())
+    {
+    this->FilePath = this->Functions[0].FilePath;
+    }
   // Invoke all the functions that were collected in the block.
   cmListFileFunction newLFF;
   // for each function
@@ -135,10 +140,13 @@ bool cmMacroHelperCommand::InvokeInitialPass
     newLFF.Line = this->Functions[c].Line;
 
     // for each argument of the current function
-    for (std::vector<cmListFileArgument>::const_iterator k = 
+    for (std::vector<cmListFileArgument>::iterator k =
            this->Functions[c].Arguments.begin();
          k != this->Functions[c].Arguments.end(); ++k)
       {
+      // Set the FilePath on the arguments to match the function since it is
+      // not stored and the original values may be freed
+      k->FilePath = this->FilePath.c_str();
       tmps = k->Value;
       // replace formal arguments
       for (unsigned int j = 1; j < this->Args.size(); ++j)

+ 0 - 1
Source/cmMacroCommand.h

@@ -112,7 +112,6 @@ public:
       "policies inside macros."
       ;
     }
-
   cmTypeMacro(cmMacroCommand, cmCommand);
 };