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 | } |
