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 ): {
|
case XC( OC_FUNC ): {
|
||||||
var *tv, *sv_fnargs;
|
var *tv, *sv_fnargs;
|
||||||
const char *sv_progname;
|
const char *sv_progname;
|
||||||
int nargs1, i;
|
int nargs, i;
|
||||||
|
|
||||||
debug_printf_eval("FUNC\n");
|
debug_printf_eval("FUNC\n");
|
||||||
|
|
||||||
@ -2918,17 +2918,22 @@ static var *evaluate(node *op, var *res)
|
|||||||
syntax_error(EMSG_UNDEF_FUNC);
|
syntax_error(EMSG_UNDEF_FUNC);
|
||||||
|
|
||||||
/* The body might be empty, still has to eval the args */
|
/* The body might be empty, still has to eval the args */
|
||||||
nargs1 = op->r.f->nargs + 1;
|
nargs = op->r.f->nargs;
|
||||||
tv = nvalloc(nargs1);
|
tv = nvalloc(nargs);
|
||||||
i = 0;
|
i = 0;
|
||||||
while (op1) {
|
while (op1) {
|
||||||
//TODO: explain why one iteration is done even for the case p->r.f->nargs == 0
|
|
||||||
var *arg = evaluate(nextarg(&op1), v1);
|
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);
|
copyvar(&tv[i], arg);
|
||||||
tv[i].type |= VF_CHILD;
|
tv[i].type |= VF_CHILD;
|
||||||
tv[i].x.parent = arg;
|
tv[i].x.parent = arg;
|
||||||
if (++i >= op->r.f->nargs)
|
i++;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sv_fnargs = fnargs;
|
sv_fnargs = fnargs;
|
||||||
@ -2936,7 +2941,7 @@ static var *evaluate(node *op, var *res)
|
|||||||
|
|
||||||
fnargs = tv;
|
fnargs = tv;
|
||||||
res = evaluate(op->r.f->body.first, res);
|
res = evaluate(op->r.f->body.first, res);
|
||||||
nvfree(fnargs, nargs1);
|
nvfree(fnargs, nargs);
|
||||||
|
|
||||||
g_progname = sv_progname;
|
g_progname = sv_progname;
|
||||||
fnargs = sv_fnargs;
|
fnargs = sv_fnargs;
|
||||||
|
@ -87,11 +87,17 @@ BEGIN {
|
|||||||
a=2
|
a=2
|
||||||
print v (a)
|
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" \
|
"awk '$prg' 2>&1" \
|
||||||
"12\n" \
|
"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
|
optional DESKTOP
|
||||||
testing "awk hex const 1" "awk '{ print or(0xffffffff,1) }'" "4294967295\n" "" "\n"
|
testing "awk hex const 1" "awk '{ print or(0xffffffff,1) }'" "4294967295\n" "" "\n"
|
||||||
|
Loading…
Reference in New Issue
Block a user