aboutsummaryrefslogtreecommitdiff
path: root/lvm.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2001-01-26 16:43:22 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2001-01-26 16:43:22 -0200
commitca1f28b829090e99fb82d688dac34b2055d2963e (patch)
treeba92359f5dcf12fccbb50aadcee0a7c3299db5e4 /lvm.c
parentb82242d4c493191d543fe5784b4d884e0cba9809 (diff)
downloadlua-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.c25
1 files changed, 16 insertions, 9 deletions
diff --git a/lvm.c b/lvm.c
index 9146a08c..9a2c75f4 100644
--- a/lvm.c
+++ b/lvm.c
@@ -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) {
309static void luaV_pack (lua_State *L, StkId firstelem) { 309static 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: {