diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2005-06-13 11:15:54 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2005-06-13 11:15:54 -0300 |
commit | bf2b342ac1f080d06977bdf84475dc663c9a2644 (patch) | |
tree | 54c51cdca0c34d1d125a34d4cb057adb561f7707 /lparser.c | |
parent | 5fa2bec1f06f5b935036bd9e7c6a65b82f88dd39 (diff) | |
download | lua-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.c | 13 |
1 files changed, 8 insertions, 5 deletions
@@ -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 | } |