diff options
| -rw-r--r-- | ldebug.c | 8 | ||||
| -rw-r--r-- | ldo.c | 22 | ||||
| -rw-r--r-- | lobject.h | 8 | ||||
| -rw-r--r-- | lparser.c | 14 | ||||
| -rw-r--r-- | luaconf.h | 9 |
5 files changed, 10 insertions, 51 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ldebug.c,v 2.43 2009/03/04 13:32:29 roberto Exp roberto $ | 2 | ** $Id: ldebug.c,v 2.44 2009/03/10 17:14:37 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 | */ |
| @@ -278,8 +278,7 @@ LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) { | |||
| 278 | 278 | ||
| 279 | static int precheck (const Proto *pt) { | 279 | static int precheck (const Proto *pt) { |
| 280 | check(pt->maxstacksize <= MAXSTACK); | 280 | check(pt->maxstacksize <= MAXSTACK); |
| 281 | check(pt->numparams+(pt->is_vararg & VARARG_HASARG) <= pt->maxstacksize); | 281 | check(pt->numparams <= pt->maxstacksize); |
| 282 | check(!(pt->is_vararg & VARARG_NEEDSARG) || (pt->is_vararg & VARARG_HASARG)); | ||
| 283 | check(pt->sizeupvalues == pt->nups || pt->sizeupvalues == 0); | 282 | check(pt->sizeupvalues == pt->nups || pt->sizeupvalues == 0); |
| 284 | check(pt->sizelineinfo == pt->sizecode || pt->sizelineinfo == 0); | 283 | check(pt->sizelineinfo == pt->sizecode || pt->sizelineinfo == 0); |
| 285 | check(pt->sizecode > 0 && GET_OPCODE(pt->code[pt->sizecode-1]) == OP_RETURN); | 284 | check(pt->sizecode > 0 && GET_OPCODE(pt->code[pt->sizecode-1]) == OP_RETURN); |
| @@ -445,8 +444,7 @@ static Instruction symbexec (const Proto *pt, int lastpc, int reg) { | |||
| 445 | break; | 444 | break; |
| 446 | } | 445 | } |
| 447 | case OP_VARARG: { | 446 | case OP_VARARG: { |
| 448 | check((pt->is_vararg & VARARG_ISVARARG) && | 447 | check(pt->is_vararg); |
| 449 | !(pt->is_vararg & VARARG_NEEDSARG)); | ||
| 450 | b--; | 448 | b--; |
| 451 | if (b == LUA_MULTRET) check(checkopenop(pt, pc)); | 449 | if (b == LUA_MULTRET) check(checkopenop(pt, pc)); |
| 452 | checkreg(pt, a+b-1); | 450 | checkreg(pt, a+b-1); |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ldo.c,v 2.55 2009/03/10 17:14:37 roberto Exp roberto $ | 2 | ** $Id: ldo.c,v 2.56 2009/03/23 14:26:12 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 | */ |
| @@ -205,24 +205,9 @@ void luaD_callhook (lua_State *L, int event, int line) { | |||
| 205 | static StkId adjust_varargs (lua_State *L, Proto *p, int actual) { | 205 | static StkId adjust_varargs (lua_State *L, Proto *p, int actual) { |
| 206 | int i; | 206 | int i; |
| 207 | int nfixargs = p->numparams; | 207 | int nfixargs = p->numparams; |
| 208 | Table *htab = NULL; | ||
| 209 | StkId base, fixed; | 208 | StkId base, fixed; |
| 210 | for (; actual < nfixargs; ++actual) | 209 | for (; actual < nfixargs; ++actual) |
| 211 | setnilvalue(L->top++); | 210 | setnilvalue(L->top++); |
| 212 | #if defined(LUA_COMPAT_VARARG) | ||
| 213 | if (p->is_vararg & VARARG_NEEDSARG) { /* compat. with old-style vararg? */ | ||
| 214 | int nvar = actual - nfixargs; /* number of extra arguments */ | ||
| 215 | lua_assert(p->is_vararg & VARARG_HASARG); | ||
| 216 | luaC_checkGC(L); | ||
| 217 | htab = luaH_new(L); /* create `arg' table */ | ||
| 218 | sethvalue(L, L->top++, htab); | ||
| 219 | for (i=0; i<nvar; i++) /* put extra arguments into `arg' table */ | ||
| 220 | setobj2n(L, luaH_setnum(L, htab, i+1), L->top - nvar + i - 1); | ||
| 221 | /* store counter in field `n' */ | ||
| 222 | setnvalue(luaH_setstr(L, htab, luaS_newliteral(L, "n")), cast_num(nvar)); | ||
| 223 | L->top--; | ||
| 224 | } | ||
| 225 | #endif | ||
| 226 | /* move fixed parameters to final position */ | 211 | /* move fixed parameters to final position */ |
| 227 | fixed = L->top - actual; /* first fixed argument */ | 212 | fixed = L->top - actual; /* first fixed argument */ |
| 228 | base = L->top; /* final position of first argument */ | 213 | base = L->top; /* final position of first argument */ |
| @@ -230,11 +215,6 @@ static StkId adjust_varargs (lua_State *L, Proto *p, int actual) { | |||
| 230 | setobjs2s(L, L->top++, fixed+i); | 215 | setobjs2s(L, L->top++, fixed+i); |
| 231 | setnilvalue(fixed+i); | 216 | setnilvalue(fixed+i); |
| 232 | } | 217 | } |
| 233 | /* add `arg' parameter */ | ||
| 234 | if (htab) { | ||
| 235 | sethvalue(L, L->top++, htab); | ||
| 236 | lua_assert(iswhite(obj2gco(htab))); | ||
| 237 | } | ||
| 238 | return base; | 218 | return base; |
| 239 | } | 219 | } |
| 240 | 220 | ||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lobject.h,v 2.23 2008/01/30 18:05:23 roberto Exp roberto $ | 2 | ** $Id: lobject.h,v 2.24 2008/08/05 19:26:23 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 | */ |
| @@ -253,12 +253,6 @@ typedef struct Proto { | |||
| 253 | } Proto; | 253 | } Proto; |
| 254 | 254 | ||
| 255 | 255 | ||
| 256 | /* masks for new-style vararg */ | ||
| 257 | #define VARARG_HASARG 1 | ||
| 258 | #define VARARG_ISVARARG 2 | ||
| 259 | #define VARARG_NEEDSARG 4 | ||
| 260 | |||
| 261 | |||
| 262 | typedef struct LocVar { | 256 | typedef struct LocVar { |
| 263 | TString *varname; | 257 | TString *varname; |
| 264 | int startpc; /* first point where variable is active */ | 258 | int startpc; /* first point where variable is active */ |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lparser.c,v 2.59 2008/10/28 12:55:00 roberto Exp roberto $ | 2 | ** $Id: lparser.c,v 2.60 2008/10/30 15:39:30 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 | */ |
| @@ -394,7 +394,7 @@ Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, const char *name) { | |||
| 394 | lexstate.buff = buff; | 394 | lexstate.buff = buff; |
| 395 | luaX_setinput(L, &lexstate, z, tname); | 395 | luaX_setinput(L, &lexstate, z, tname); |
| 396 | open_func(&lexstate, &funcstate); | 396 | open_func(&lexstate, &funcstate); |
| 397 | funcstate.f->is_vararg = VARARG_ISVARARG; /* main func. is always vararg */ | 397 | funcstate.f->is_vararg = 1; /* main func. is always vararg */ |
| 398 | luaX_next(&lexstate); /* read first token */ | 398 | luaX_next(&lexstate); /* read first token */ |
| 399 | chunk(&lexstate); | 399 | chunk(&lexstate); |
| 400 | check(&lexstate, TK_EOS); | 400 | check(&lexstate, TK_EOS); |
| @@ -563,12 +563,7 @@ static void parlist (LexState *ls) { | |||
| 563 | } | 563 | } |
| 564 | case TK_DOTS: { /* param -> `...' */ | 564 | case TK_DOTS: { /* param -> `...' */ |
| 565 | luaX_next(ls); | 565 | luaX_next(ls); |
| 566 | #if defined(LUA_COMPAT_VARARG) | 566 | f->is_vararg = 1; |
| 567 | /* use `arg' as default name */ | ||
| 568 | new_localvarliteral(ls, "arg", nparams++); | ||
| 569 | f->is_vararg = VARARG_HASARG | VARARG_NEEDSARG; | ||
| 570 | #endif | ||
| 571 | f->is_vararg |= VARARG_ISVARARG; | ||
| 572 | break; | 567 | break; |
| 573 | } | 568 | } |
| 574 | default: luaX_syntaxerror(ls, "<name> or " LUA_QL("...") " expected"); | 569 | default: luaX_syntaxerror(ls, "<name> or " LUA_QL("...") " expected"); |
| @@ -576,7 +571,7 @@ static void parlist (LexState *ls) { | |||
| 576 | } while (!f->is_vararg && testnext(ls, ',')); | 571 | } while (!f->is_vararg && testnext(ls, ',')); |
| 577 | } | 572 | } |
| 578 | adjustlocalvars(ls, nparams); | 573 | adjustlocalvars(ls, nparams); |
| 579 | f->numparams = cast_byte(fs->nactvar - (f->is_vararg & VARARG_HASARG)); | 574 | f->numparams = cast_byte(fs->nactvar); |
| 580 | luaK_reserveregs(fs, fs->nactvar); /* reserve register for parameters */ | 575 | luaK_reserveregs(fs, fs->nactvar); /* reserve register for parameters */ |
| 581 | } | 576 | } |
| 582 | 577 | ||
| @@ -761,7 +756,6 @@ static void simpleexp (LexState *ls, expdesc *v) { | |||
| 761 | FuncState *fs = ls->fs; | 756 | FuncState *fs = ls->fs; |
| 762 | check_condition(ls, fs->f->is_vararg, | 757 | check_condition(ls, fs->f->is_vararg, |
| 763 | "cannot use " LUA_QL("...") " outside a vararg function"); | 758 | "cannot use " LUA_QL("...") " outside a vararg function"); |
| 764 | fs->f->is_vararg &= ~VARARG_NEEDSARG; /* don't need 'arg' */ | ||
| 765 | init_exp(v, VVARARG, luaK_codeABC(fs, OP_VARARG, 0, 1, 0)); | 759 | init_exp(v, VVARARG, luaK_codeABC(fs, OP_VARARG, 0, 1, 0)); |
| 766 | break; | 760 | break; |
| 767 | } | 761 | } |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: luaconf.h,v 1.102 2009/02/18 13:17:10 roberto Exp roberto $ | 2 | ** $Id: luaconf.h,v 1.103 2009/02/20 13:50:27 roberto Exp roberto $ |
| 3 | ** Configuration file for Lua | 3 | ** Configuration file for Lua |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -352,13 +352,6 @@ | |||
| 352 | 352 | ||
| 353 | 353 | ||
| 354 | /* | 354 | /* |
| 355 | @@ LUA_COMPAT_VARARG controls compatibility with old vararg feature. | ||
| 356 | ** CHANGE it to undefined as soon as your programs use only '...' to | ||
| 357 | ** access vararg parameters (instead of the old 'arg' table). | ||
| 358 | */ | ||
| 359 | #define LUA_COMPAT_VARARG | ||
| 360 | |||
| 361 | /* | ||
| 362 | @@ LUA_COMPAT_GFIND controls compatibility with old 'string.gfind' name. | 355 | @@ LUA_COMPAT_GFIND controls compatibility with old 'string.gfind' name. |
| 363 | ** CHANGE it to undefined as soon as you rename 'string.gfind' to | 356 | ** CHANGE it to undefined as soon as you rename 'string.gfind' to |
| 364 | ** 'string.gmatch'. | 357 | ** 'string.gmatch'. |
