commit 7d79f46c9aff2c04161eb13e3e0c4467795a7a03 from: Omar Polo date: Wed Aug 04 21:36:31 2021 UTC improve aritiy checking and better error in case of mismatch commit - 3d1d2398a3a7e94e5a9422b48b6dd2b077d1772e commit + 7d79f46c9aff2c04161eb13e3e0c4467795a7a03 blob - b8eae69506de058d29202e1e6b4d3cf39aae0370 blob + 8735f24bd0c12b7159d6687776b08f688c2197e7 --- np.y +++ np.y @@ -181,13 +181,27 @@ procname: SYMBOL { funcall : procname { prepare_funcall(); } '(' args optcomma ')' { + struct proc *proc; + int argc; + $$ = op_funcall($1); - if ($$->v.funcall.argc != $$->v.funcall.proc->minargs) { - yyerror("invalid arity for `%s'", - $1->name); + proc = $$->v.funcall.proc; + argc = $$->v.funcall.argc; + + if (argc != proc->minargs && !proc->vararg) { + yyerror("invalid arity for `%s': want %d arguments " + "but %d given.", $1->name, proc->minargs, argc); /* TODO: recursively free $$ */ YYERROR; } + + if (argc < proc->minargs && proc->vararg) { + yyerror("invalid arity for `%s': want at least %d " + "arguments but %d given.", $1->name, proc->minargs, + argc); + /* TODO: recursively free $$ */ + YYERROR; + } } ;