ENH: change raise_scope signature to be safer for returned varuables

This commit is contained in:
Ken Martin 2008-01-03 11:22:33 -05:00
parent c61a3b6fe9
commit ac4c2f675a
7 changed files with 56 additions and 18 deletions

View File

@ -2846,9 +2846,12 @@ void cmMakefile::PopScope()
this->DefinitionStack.pop_back();
}
void cmMakefile::RaiseScope(const char *var)
void cmMakefile::RaiseScope(const char *var, const char *varDef)
{
const char *varDef = this->GetDefinition(var);
if (!var || !strlen(var))
{
return;
}
// multiple scopes in this directory?
if (this->DefinitionStack.size() > 1)

View File

@ -740,7 +740,7 @@ public:
// push and pop variable scopes
void PushScope();
void PopScope();
void RaiseScope(const char *var);
void RaiseScope(const char *var, const char *value);
protected:
// add link libraries and directories to the target

View File

@ -20,10 +20,20 @@
bool cmRaiseScopeCommand
::InitialPass(std::vector<std::string> const& args)
{
unsigned int i =0;
for(; i < args.size(); ++i)
if (args.size() < 1)
{
this->Makefile->RaiseScope(args[i].c_str());
this->SetError("called with incorrect number of arguments, "
"raise scope must have at least one argument");
return false;
}
if (args.size() == 1)
{
this->Makefile->RaiseScope(args[0].c_str(), 0);
}
else
{
this->Makefile->RaiseScope(args[0].c_str(), args[1].c_str());
}
return true;
}

View File

@ -61,12 +61,13 @@ public:
virtual const char* GetFullDocumentation()
{
return
" raise_scope(VAR VAR2 VAR...)\n"
"Pushes the current state of a variable into the scope above the "
" raise_scope(VAR [VALUE])\n"
"Sets the value of a variable in the scope above the "
"current scope. Each new directory or function creates a new scope. "
"This command will push the current state of a variable into the "
"This command will set the value of a variable into the "
"parent directory or calling function (whichever is applicable to "
"the case at hand)";
"the case at hand) If VALUE is not specified then the variable is "
"removed from the parent scope.";
}
/**

View File

@ -44,16 +44,37 @@ FUNCTION(test_argn_function argument)
ENDFUNCTION(test_argn_function)
Test_Argn_Function(ignored 3)
# test argument naming and raise scope
function(track_find_variable cache_variable is_changed)
raise_scope("${is_changed}" changed)
endfunction(track_find_variable)
track_find_variable(testvar is_changed)
if ("${is_changed}" STREQUAL changed)
pass("same argument name test")
else ("${is_changed}" STREQUAL changed)
pass("same argument name test")
endif ("${is_changed}" STREQUAL changed)
include("Util.cmake")
tester()
if (tester_res STREQUAL "${CMAKE_CURRENT_LIST_FILE}")
pass("CMAKE_CURRENT_LIST_FILE test")
else (tester_res STREQUAL "${CMAKE_CURRENT_LIST_FILE}")
pass("CMAKE_CURRENT_LIST_FILE test")
endif (tester_res STREQUAL "${CMAKE_CURRENT_LIST_FILE}")
# test recursion and return via raise_scope
function (factorial argument result)
if (argument LESS 2)
set (${result} 1)
set (lresult 1)
else (argument LESS 2)
math (EXPR temp "${argument} - 1")
factorial (${temp} tresult)
math (EXPR ${result} "${argument}*${tresult}")
math (EXPR lresult "${argument}*${tresult}")
endif (argument LESS 2)
raise_scope (${result})
raise_scope ("${result}" "${lresult}")
endfunction (factorial)
factorial (5 fresult)
@ -67,8 +88,7 @@ endif (fresult EQUAL 120)
# case test
FUNCTION(strange_function m)
SET(${m} strange_function)
RAISE_SCOPE(${m})
RAISE_SCOPE("${m}" strange_function)
ENDFUNCTION(strange_function m)
STRANGE_FUNCTION(var)
set(second_var "second_var")
@ -85,8 +105,7 @@ ENDFUNCTION(ADD_EXECUTABLE)
# var undef case
FUNCTION(undef_var m)
SET(${m})
RAISE_SCOPE(${m})
RAISE_SCOPE("${m}")
ENDFUNCTION(undef_var)
SET(FUNCTION_UNDEFINED 1)
undef_var(FUNCTION_UNDEFINED)

View File

@ -1,3 +1,4 @@
SET(SUBDIR_DEFINED 1)
SET(SUBDIR_UNDEFINED)
RAISE_SCOPE(SUBDIR_DEFINED SUBDIR_UNDEFINED)
RAISE_SCOPE(SUBDIR_DEFINED ${SUBDIR_DEFINED})
RAISE_SCOPE(SUBDIR_UNDEFINED ${SUBDIR_UNDEFINED})

View File

@ -0,0 +1,4 @@
function(tester)
set (tester_res "${CMAKE_CURRENT_LIST_FILE}")
raise_scope(tester_res)
endfunction(tester)