diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-11-21 13:46:44 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-11-21 13:46:44 -0200 |
commit | be00cd2a6b0f7d26dfc9ba74c262a5574f6521d0 (patch) | |
tree | 9e77cd6c9e5ba76da495e6b14fea84d3fbfeda4b /lvm.c | |
parent | 2e4e888de02d248fc2688dd740de92f8f4f56656 (diff) | |
download | lua-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.c | 35 |
1 files changed, 18 insertions, 17 deletions
@@ -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 | ||
365 | StkId luaV_execute (lua_State *L) { | 367 | StkId 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 | } |