aboutsummaryrefslogtreecommitdiff
path: root/lvm.c
diff options
context:
space:
mode:
Diffstat (limited to 'lvm.c')
-rw-r--r--lvm.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/lvm.c b/lvm.c
index 15349c64..f7d5627d 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 1.68 1999/11/29 18:27:49 roberto Exp roberto $ 2** $Id: lvm.c,v 1.69 1999/12/01 19:50:08 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*/
@@ -108,22 +108,22 @@ void luaV_gettable (lua_State *L) {
108 else { /* object is a table... */ 108 else { /* object is a table... */
109 int tg = table->value.a->htag; 109 int tg = table->value.a->htag;
110 im = luaT_getim(L, tg, IM_GETTABLE); 110 im = luaT_getim(L, tg, IM_GETTABLE);
111 if (ttype(im) == LUA_T_NIL) { /* and does not have a "gettable" method */ 111 if (ttype(im) == LUA_T_NIL) { /* and does not have a `gettable' method */
112 const TObject *h = luaH_get(L, avalue(table), table+1); 112 const TObject *h = luaH_get(L, avalue(table), table+1);
113 if (ttype(h) == LUA_T_NIL && 113 if (ttype(h) == LUA_T_NIL &&
114 (ttype(im=luaT_getim(L, tg, IM_INDEX)) != LUA_T_NIL)) { 114 (ttype(im=luaT_getim(L, tg, IM_INDEX)) != LUA_T_NIL)) {
115 /* result is nil and there is an "index" tag method */ 115 /* result is nil and there is an `index' tag method */
116 luaD_callTM(L, im, 2, 1); /* calls it */ 116 luaD_callTM(L, im, 2, 1); /* calls it */
117 } 117 }
118 else { 118 else {
119 L->top--; 119 L->top--;
120 *table = *h; /* "push" result into table position */ 120 *table = *h; /* `push' result into table position */
121 } 121 }
122 return; 122 return;
123 } 123 }
124 /* else it has a "gettable" method, go through to next command */ 124 /* else it has a `gettable' method, go through to next command */
125 } 125 }
126 /* object is not a table, or it has a "gettable" method */ 126 /* object is not a table, or it has a `gettable' method */
127 luaD_callTM(L, im, 2, 1); 127 luaD_callTM(L, im, 2, 1);
128} 128}
129 129
@@ -442,6 +442,7 @@ StkId luaV_execute (lua_State *L, const Closure *cl, const TProtoFunc *tf,
442 case SETLIST: aux += *pc++; { 442 case SETLIST: aux += *pc++; {
443 int n = *(pc++); 443 int n = *(pc++);
444 Hash *arr = avalue(top-n-1); 444 Hash *arr = avalue(top-n-1);
445 L->top = top-n; /* final value of `top' (in case of errors) */
445 aux *= LFIELDS_PER_FLUSH; 446 aux *= LFIELDS_PER_FLUSH;
446 for (; n; n--) 447 for (; n; n--)
447 luaH_setint(L, arr, n+aux, --top); 448 luaH_setint(L, arr, n+aux, --top);
@@ -449,7 +450,9 @@ StkId luaV_execute (lua_State *L, const Closure *cl, const TProtoFunc *tf,
449 } 450 }
450 451
451 case SETMAP: aux = *pc++; { 452 case SETMAP: aux = *pc++; {
452 Hash *arr = avalue(top-(2*aux)-3); 453 StkId finaltop = top-2*(aux+1);
454 Hash *arr = avalue(finaltop-1);
455 L->top = finaltop; /* final value of `top' (in case of errors) */
453 do { 456 do {
454 luaH_set(L, arr, top-2, top-1); 457 luaH_set(L, arr, top-2, top-1);
455 top-=2; 458 top-=2;
@@ -529,9 +532,9 @@ StkId luaV_execute (lua_State *L, const Closure *cl, const TProtoFunc *tf,
529 call_binTM(L, top, IM_CONCAT, "unexpected type for concatenation"); 532 call_binTM(L, top, IM_CONCAT, "unexpected type for concatenation");
530 else 533 else
531 tsvalue(top-2) = strconc(L, tsvalue(top-2), tsvalue(top-1)); 534 tsvalue(top-2) = strconc(L, tsvalue(top-2), tsvalue(top-1));
535 top--;
532 L->top = top; 536 L->top = top;
533 luaC_checkGC(L); 537 luaC_checkGC(L);
534 top--;
535 break; 538 break;
536 539
537 case MINUSOP: 540 case MINUSOP:
@@ -585,7 +588,7 @@ StkId luaV_execute (lua_State *L, const Closure *cl, const TProtoFunc *tf,
585 case CLOSURE: aux += *pc++; 588 case CLOSURE: aux += *pc++;
586 *top++ = consts[aux]; 589 *top++ = consts[aux];
587 L->top = top; 590 L->top = top;
588 aux = *pc++; 591 aux = *pc++; /* number of upvalues */
589 luaV_closure(L, aux); 592 luaV_closure(L, aux);
590 luaC_checkGC(L); 593 luaC_checkGC(L);
591 top -= aux; 594 top -= aux;