summaryrefslogtreecommitdiff
path: root/lvm.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-11-21 13:46:44 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-11-21 13:46:44 -0200
commitbe00cd2a6b0f7d26dfc9ba74c262a5574f6521d0 (patch)
tree9e77cd6c9e5ba76da495e6b14fea84d3fbfeda4b /lvm.c
parent2e4e888de02d248fc2688dd740de92f8f4f56656 (diff)
downloadlua-be00cd2a6b0f7d26dfc9ba74c262a5574f6521d0.tar.gz
lua-be00cd2a6b0f7d26dfc9ba74c262a5574f6521d0.tar.bz2
lua-be00cd2a6b0f7d26dfc9ba74c262a5574f6521d0.zip
easier way to keep `base' correct
Diffstat (limited to 'lvm.c')
-rw-r--r--lvm.c35
1 files changed, 18 insertions, 17 deletions
diff --git a/lvm.c b/lvm.c
index a9f297c5..27d2b956 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 1.265 2002/11/21 14:18:01 roberto Exp roberto $ 2** $Id: lvm.c,v 1.266 2002/11/21 15:16:04 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*/
@@ -352,6 +352,8 @@ static void Arith (lua_State *L, StkId ra,
352#define runtime_check(L, c) { if (!(c)) return 0; } 352#define runtime_check(L, c) { if (!(c)) return 0; }
353 353
354#define RA(i) (base+GETARG_A(i)) 354#define RA(i) (base+GETARG_A(i))
355/* to be used after possible stack reallocation */
356#define XRA(i) (L->base+GETARG_A(i))
355#define RB(i) (base+GETARG_B(i)) 357#define RB(i) (base+GETARG_B(i))
356#define RKB(i) ((GETARG_B(i) < MAXSTACK) ? RB(i) : k+GETARG_B(i)-MAXSTACK) 358#define RKB(i) ((GETARG_B(i) < MAXSTACK) ? RB(i) : k+GETARG_B(i)-MAXSTACK)
357#define RC(i) (base+GETARG_C(i)) 359#define RC(i) (base+GETARG_C(i))
@@ -363,12 +365,10 @@ static void Arith (lua_State *L, StkId ra,
363 365
364 366
365StkId luaV_execute (lua_State *L) { 367StkId luaV_execute (lua_State *L) {
366 StkId base;
367 LClosure *cl; 368 LClosure *cl;
368 TObject *k; 369 TObject *k;
369 const Instruction *pc; 370 const Instruction *pc;
370 callentry: /* entry point when calling new functions */ 371 callentry: /* entry point when calling new functions */
371 L->ci->u.l.pb = &base;
372 L->ci->u.l.pc = &pc; 372 L->ci->u.l.pc = &pc;
373 if (L->hookmask & LUA_MASKCALL) 373 if (L->hookmask & LUA_MASKCALL)
374 luaD_callhook(L, LUA_HOOKCALL, -1); 374 luaD_callhook(L, LUA_HOOKCALL, -1);
@@ -377,13 +377,12 @@ StkId luaV_execute (lua_State *L) {
377 L->ci->state == (CI_SAVEDPC | CI_CALLING)); 377 L->ci->state == (CI_SAVEDPC | CI_CALLING));
378 L->ci->state = CI_HASFRAME; /* activate frame */ 378 L->ci->state = CI_HASFRAME; /* activate frame */
379 pc = L->ci->u.l.savedpc; 379 pc = L->ci->u.l.savedpc;
380 base = L->base; 380 cl = &clvalue(L->base - 1)->l;
381 cl = &clvalue(base - 1)->l;
382 k = cl->p->k; 381 k = cl->p->k;
383 /* main loop of interpreter */ 382 /* main loop of interpreter */
384 for (;;) { 383 for (;;) {
385 const Instruction i = *pc++; 384 const Instruction i = *pc++;
386 StkId ra; 385 StkId base, ra;
387 if (L->hookmask >= LUA_MASKLINE && 386 if (L->hookmask >= LUA_MASKLINE &&
388 (--L->hookcount == 0 || L->hookmask & LUA_MASKLINE)) { 387 (--L->hookcount == 0 || L->hookmask & LUA_MASKLINE)) {
389 traceexec(L); 388 traceexec(L);
@@ -394,9 +393,10 @@ StkId luaV_execute (lua_State *L) {
394 } 393 }
395 } 394 }
396 /* warning!! several calls may realloc the stack and invalidate `ra' */ 395 /* warning!! several calls may realloc the stack and invalidate `ra' */
396 base = L->base;
397 ra = RA(i); 397 ra = RA(i);
398 lua_assert(L->ci->state & CI_HASFRAME); 398 lua_assert(L->ci->state & CI_HASFRAME);
399 lua_assert(base == L->base && base == L->ci->base); 399 lua_assert(base == L->ci->base);
400 lua_assert(L->top <= L->stack + L->stacksize && L->top >= base); 400 lua_assert(L->top <= L->stack + L->stacksize && L->top >= base);
401 lua_assert(L->top == L->ci->top || 401 lua_assert(L->top == L->ci->top ||
402 GET_OPCODE(i) == OP_CALL || GET_OPCODE(i) == OP_TAILCALL || 402 GET_OPCODE(i) == OP_CALL || GET_OPCODE(i) == OP_TAILCALL ||
@@ -434,7 +434,7 @@ StkId luaV_execute (lua_State *L) {
434 v = luaH_getstr(hvalue(&cl->g), tsvalue(rb)); 434 v = luaH_getstr(hvalue(&cl->g), tsvalue(rb));
435 if (!ttisnil(v)) { setobj2s(ra, v); } 435 if (!ttisnil(v)) { setobj2s(ra, v); }
436 else 436 else
437 setobj2s(RA(i), luaV_index(L, &cl->g, rb, 0)); 437 setobj2s(XRA(i), luaV_index(L, &cl->g, rb, 0));
438 break; 438 break;
439 } 439 }
440 case OP_GETTABLE: { 440 case OP_GETTABLE: {
@@ -444,10 +444,10 @@ StkId luaV_execute (lua_State *L) {
444 const TObject *v = luaH_get(hvalue(rb), rc); 444 const TObject *v = luaH_get(hvalue(rb), rc);
445 if (!ttisnil(v)) { setobj2s(ra, v); } 445 if (!ttisnil(v)) { setobj2s(ra, v); }
446 else 446 else
447 setobj2s(RA(i), luaV_index(L, rb, rc, 0)); 447 setobj2s(XRA(i), luaV_index(L, rb, rc, 0));
448 } 448 }
449 else 449 else
450 setobj2s(RA(i), luaV_getnotable(L, rb, rc, 0)); 450 setobj2s(XRA(i), luaV_getnotable(L, rb, rc, 0));
451 break; 451 break;
452 } 452 }
453 case OP_SETGLOBAL: { 453 case OP_SETGLOBAL: {
@@ -480,10 +480,10 @@ StkId luaV_execute (lua_State *L) {
480 const TObject *v = luaH_getstr(hvalue(rb), tsvalue(rc)); 480 const TObject *v = luaH_getstr(hvalue(rb), tsvalue(rc));
481 if (!ttisnil(v)) { setobj2s(ra, v); } 481 if (!ttisnil(v)) { setobj2s(ra, v); }
482 else 482 else
483 setobj2s(RA(i), luaV_index(L, rb, rc, 0)); 483 setobj2s(XRA(i), luaV_index(L, rb, rc, 0));
484 } 484 }
485 else 485 else
486 setobj2s(RA(i), luaV_getnotable(L, rb, rc, 0)); 486 setobj2s(XRA(i), luaV_getnotable(L, rb, rc, 0));
487 break; 487 break;
488 } 488 }
489 case OP_ADD: { 489 case OP_ADD: {
@@ -552,7 +552,7 @@ StkId luaV_execute (lua_State *L) {
552 int b = GETARG_B(i); 552 int b = GETARG_B(i);
553 int c = GETARG_C(i); 553 int c = GETARG_C(i);
554 luaV_concat(L, c-b+1, c); /* may change `base' (and `ra') */ 554 luaV_concat(L, c-b+1, c); /* may change `base' (and `ra') */
555 setobjs2s(RA(i), base+b); 555 setobjs2s(XRA(i), base+b);
556 luaC_checkGC(L); 556 luaC_checkGC(L);
557 break; 557 break;
558 } 558 }
@@ -610,10 +610,11 @@ StkId luaV_execute (lua_State *L) {
610 } 610 }
611 else { /* tail call: put new frame in place of previous one */ 611 else { /* tail call: put new frame in place of previous one */
612 int aux; 612 int aux;
613 StkId ra1 = RA(i); /* `luaD_precall' may change the stack */ 613 base = (L->ci - 1)->base; /* `luaD_precall' may change the stack */
614 ra = RA(i);
614 if (L->openupval) luaF_close(L, base); 615 if (L->openupval) luaF_close(L, base);
615 for (aux = 0; ra1+aux < L->top; aux++) /* move frame down */ 616 for (aux = 0; ra+aux < L->top; aux++) /* move frame down */
616 setobjs2s(base+aux-1, ra1+aux); 617 setobjs2s(base+aux-1, ra+aux);
617 (L->ci - 1)->top = L->top = base+aux; /* correct top */ 618 (L->ci - 1)->top = L->top = base+aux; /* correct top */
618 lua_assert(L->ci->state & CI_SAVEDPC); 619 lua_assert(L->ci->state & CI_SAVEDPC);
619 (L->ci - 1)->u.l.savedpc = L->ci->u.l.savedpc; 620 (L->ci - 1)->u.l.savedpc = L->ci->u.l.savedpc;
@@ -673,7 +674,7 @@ StkId luaV_execute (lua_State *L) {
673 L->top = ra+5; 674 L->top = ra+5;
674 luaD_call(L, ra+2, GETARG_C(i) + 1); 675 luaD_call(L, ra+2, GETARG_C(i) + 1);
675 L->top = L->ci->top; 676 L->top = L->ci->top;
676 if (ttisnil(RA(i)+2)) pc++; /* skip jump (break loop) */ 677 if (ttisnil(XRA(i)+2)) pc++; /* skip jump (break loop) */
677 else dojump(pc, GETARG_sBx(*pc) + 1); /* else jump back */ 678 else dojump(pc, GETARG_sBx(*pc) + 1); /* else jump back */
678 break; 679 break;
679 } 680 }