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 | |
parent | 5fa2bec1f06f5b935036bd9e7c6a65b82f88dd39 (diff) | |
download | lua-bf2b342ac1f080d06977bdf84475dc663c9a2644.tar.gz lua-bf2b342ac1f080d06977bdf84475dc663c9a2644.tar.bz2 lua-bf2b342ac1f080d06977bdf84475dc663c9a2644.zip |
better control for compatibility code for varargs
-rw-r--r-- | ldebug.c | 7 | ||||
-rw-r--r-- | ldo.c | 5 | ||||
-rw-r--r-- | lobject.h | 9 | ||||
-rw-r--r-- | lparser.c | 13 |
4 files changed, 21 insertions, 13 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ldebug.c,v 2.20 2005/05/17 19:49:15 roberto Exp roberto $ | 2 | ** $Id: ldebug.c,v 2.21 2005/05/31 14:25:18 roberto Exp roberto $ |
3 | ** Debug Interface | 3 | ** Debug Interface |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -276,7 +276,7 @@ LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) { | |||
276 | static int precheck (const Proto *pt) { | 276 | static int precheck (const Proto *pt) { |
277 | check(pt->maxstacksize <= MAXSTACK); | 277 | check(pt->maxstacksize <= MAXSTACK); |
278 | check(pt->sizelineinfo == pt->sizecode || pt->sizelineinfo == 0); | 278 | check(pt->sizelineinfo == pt->sizecode || pt->sizelineinfo == 0); |
279 | lua_assert(pt->numparams+pt->is_vararg <= pt->maxstacksize); | 279 | lua_assert(pt->numparams+(pt->is_vararg & VARARG_HASARG) <= pt->maxstacksize); |
280 | check(GET_OPCODE(pt->code[pt->sizecode-1]) == OP_RETURN); | 280 | check(GET_OPCODE(pt->code[pt->sizecode-1]) == OP_RETURN); |
281 | return 1; | 281 | return 1; |
282 | } | 282 | } |
@@ -440,7 +440,8 @@ static Instruction symbexec (const Proto *pt, int lastpc, int reg) { | |||
440 | break; | 440 | break; |
441 | } | 441 | } |
442 | case OP_VARARG: { | 442 | case OP_VARARG: { |
443 | check(pt->is_vararg & NEWSTYLEVARARG); | 443 | check((pt->is_vararg & VARARG_ISVARARG) && |
444 | !(pt->is_vararg & VARARG_NEEDSARG)); | ||
444 | b--; | 445 | b--; |
445 | if (b == LUA_MULTRET) check(checkopenop(pt, pc)); | 446 | if (b == LUA_MULTRET) check(checkopenop(pt, pc)); |
446 | checkreg(pt, a+b-1); | 447 | checkreg(pt, a+b-1); |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ldo.c,v 2.24 2005/05/20 19:09:05 roberto Exp roberto $ | 2 | ** $Id: ldo.c,v 2.25 2005/05/31 14:25:18 roberto Exp roberto $ |
3 | ** Stack and Call structure of Lua | 3 | ** Stack and Call structure of Lua |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -199,8 +199,9 @@ static StkId adjust_varargs (lua_State *L, int nfixargs, int actual, | |||
199 | setnilvalue(L->top++); | 199 | setnilvalue(L->top++); |
200 | } | 200 | } |
201 | #if defined(LUA_COMPAT_VARARG) | 201 | #if defined(LUA_COMPAT_VARARG) |
202 | if (style != NEWSTYLEVARARG) { /* compatibility with old-style vararg */ | 202 | if (style & VARARG_NEEDSARG) { /* compatibility with old-style vararg */ |
203 | int nvar = actual - nfixargs; /* number of extra arguments */ | 203 | int nvar = actual - nfixargs; /* number of extra arguments */ |
204 | lua_assert(style & VARARG_HASARG); | ||
204 | luaC_checkGC(L); | 205 | luaC_checkGC(L); |
205 | htab = luaH_new(L, nvar, 1); /* create `arg' table */ | 206 | htab = luaH_new(L, nvar, 1); /* create `arg' table */ |
206 | for (i=0; i<nvar; i++) /* put extra arguments into `arg' table */ | 207 | for (i=0; i<nvar; i++) /* put extra arguments into `arg' table */ |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lobject.h,v 2.14 2005/05/31 14:25:18 roberto Exp roberto $ | 2 | ** $Id: lobject.h,v 2.15 2005/06/06 13:30:25 roberto Exp roberto $ |
3 | ** Type definitions for Lua objects | 3 | ** Type definitions for Lua objects |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -254,8 +254,10 @@ typedef struct Proto { | |||
254 | } Proto; | 254 | } Proto; |
255 | 255 | ||
256 | 256 | ||
257 | /* mask for new-style vararg */ | 257 | /* masks for new-style vararg */ |
258 | #define NEWSTYLEVARARG 2 | 258 | #define VARARG_HASARG 1 |
259 | #define VARARG_ISVARARG 2 | ||
260 | #define VARARG_NEEDSARG 4 | ||
259 | 261 | ||
260 | 262 | ||
261 | typedef struct LocVar { | 263 | typedef struct LocVar { |
@@ -373,3 +375,4 @@ LUAI_FUNC void luaO_chunkid (char *out, const char *source, size_t len); | |||
373 | 375 | ||
374 | 376 | ||
375 | #endif | 377 | #endif |
378 | |||
@@ -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 | } |