diff options
author | Denys Vlasenko | 2021-06-30 12:52:51 +0200 |
---|---|---|
committer | Denys Vlasenko | 2021-06-30 12:52:51 +0200 |
commit | d7354df169603807fe2ac4f8a0f9f72c9703184f (patch) | |
tree | f93f4b2564b617420d4c4b3b7032b0e557e999ea /editors | |
parent | ca9278ee5855a91a5521960d3743809f47ed27b8 (diff) | |
download | busybox-d7354df169603807fe2ac4f8a0f9f72c9703184f.zip busybox-d7354df169603807fe2ac4f8a0f9f72c9703184f.tar.gz |
awk: evaluate all, even superfluous function args
function old new delta
evaluate 3128 3135 +7
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'editors')
-rw-r--r-- | editors/awk.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/editors/awk.c b/editors/awk.c index 0fbca04..47bbc10 100644 --- a/editors/awk.c +++ b/editors/awk.c @@ -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; |