summaryrefslogtreecommitdiff
path: root/lparser.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2005-06-13 11:15:54 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2005-06-13 11:15:54 -0300
commitbf2b342ac1f080d06977bdf84475dc663c9a2644 (patch)
tree54c51cdca0c34d1d125a34d4cb057adb561f7707 /lparser.c
parent5fa2bec1f06f5b935036bd9e7c6a65b82f88dd39 (diff)
downloadlua-bf2b342ac1f080d06977bdf84475dc663c9a2644.tar.gz
lua-bf2b342ac1f080d06977bdf84475dc663c9a2644.tar.bz2
lua-bf2b342ac1f080d06977bdf84475dc663c9a2644.zip
better control for compatibility code for varargs
Diffstat (limited to 'lparser.c')
-rw-r--r--lparser.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/lparser.c b/lparser.c
index 9d855a5e..6b7097a6 100644
--- a/lparser.c
+++ b/lparser.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lparser.c,v 2.27 2005/05/17 19:49:15 roberto Exp roberto $ 2** $Id: lparser.c,v 2.28 2005/05/20 15:53:42 roberto Exp roberto $
3** Lua Parser 3** Lua Parser
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -402,7 +402,7 @@ Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, const char *name) {
402 lexstate.buff = buff; 402 lexstate.buff = buff;
403 luaX_setinput(L, &lexstate, z, luaS_new(L, name)); 403 luaX_setinput(L, &lexstate, z, luaS_new(L, name));
404 open_func(&lexstate, &funcstate); 404 open_func(&lexstate, &funcstate);
405 funcstate.f->is_vararg = NEWSTYLEVARARG; 405 funcstate.f->is_vararg = VARARG_ISVARARG; /* main func. is always vararg */
406 next(&lexstate); /* read first token */ 406 next(&lexstate); /* read first token */
407 chunk(&lexstate); 407 chunk(&lexstate);
408 check(&lexstate, TK_EOS); 408 check(&lexstate, TK_EOS);
@@ -572,9 +572,12 @@ static void parlist (LexState *ls) {
572 } 572 }
573 case TK_DOTS: { /* param -> `...' */ 573 case TK_DOTS: { /* param -> `...' */
574 next(ls); 574 next(ls);
575#if defined(LUA_COMPAT_VARARG)
575 /* use `arg' as default name */ 576 /* use `arg' as default name */
576 new_localvarliteral(ls, "arg", nparams++); 577 new_localvarliteral(ls, "arg", nparams++);
577 f->is_vararg = 1; 578 f->is_vararg = VARARG_HASARG | VARARG_NEEDSARG;
579#endif
580 f->is_vararg |= VARARG_ISVARARG;
578 break; 581 break;
579 } 582 }
580 default: luaX_syntaxerror(ls, "<name> or " LUA_QL("...") " expected"); 583 default: luaX_syntaxerror(ls, "<name> or " LUA_QL("...") " expected");
@@ -582,7 +585,7 @@ static void parlist (LexState *ls) {
582 } while (!f->is_vararg && testnext(ls, ',')); 585 } while (!f->is_vararg && testnext(ls, ','));
583 } 586 }
584 adjustlocalvars(ls, nparams); 587 adjustlocalvars(ls, nparams);
585 f->numparams = fs->nactvar - f->is_vararg; 588 f->numparams = fs->nactvar - (f->is_vararg & VARARG_HASARG);
586 luaK_reserveregs(fs, fs->nactvar); /* reserve register for parameters */ 589 luaK_reserveregs(fs, fs->nactvar); /* reserve register for parameters */
587} 590}
588 591
@@ -766,7 +769,7 @@ static void simpleexp (LexState *ls, expdesc *v) {
766 FuncState *fs = ls->fs; 769 FuncState *fs = ls->fs;
767 check_condition(ls, fs->f->is_vararg, 770 check_condition(ls, fs->f->is_vararg,
768 "cannot use " LUA_QL("...") " outside a vararg function"); 771 "cannot use " LUA_QL("...") " outside a vararg function");
769 fs->f->is_vararg = NEWSTYLEVARARG; 772 fs->f->is_vararg &= ~VARARG_NEEDSARG; /* don't need 'arg' */
770 init_exp(v, VVARARG, luaK_codeABC(fs, OP_VARARG, 0, 1, 0)); 773 init_exp(v, VVARARG, luaK_codeABC(fs, OP_VARARG, 0, 1, 0));
771 break; 774 break;
772 } 775 }