awk: allow empty fuinctions with no arguments, disallow function redefinitions

function                                             old     new   delta
.rodata                                           103681  103700     +19
parse_program                                        303     307      +4
evaluate                                            3145    3141      -4
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/1 up/down: 23/-4)              Total: 19 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2021-06-30 12:23:51 +02:00
parent 86fc2872b3
commit d150710169
2 changed files with 17 additions and 4 deletions

View File

@ -139,6 +139,7 @@ typedef struct chain_s {
/* Function */
typedef struct func_s {
unsigned nargs;
smallint defined;
struct chain_s body;
} func;
@ -1662,9 +1663,11 @@ static void parse_program(char *p)
debug_printf_parse("%s: TC_FUNCDECL\n", __func__);
next_token(TC_FUNCTION);
f = newfunc(t_string);
//FIXME: dup check: functions can't be redefined, this is not ok: awk 'func f(){}; func f(){}'
f->body.first = NULL;
f->nargs = 0;
if (f->defined)
syntax_error("Duplicate function");
f->defined = 1;
//f->body.first = NULL; - already is
//f->nargs = 0; - already is
/* func arg list: comma sep list of args, and a close paren */
for (;;) {
if (next_token(TC_VARIABLE | TC_RPAREN) == TC_RPAREN) {
@ -2912,7 +2915,7 @@ static var *evaluate(node *op, var *res)
debug_printf_eval("FUNC\n");
if (op->r.f->nargs == 0 && !op->r.f->body.first)
if (!op->r.f->defined)
syntax_error(EMSG_UNDEF_FUNC);
/* The body might be empty, still has to eval the args */

View File

@ -44,6 +44,16 @@ testing "awk handles empty function f(arg){}" \
"L1\n\nL2\n\n" \
"" ""
prg='
function empty_fun(){}
END {empty_fun()
print "Ok"
}'
testing "awk handles empty function f(){}" \
"awk '$prg'" \
"Ok\n" \
"" ""
prg='
function outer_fun() {
return 1