diff options
| -rw-r--r-- | ldo.c | 9 | ||||
| -rw-r--r-- | lstate.h | 3 | ||||
| -rw-r--r-- | lvm.c | 35 |
3 files changed, 21 insertions, 26 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ldo.c,v 1.204 2002/11/18 18:45:38 roberto Exp roberto $ | 2 | ** $Id: ldo.c,v 1.205 2002/11/21 15:16:04 roberto Exp roberto $ |
| 3 | ** Stack and Call structure of Lua | 3 | ** Stack and Call structure of Lua |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -107,13 +107,8 @@ static void correctstack (lua_State *L, TObject *oldstack) { | |||
| 107 | for (up = L->openupval; up != NULL; up = up->gch.next) | 107 | for (up = L->openupval; up != NULL; up = up->gch.next) |
| 108 | gcotouv(up)->v = (gcotouv(up)->v - oldstack) + L->stack; | 108 | gcotouv(up)->v = (gcotouv(up)->v - oldstack) + L->stack; |
| 109 | for (ci = L->base_ci; ci <= L->ci; ci++) { | 109 | for (ci = L->base_ci; ci <= L->ci; ci++) { |
| 110 | StkId newbase = (ci->base - oldstack) + L->stack; | ||
| 111 | ci->top = (ci->top - oldstack) + L->stack; | 110 | ci->top = (ci->top - oldstack) + L->stack; |
| 112 | if (ci->state & CI_HASFRAME) { /* Lua function with active frame? */ | 111 | ci->base = (ci->base - oldstack) + L->stack; |
| 113 | lua_assert(*ci->u.l.pb == ci->base); | ||
| 114 | *ci->u.l.pb = newbase; /* correct frame */ | ||
| 115 | } | ||
| 116 | ci->base = newbase; | ||
| 117 | } | 112 | } |
| 118 | L->base = L->ci->base; | 113 | L->base = L->ci->base; |
| 119 | } | 114 | } |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lstate.h,v 1.103 2002/11/18 15:23:43 roberto Exp roberto $ | 2 | ** $Id: lstate.h,v 1.104 2002/11/21 15:16:04 roberto Exp roberto $ |
| 3 | ** Global State | 3 | ** Global State |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -80,7 +80,6 @@ typedef struct CallInfo { | |||
| 80 | struct { /* for Lua functions */ | 80 | struct { /* for Lua functions */ |
| 81 | const Instruction *savedpc; | 81 | const Instruction *savedpc; |
| 82 | const Instruction **pc; /* points to `pc' variable in `luaV_execute' */ | 82 | const Instruction **pc; /* points to `pc' variable in `luaV_execute' */ |
| 83 | StkId *pb; /* points to `base' variable in `luaV_execute' */ | ||
| 84 | } l; | 83 | } l; |
| 85 | struct { /* for C functions */ | 84 | struct { /* for C functions */ |
| 86 | int dummy; /* just to avoid an empty struct */ | 85 | int dummy; /* just to avoid an empty struct */ |
| @@ -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 | } |
