diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-01-03 15:42:57 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-01-03 15:42:57 -0200 |
commit | facfec0687ff20351d3c7520344a722b9149c9ea (patch) | |
tree | 142f5863ac2663f6714a712eca9be2407e7aaf0a /lvm.c | |
parent | 34df9976a9fe9a94a4ee96d7ff0ebceac025172d (diff) | |
download | lua-facfec0687ff20351d3c7520344a722b9149c9ea.tar.gz lua-facfec0687ff20351d3c7520344a722b9149c9ea.tar.bz2 lua-facfec0687ff20351d3c7520344a722b9149c9ea.zip |
small optimizations
Diffstat (limited to 'lvm.c')
-rw-r--r-- | lvm.c | 27 |
1 files changed, 15 insertions, 12 deletions
@@ -105,7 +105,6 @@ static void callTM (lua_State *L, const TObject *f, | |||
105 | } | 105 | } |
106 | 106 | ||
107 | 107 | ||
108 | |||
109 | /* | 108 | /* |
110 | ** Function to index a table. | 109 | ** Function to index a table. |
111 | ** Receives the table at `t' and the key at `key'. | 110 | ** Receives the table at `t' and the key at `key'. |
@@ -141,7 +140,6 @@ void luaV_gettable (lua_State *L, StkId t, TObject *key, StkId res) { | |||
141 | } | 140 | } |
142 | 141 | ||
143 | 142 | ||
144 | |||
145 | /* | 143 | /* |
146 | ** Receives table at `t', key at `key' and value at `val'. | 144 | ** Receives table at `t', key at `key' and value at `val'. |
147 | */ | 145 | */ |
@@ -285,7 +283,7 @@ static void powOp (lua_State *L, StkId ra, StkId rb, StkId rc) { | |||
285 | TObject tempb, tempc; | 283 | TObject tempb, tempc; |
286 | if ((b = luaV_tonumber(b, &tempb)) != NULL && | 284 | if ((b = luaV_tonumber(b, &tempb)) != NULL && |
287 | (c = luaV_tonumber(c, &tempc)) != NULL) { | 285 | (c = luaV_tonumber(c, &tempc)) != NULL) { |
288 | TObject o, f; | 286 | TObject f, o; |
289 | setsvalue(&o, luaS_newliteral(L, "pow")); | 287 | setsvalue(&o, luaS_newliteral(L, "pow")); |
290 | luaV_gettable(L, gt(L), &o, &f); | 288 | luaV_gettable(L, gt(L), &o, &f); |
291 | if (ttype(&f) != LUA_TFUNCTION) | 289 | if (ttype(&f) != LUA_TFUNCTION) |
@@ -323,10 +321,10 @@ static void powOp (lua_State *L, StkId ra, StkId rb, StkId rc) { | |||
323 | } | 321 | } |
324 | 322 | ||
325 | 323 | ||
326 | #define luaV_poscall(L,c,f) \ | 324 | #define luaV_poscall(L,c,f,ci) \ |
327 | if (c != NO_REG) { \ | 325 | if (c != NO_REG) { \ |
328 | luaD_poscall(L, c, f); \ | 326 | luaD_poscall(L, c, f); \ |
329 | L->top = base + cl->p->maxstacksize; \ | 327 | L->top = ci->top; \ |
330 | } \ | 328 | } \ |
331 | else { \ | 329 | else { \ |
332 | luaD_poscall(L, LUA_MULTRET, f); \ | 330 | luaD_poscall(L, LUA_MULTRET, f); \ |
@@ -344,14 +342,15 @@ StkId luaV_execute (lua_State *L, const LClosure *cl, StkId base) { | |||
344 | lua_Hook linehook; | 342 | lua_Hook linehook; |
345 | reinit: | 343 | reinit: |
346 | lua_assert(L->ci->savedpc == NULL); | 344 | lua_assert(L->ci->savedpc == NULL); |
345 | L->ci->pc = &pc; | ||
346 | L->ci->top = base + cl->p->maxstacksize; | ||
347 | if (cl->p->is_vararg) /* varargs? */ | 347 | if (cl->p->is_vararg) /* varargs? */ |
348 | adjust_varargs(L, base, cl->p->numparams); | 348 | adjust_varargs(L, base, cl->p->numparams); |
349 | if (base > L->stack_last - cl->p->maxstacksize) | 349 | if (base > L->stack_last - cl->p->maxstacksize) |
350 | luaD_stackerror(L); | 350 | luaD_stackerror(L); |
351 | while (L->top < base + cl->p->maxstacksize) | 351 | while (L->top < L->ci->top) |
352 | setnilvalue(L->top++); | 352 | setnilvalue(L->top++); |
353 | L->top = base + cl->p->maxstacksize; | 353 | L->top = L->ci->top; |
354 | L->ci->pc = &pc; | ||
355 | linehook = L->ci->linehook = L->linehook; | 354 | linehook = L->ci->linehook = L->linehook; |
356 | pc = cl->p->code; | 355 | pc = cl->p->code; |
357 | /* main loop of interpreter */ | 356 | /* main loop of interpreter */ |
@@ -360,6 +359,8 @@ StkId luaV_execute (lua_State *L, const LClosure *cl, StkId base) { | |||
360 | const StkId ra = RA(i); | 359 | const StkId ra = RA(i); |
361 | if (linehook) | 360 | if (linehook) |
362 | traceexec(L, linehook); | 361 | traceexec(L, linehook); |
362 | lua_assert(L->top == L->ci->top || GET_OPCODE(i) == OP_CALL || | ||
363 | GET_OPCODE(i) == OP_RETURN || GET_OPCODE(i) == OP_SETLISTO); | ||
363 | switch (GET_OPCODE(i)) { | 364 | switch (GET_OPCODE(i)) { |
364 | case OP_MOVE: { | 365 | case OP_MOVE: { |
365 | setobj(ra, RB(i)); | 366 | setobj(ra, RB(i)); |
@@ -539,7 +540,7 @@ StkId luaV_execute (lua_State *L, const LClosure *cl, StkId base) { | |||
539 | firstResult = luaD_precall(L, ra); | 540 | firstResult = luaD_precall(L, ra); |
540 | if (firstResult) { | 541 | if (firstResult) { |
541 | /* it was a C function (`precall' called it); adjust results */ | 542 | /* it was a C function (`precall' called it); adjust results */ |
542 | luaV_poscall(L, GETARG_C(i), firstResult); | 543 | luaV_poscall(L, GETARG_C(i), firstResult, L->ci); |
543 | } | 544 | } |
544 | else { /* it is a Lua function: `call' it */ | 545 | else { /* it is a Lua function: `call' it */ |
545 | CallInfo *ci = L->ci; | 546 | CallInfo *ci = L->ci; |
@@ -553,7 +554,7 @@ StkId luaV_execute (lua_State *L, const LClosure *cl, StkId base) { | |||
553 | case OP_RETURN: { | 554 | case OP_RETURN: { |
554 | CallInfo *ci; | 555 | CallInfo *ci; |
555 | int b; | 556 | int b; |
556 | luaF_close(L, base); | 557 | if (L->openupval) luaF_close(L, base); |
557 | b = GETARG_B(i); | 558 | b = GETARG_B(i); |
558 | if (b != NO_REG) L->top = ra+b; | 559 | if (b != NO_REG) L->top = ra+b; |
559 | ci = L->ci - 1; | 560 | ci = L->ci - 1; |
@@ -567,7 +568,7 @@ StkId luaV_execute (lua_State *L, const LClosure *cl, StkId base) { | |||
567 | pc = ci->savedpc; | 568 | pc = ci->savedpc; |
568 | ci->savedpc = NULL; | 569 | ci->savedpc = NULL; |
569 | lua_assert(GET_OPCODE(*(pc-1)) == OP_CALL); | 570 | lua_assert(GET_OPCODE(*(pc-1)) == OP_CALL); |
570 | luaV_poscall(L, GETARG_C(*(pc-1)), ra); | 571 | luaV_poscall(L, GETARG_C(*(pc-1)), ra, ci); |
571 | } | 572 | } |
572 | break; | 573 | break; |
573 | } | 574 | } |
@@ -630,8 +631,10 @@ StkId luaV_execute (lua_State *L, const LClosure *cl, StkId base) { | |||
630 | bc = GETARG_Bc(i); | 631 | bc = GETARG_Bc(i); |
631 | if (GET_OPCODE(i) == OP_SETLIST) | 632 | if (GET_OPCODE(i) == OP_SETLIST) |
632 | n = (bc&(LFIELDS_PER_FLUSH-1)) + 1; | 633 | n = (bc&(LFIELDS_PER_FLUSH-1)) + 1; |
633 | else | 634 | else { |
634 | n = L->top - ra - 1; | 635 | n = L->top - ra - 1; |
636 | L->top = L->ci->top; | ||
637 | } | ||
635 | bc &= ~(LFIELDS_PER_FLUSH-1); /* bc = bc - bc%FPF */ | 638 | bc &= ~(LFIELDS_PER_FLUSH-1); /* bc = bc - bc%FPF */ |
636 | for (; n > 0; n--) | 639 | for (; n > 0; n--) |
637 | luaH_setnum(L, h, bc+n, ra+n); | 640 | luaH_setnum(L, h, bc+n, ra+n); |