diff options
| -rw-r--r-- | lvm.c | 25 |
1 files changed, 16 insertions, 9 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lvm.c,v 1.156 2001/01/24 15:45:33 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 1.157 2001/01/24 16:20:54 roberto Exp roberto $ |
| 3 | ** Lua virtual machine | 3 | ** Lua virtual machine |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -309,10 +309,12 @@ void luaV_strconc (lua_State *L, int total, StkId top) { | |||
| 309 | static void luaV_pack (lua_State *L, StkId firstelem) { | 309 | static void luaV_pack (lua_State *L, StkId firstelem) { |
| 310 | int i; | 310 | int i; |
| 311 | Hash *htab = luaH_new(L, 0); | 311 | Hash *htab = luaH_new(L, 0); |
| 312 | TObject *n; | ||
| 312 | for (i=0; firstelem+i<L->top; i++) | 313 | for (i=0; firstelem+i<L->top; i++) |
| 313 | setobj(luaH_setnum(L, htab, i+1), firstelem+i); | 314 | setobj(luaH_setnum(L, htab, i+1), firstelem+i); |
| 314 | /* store counter in field `n' */ | 315 | /* store counter in field `n' */ |
| 315 | setnvalue(luaH_setstr(L, htab, luaS_newliteral(L, "n")), i); | 316 | n = luaH_setstr(L, htab, luaS_newliteral(L, "n")); |
| 317 | setnvalue(n, i); | ||
| 316 | L->top = firstelem; /* remove elements from the stack */ | 318 | L->top = firstelem; /* remove elements from the stack */ |
| 317 | sethvalue(L->top, htab); | 319 | sethvalue(L->top, htab); |
| 318 | incr_top; | 320 | incr_top; |
| @@ -383,19 +385,23 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
| 383 | break; | 385 | break; |
| 384 | } | 386 | } |
| 385 | case OP_PUSHINT: { | 387 | case OP_PUSHINT: { |
| 386 | setnvalue(top++, (lua_Number)GETARG_S(i)); | 388 | setnvalue(top, (lua_Number)GETARG_S(i)); |
| 389 | top++; | ||
| 387 | break; | 390 | break; |
| 388 | } | 391 | } |
| 389 | case OP_PUSHSTRING: { | 392 | case OP_PUSHSTRING: { |
| 390 | setsvalue(top++, kstr[GETARG_U(i)]); | 393 | setsvalue(top, kstr[GETARG_U(i)]); |
| 394 | top++; | ||
| 391 | break; | 395 | break; |
| 392 | } | 396 | } |
| 393 | case OP_PUSHNUM: { | 397 | case OP_PUSHNUM: { |
| 394 | setnvalue(top++, tf->knum[GETARG_U(i)]); | 398 | setnvalue(top, tf->knum[GETARG_U(i)]); |
| 399 | top++; | ||
| 395 | break; | 400 | break; |
| 396 | } | 401 | } |
| 397 | case OP_PUSHNEGNUM: { | 402 | case OP_PUSHNEGNUM: { |
| 398 | setnvalue(top++, -tf->knum[GETARG_U(i)]); | 403 | setnvalue(top, -tf->knum[GETARG_U(i)]); |
| 404 | top++; | ||
| 399 | break; | 405 | break; |
| 400 | } | 406 | } |
| 401 | case OP_PUSHUPVALUE: { | 407 | case OP_PUSHUPVALUE: { |
| @@ -432,8 +438,8 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
| 432 | case OP_PUSHSELF: { | 438 | case OP_PUSHSELF: { |
| 433 | TObject receiver; | 439 | TObject receiver; |
| 434 | setobj(&receiver, top-1); | 440 | setobj(&receiver, top-1); |
| 435 | setsvalue(top++, kstr[GETARG_U(i)]); | 441 | setsvalue(top, kstr[GETARG_U(i)]); |
| 436 | L->top = top; | 442 | L->top = ++top; |
| 437 | setobj(top-2, luaV_gettable(L, top-2)); | 443 | setobj(top-2, luaV_gettable(L, top-2)); |
| 438 | setobj(top-1, &receiver); | 444 | setobj(top-1, &receiver); |
| 439 | break; | 445 | break; |
| @@ -441,7 +447,8 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
| 441 | case OP_CREATETABLE: { | 447 | case OP_CREATETABLE: { |
| 442 | L->top = top; | 448 | L->top = top; |
| 443 | luaC_checkGC(L); | 449 | luaC_checkGC(L); |
| 444 | sethvalue(top++, luaH_new(L, GETARG_U(i))); | 450 | sethvalue(top, luaH_new(L, GETARG_U(i))); |
| 451 | top++; | ||
| 445 | break; | 452 | break; |
| 446 | } | 453 | } |
| 447 | case OP_SETLOCAL: { | 454 | case OP_SETLOCAL: { |
