awk: evaluate all, even superfluous function args
function old new delta evaluate 3128 3135 +7 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
ca9278ee58
commit
d7354df169
@ -2910,7 +2910,7 @@ static var *evaluate(node *op, var *res)
|
||||
case XC( OC_FUNC ): {
|
||||
var *tv, *sv_fnargs;
|
||||
const char *sv_progname;
|
||||
int nargs1, i;
|
||||
int nargs, i;
|
||||
|
||||
debug_printf_eval("FUNC\n");
|
||||
|
||||
@ -2918,17 +2918,22 @@ static var *evaluate(node *op, var *res)
|
||||
syntax_error(EMSG_UNDEF_FUNC);
|
||||
|
||||
/* The body might be empty, still has to eval the args */
|
||||
nargs1 = op->r.f->nargs + 1;
|
||||
tv = nvalloc(nargs1);
|
||||
nargs = op->r.f->nargs;
|
||||
tv = nvalloc(nargs);
|
||||
i = 0;
|
||||
while (op1) {
|
||||
//TODO: explain why one iteration is done even for the case p->r.f->nargs == 0
|
||||
var *arg = evaluate(nextarg(&op1), v1);
|
||||
if (i == nargs) {
|
||||
/* call with more arguments than function takes.
|
||||
* (gawk warns: "warning: function 'f' called with more arguments than declared").
|
||||
* They are still evaluated, but discarded: */
|
||||
clrvar(arg);
|
||||
continue;
|
||||
}
|
||||
copyvar(&tv[i], arg);
|
||||
tv[i].type |= VF_CHILD;
|
||||
tv[i].x.parent = arg;
|
||||
if (++i >= op->r.f->nargs)
|
||||
break;
|
||||
i++;
|
||||
}
|
||||
|
||||
sv_fnargs = fnargs;
|
||||
@ -2936,7 +2941,7 @@ static var *evaluate(node *op, var *res)
|
||||
|
||||
fnargs = tv;
|
||||
res = evaluate(op->r.f->body.first, res);
|
||||
nvfree(fnargs, nargs1);
|
||||
nvfree(fnargs, nargs);
|
||||
|
||||
g_progname = sv_progname;
|
||||
fnargs = sv_fnargs;
|
||||
|
@ -87,11 +87,17 @@ BEGIN {
|
||||
a=2
|
||||
print v (a)
|
||||
}'
|
||||
testing "'v (a)' is not a function call, it is a concatenation" \
|
||||
testing "awk 'v (a)' is not a function call, it is a concatenation" \
|
||||
"awk '$prg' 2>&1" \
|
||||
"12\n" \
|
||||
"" ""
|
||||
|
||||
prg='func f(){print"F"};func g(){print"G"};BEGIN{f(g(),g())}'
|
||||
testing "awk unused function args are evaluated" \
|
||||
"awk '$prg' 2>&1" \
|
||||
"G\nG\nF\n" \
|
||||
"" ""
|
||||
|
||||
|
||||
optional DESKTOP
|
||||
testing "awk hex const 1" "awk '{ print or(0xffffffff,1) }'" "4294967295\n" "" "\n"
|
||||
|
Loading…
Reference in New Issue
Block a user