diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-01-26 16:43:22 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-01-26 16:43:22 -0200 |
commit | ca1f28b829090e99fb82d688dac34b2055d2963e (patch) | |
tree | ba92359f5dcf12fccbb50aadcee0a7c3299db5e4 /lvm.c | |
parent | b82242d4c493191d543fe5784b4d884e0cba9809 (diff) | |
download | lua-ca1f28b829090e99fb82d688dac34b2055d2963e.tar.gz lua-ca1f28b829090e99fb82d688dac34b2055d2963e.tar.bz2 lua-ca1f28b829090e99fb82d688dac34b2055d2963e.zip |
avoid side-effects on macros that may use twice their arguments
Diffstat (limited to 'lvm.c')
-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: { |