From d15a484098a52e0784933ba03a98445fdc86ea3f Mon Sep 17 00:00:00 2001 From: Paul Smith Date: Wed, 22 Jan 2003 13:45:44 +0000 Subject: [PATCH] Fix bug #1744: mask extra arguments to recursive invocations of $(call ...) --- ChangeLog | 7 +++++++ function.c | 18 ++++++++++++++++++ tests/ChangeLog | 5 +++++ tests/scripts/functions/call | 31 +++++++++++++++++++++++++++++++ 4 files changed, 61 insertions(+) diff --git a/ChangeLog b/ChangeLog index 326a4a86..ef5bd87d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2003-01-22 Paul D. Smith + + * function.c (func_call): Fix Bug #1744. If we're inside a + recursive invocation of $(call ...), mask any of the outer + invocation's arguments that aren't used by this one, so that this + invocation doesn't "inherit" them accidentally. + 2002-11-16 Paul D. Smith * NMakefile.template (OBJS): Add hash.c object file. diff --git a/function.c b/function.c index 5a27406b..a6a04d49 100644 --- a/function.c +++ b/function.c @@ -1893,11 +1893,13 @@ handle_function (char **op, char **stringp) static char * func_call (char *o, char **argv, const char *funcname) { + static int max_args = 0; char *fname; char *cp; char *body; int flen; int i; + int saved_args; const struct function_table_entry *entry_p; struct variable *v; @@ -1960,12 +1962,28 @@ func_call (char *o, char **argv, const char *funcname) define_variable (num, strlen (num), *argv, o_automatic, 0); } + /* If the number of arguments we have is < max_args, it means we're inside + a recursive invocation of $(call ...). Fill in the remaining arguments + in the new scope with the empty value, to hide them from this + invocation. */ + + for (; i < max_args; ++i) + { + char num[11]; + + sprintf (num, "%d", i); + define_variable (num, strlen (num), "", o_automatic, 0); + } + /* Expand the body in the context of the arguments, adding the result to the variable buffer. */ v->exp_count = EXP_COUNT_MAX; + saved_args = max_args; + max_args = i; o = variable_expand_string (o, body, flen+3); + max_args = saved_args; v->exp_count = 0; diff --git a/tests/ChangeLog b/tests/ChangeLog index e91ccc9b..2533bb8e 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,8 @@ +2003-01-22 Paul D. Smith + + * scripts/functions/call: Test recursive argument masking (bug + #1744). + 2002-10-25 Paul D. Smith * scripts/functions/eval: Test using $(eval ...) inside diff --git a/tests/scripts/functions/call b/tests/scripts/functions/call index a8834cdc..efee4769 100644 --- a/tests/scripts/functions/call +++ b/tests/scripts/functions/call @@ -69,4 +69,35 @@ $answer = "foo bar\ndefault file file\nb d f\n\n\nb\nbar foo baz\nfoo bar baz bl &compare_output($answer, &get_logfile(1)); + +# TEST eclipsing of arguments when invoking sub-calls + +$makefile2 = &get_tmpfile; + +open(MAKEFILE,"> $makefile2"); + +print MAKEFILE <<'EOF'; + +all = $1 $2 $3 $4 $5 $6 $7 $8 $9 + +level1 = $(call all,$1,$2,$3,$4,$5) +level2 = $(call level1,$1,$2,$3) +level3 = $(call level2,$1,$2,$3,$4,$5) + +all: + @echo $(call all,1,2,3,4,5,6,7,8,9,10,11) + @echo $(call level1,1,2,3,4,5,6,7,8) + @echo $(call level2,1,2,3,4,5,6,7,8) + @echo $(call level3,1,2,3,4,5,6,7,8) +EOF + +close(MAKEFILE); + +&run_make_with_options($makefile2, "", &get_logfile); + +# Create the answer to what should be produced by this Makefile +$answer = "1 2 3 4 5 6 7 8 9\n1 2 3 4 5\n1 2 3\n1 2 3\n"; + +&compare_output($answer,&get_logfile(1)); + 1;