From 999abb993e8bd951ec21e10a9d5390734f5d94c6 Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 30 Oct 2013 19:04:18 -0400 Subject: macro: Add extra indentation to placeholder substitution code The next commit will make this block conditional so pre-indent it to clarify the simplicity of the change. --- Source/cmMacroCommand.cxx | 102 +++++++++++++++++++++++----------------------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/Source/cmMacroCommand.cxx b/Source/cmMacroCommand.cxx index fd6537f..eda82dd 100644 --- a/Source/cmMacroCommand.cxx +++ b/Source/cmMacroCommand.cxx @@ -140,75 +140,75 @@ bool cmMacroHelperCommand::InvokeInitialPass // 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) - { - variable = "${"; - variable += this->Args[j]; - variable += "}"; - cmSystemTools::ReplaceString(tmps, variable.c_str(), - expandedArgs[j-1].c_str()); - } - // replace argc - cmSystemTools::ReplaceString(tmps, "${ARGC}",argcDef.c_str()); + tmps = k->Value; + // replace formal arguments + for (unsigned int j = 1; j < this->Args.size(); ++j) + { + variable = "${"; + variable += this->Args[j]; + variable += "}"; + cmSystemTools::ReplaceString(tmps, variable.c_str(), + expandedArgs[j-1].c_str()); + } + // replace argc + cmSystemTools::ReplaceString(tmps, "${ARGC}",argcDef.c_str()); - // repleace ARGN - if (tmps.find("${ARGN}") != std::string::npos) - { - if (!argnDefInitialized) + // repleace ARGN + if (tmps.find("${ARGN}") != std::string::npos) { - std::vector::const_iterator eit; - std::vector::size_type cnt = 0; - for ( eit = expandedArgs.begin(); eit != expandedArgs.end(); ++eit ) + if (!argnDefInitialized) { - if ( cnt >= this->Args.size()-1 ) + std::vector::const_iterator eit; + std::vector::size_type cnt = 0; + for(eit = expandedArgs.begin(); eit != expandedArgs.end(); ++eit) { - if ( argnDef.size() > 0 ) + if ( cnt >= this->Args.size()-1 ) { - argnDef += ";"; + if ( argnDef.size() > 0 ) + { + argnDef += ";"; + } + argnDef += *eit; } - argnDef += *eit; + cnt ++; } - cnt ++; + argnDefInitialized = true; } - argnDefInitialized = true; + cmSystemTools::ReplaceString(tmps, "${ARGN}", argnDef.c_str()); } - cmSystemTools::ReplaceString(tmps, "${ARGN}", argnDef.c_str()); - } - - // if the current argument of the current function has ${ARGV in it - // then try replacing ARGV values - if (tmps.find("${ARGV") != std::string::npos) - { - char argvName[60]; - // repleace ARGV, compute it only once - if (!argvDefInitialized) + // if the current argument of the current function has ${ARGV in it + // then try replacing ARGV values + if (tmps.find("${ARGV") != std::string::npos) { - std::vector::const_iterator eit; - for ( eit = expandedArgs.begin(); eit != expandedArgs.end(); ++eit ) + char argvName[60]; + + // repleace ARGV, compute it only once + if (!argvDefInitialized) { - if ( argvDef.size() > 0 ) + std::vector::const_iterator eit; + for(eit = expandedArgs.begin(); eit != expandedArgs.end(); ++eit) { - argvDef += ";"; + if ( argvDef.size() > 0 ) + { + argvDef += ";"; + } + argvDef += *eit; } - argvDef += *eit; + argvDefInitialized = true; } - argvDefInitialized = true; - } - cmSystemTools::ReplaceString(tmps, "${ARGV}", argvDef.c_str()); + cmSystemTools::ReplaceString(tmps, "${ARGV}", argvDef.c_str()); - // also replace the ARGV1 ARGV2 ... etc - for (unsigned int t = 0; t < expandedArgs.size(); ++t) - { - sprintf(argvName,"${ARGV%i}",t); - cmSystemTools::ReplaceString(tmps, argvName, - expandedArgs[t].c_str()); + // also replace the ARGV1 ARGV2 ... etc + for (unsigned int t = 0; t < expandedArgs.size(); ++t) + { + sprintf(argvName,"${ARGV%i}",t); + cmSystemTools::ReplaceString(tmps, argvName, + expandedArgs[t].c_str()); + } } - } - arg.Value = tmps; + arg.Value = tmps; arg.Delim = k->Delim; arg.FilePath = k->FilePath; arg.Line = k->Line; -- cgit v0.12 From ccdf7e04d451ac9fa877835d7c167b8bbda70686 Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 30 Oct 2013 19:12:28 -0400 Subject: macro: Do not substitute for placeholders in bracket arguments Fix the macro command implementation to avoid substituting macro placeholders in bracket arguments recorded inside the macro block. --- Source/cmMacroCommand.cxx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Source/cmMacroCommand.cxx b/Source/cmMacroCommand.cxx index eda82dd..499d3c6 100644 --- a/Source/cmMacroCommand.cxx +++ b/Source/cmMacroCommand.cxx @@ -140,6 +140,12 @@ bool cmMacroHelperCommand::InvokeInitialPass // 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(); + if(k->Delim == cmListFileArgument::Bracket) + { + arg.Value = k->Value; + } + else + { tmps = k->Value; // replace formal arguments for (unsigned int j = 1; j < this->Args.size(); ++j) @@ -209,6 +215,7 @@ bool cmMacroHelperCommand::InvokeInitialPass } arg.Value = tmps; + } arg.Delim = k->Delim; arg.FilePath = k->FilePath; arg.Line = k->Line; -- cgit v0.12 From b54dbebf6259eb9fb688b1857e84cfcc2ffdbbe1 Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 30 Oct 2013 19:12:59 -0400 Subject: Test foreach/function/macro handling of bracket arguments Bracket arguments recorded in command invocations inside foreach, function, and macro blocks should not have any replacements done when the arguments are replayed later. Teach the RunCMake.Syntax test to cover these cases. --- Tests/RunCMake/Syntax/ForEachBracket1-stderr.txt | 2 ++ Tests/RunCMake/Syntax/ForEachBracket1.cmake | 3 +++ Tests/RunCMake/Syntax/FunctionBracket1-stderr.txt | 2 ++ Tests/RunCMake/Syntax/FunctionBracket1.cmake | 6 ++++++ Tests/RunCMake/Syntax/MacroBracket1-stderr.txt | 2 ++ Tests/RunCMake/Syntax/MacroBracket1.cmake | 6 ++++++ Tests/RunCMake/Syntax/RunCMakeTest.cmake | 3 +++ 7 files changed, 24 insertions(+) create mode 100644 Tests/RunCMake/Syntax/ForEachBracket1-stderr.txt create mode 100644 Tests/RunCMake/Syntax/ForEachBracket1.cmake create mode 100644 Tests/RunCMake/Syntax/FunctionBracket1-stderr.txt create mode 100644 Tests/RunCMake/Syntax/FunctionBracket1.cmake create mode 100644 Tests/RunCMake/Syntax/MacroBracket1-stderr.txt create mode 100644 Tests/RunCMake/Syntax/MacroBracket1.cmake diff --git a/Tests/RunCMake/Syntax/ForEachBracket1-stderr.txt b/Tests/RunCMake/Syntax/ForEachBracket1-stderr.txt new file mode 100644 index 0000000..93c31cf --- /dev/null +++ b/Tests/RunCMake/Syntax/ForEachBracket1-stderr.txt @@ -0,0 +1,2 @@ +^\${x}:a +\${x}:b$ diff --git a/Tests/RunCMake/Syntax/ForEachBracket1.cmake b/Tests/RunCMake/Syntax/ForEachBracket1.cmake new file mode 100644 index 0000000..a55e21f --- /dev/null +++ b/Tests/RunCMake/Syntax/ForEachBracket1.cmake @@ -0,0 +1,3 @@ +foreach(x a b) + message([[${x}:]] "${x}") +endforeach() diff --git a/Tests/RunCMake/Syntax/FunctionBracket1-stderr.txt b/Tests/RunCMake/Syntax/FunctionBracket1-stderr.txt new file mode 100644 index 0000000..9ba6179 --- /dev/null +++ b/Tests/RunCMake/Syntax/FunctionBracket1-stderr.txt @@ -0,0 +1,2 @@ +^\${x},\${ARGN},\${ARGC},\${ARGV},\${ARGV0},\${ARGV1},\${ARGV2}:a,n,2,a;n,a,n, +\${x},\${ARGN},\${ARGC},\${ARGV},\${ARGV0},\${ARGV1},\${ARGV2}:b,n,2,b;n,b,n,$ diff --git a/Tests/RunCMake/Syntax/FunctionBracket1.cmake b/Tests/RunCMake/Syntax/FunctionBracket1.cmake new file mode 100644 index 0000000..8ed4f65 --- /dev/null +++ b/Tests/RunCMake/Syntax/FunctionBracket1.cmake @@ -0,0 +1,6 @@ +function(fun x) + message([[${x},${ARGN},${ARGC},${ARGV},${ARGV0},${ARGV1},${ARGV2}:]] + "${x},${ARGN},${ARGC},${ARGV},${ARGV0},${ARGV1},${ARGV2}") +endfunction(fun) +fun(a n) +fun(b n) diff --git a/Tests/RunCMake/Syntax/MacroBracket1-stderr.txt b/Tests/RunCMake/Syntax/MacroBracket1-stderr.txt new file mode 100644 index 0000000..9ba6179 --- /dev/null +++ b/Tests/RunCMake/Syntax/MacroBracket1-stderr.txt @@ -0,0 +1,2 @@ +^\${x},\${ARGN},\${ARGC},\${ARGV},\${ARGV0},\${ARGV1},\${ARGV2}:a,n,2,a;n,a,n, +\${x},\${ARGN},\${ARGC},\${ARGV},\${ARGV0},\${ARGV1},\${ARGV2}:b,n,2,b;n,b,n,$ diff --git a/Tests/RunCMake/Syntax/MacroBracket1.cmake b/Tests/RunCMake/Syntax/MacroBracket1.cmake new file mode 100644 index 0000000..ef6de20 --- /dev/null +++ b/Tests/RunCMake/Syntax/MacroBracket1.cmake @@ -0,0 +1,6 @@ +macro(mac x) + message([[${x},${ARGN},${ARGC},${ARGV},${ARGV0},${ARGV1},${ARGV2}:]] + "${x},${ARGN},${ARGC},${ARGV},${ARGV0},${ARGV1},${ARGV2}") +endmacro(mac) +mac(a n) +mac(b n) diff --git a/Tests/RunCMake/Syntax/RunCMakeTest.cmake b/Tests/RunCMake/Syntax/RunCMakeTest.cmake index 4f42a07..5f05cfc 100644 --- a/Tests/RunCMake/Syntax/RunCMakeTest.cmake +++ b/Tests/RunCMake/Syntax/RunCMakeTest.cmake @@ -12,6 +12,9 @@ run_cmake(CommandComments) run_cmake(CommandError0) run_cmake(CommandError1) run_cmake(CommandError2) +run_cmake(ForEachBracket1) +run_cmake(FunctionBracket1) +run_cmake(MacroBracket1) run_cmake(String0) run_cmake(String1) run_cmake(StringBackslash) -- cgit v0.12