small optimizations

This commit is contained in:
Roberto Ierusalimschy 2002-01-03 15:42:57 -02:00
parent 34df9976a9
commit facfec0687
3 changed files with 18 additions and 16 deletions

4
ldo.c
View File

@ -49,7 +49,6 @@ void luaD_init (lua_State *L, int stacksize) {
L->ci = L->base_ci; L->ci = L->base_ci;
L->ci->base = L->top; L->ci->base = L->top;
L->ci->savedpc = NULL; L->ci->savedpc = NULL;
L->ci->pc = NULL;
L->size_ci = 20; L->size_ci = 20;
L->end_ci = L->base_ci + L->size_ci; L->end_ci = L->base_ci + L->size_ci;
} }
@ -107,6 +106,7 @@ void luaD_callHook (lua_State *L, lua_Hook callhook, const char *event) {
lua_Debug ar; lua_Debug ar;
ar.event = event; ar.event = event;
ar._ci = L->ci - L->base_ci; ar._ci = L->ci - L->base_ci;
L->ci->pc = NULL; /* function is not active */
dohook(L, &ar, callhook); dohook(L, &ar, callhook);
} }
} }
@ -135,11 +135,9 @@ StkId luaD_precall (lua_State *L, StkId func) {
luaD_openstack(L, func); luaD_openstack(L, func);
setobj(func, tm); /* tag method is the new function to be called */ setobj(func, tm); /* tag method is the new function to be called */
} }
lua_assert(ttype(func) == LUA_TFUNCTION);
ci = newci(L); ci = newci(L);
ci->base = func+1; ci->base = func+1;
ci->savedpc = NULL; ci->savedpc = NULL;
ci->pc = NULL;
if (L->callhook) if (L->callhook)
luaD_callHook(L, L->callhook, "call"); luaD_callHook(L, L->callhook, "call");
if (!clvalue(func)->c.isC) return NULL; if (!clvalue(func)->c.isC) return NULL;

View File

@ -1,5 +1,5 @@
/* /*
** $Id: lstate.h,v 1.1 2001/11/29 22:14:34 rieru Exp rieru $ ** $Id: lstate.h,v 1.68 2001/12/18 20:52:30 roberto Exp $
** Global State ** Global State
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -76,6 +76,7 @@ typedef struct CallInfo {
StkId base; /* base for called function */ StkId base; /* base for called function */
const Instruction *savedpc; const Instruction *savedpc;
lua_Hook linehook; lua_Hook linehook;
StkId top; /* top for this function (when it's a Lua function) */
/* extra information for debugging */ /* extra information for debugging */
const Instruction **pc; const Instruction **pc;
int lastpc; /* last pc traced */ int lastpc; /* last pc traced */

27
lvm.c
View File

@ -105,7 +105,6 @@ static void callTM (lua_State *L, const TObject *f,
} }
/* /*
** Function to index a table. ** Function to index a table.
** Receives the table at `t' and the key at `key'. ** 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) {
} }
/* /*
** Receives table at `t', key at `key' and value at `val'. ** Receives table at `t', key at `key' and value at `val'.
*/ */
@ -285,7 +283,7 @@ static void powOp (lua_State *L, StkId ra, StkId rb, StkId rc) {
TObject tempb, tempc; TObject tempb, tempc;
if ((b = luaV_tonumber(b, &tempb)) != NULL && if ((b = luaV_tonumber(b, &tempb)) != NULL &&
(c = luaV_tonumber(c, &tempc)) != NULL) { (c = luaV_tonumber(c, &tempc)) != NULL) {
TObject o, f; TObject f, o;
setsvalue(&o, luaS_newliteral(L, "pow")); setsvalue(&o, luaS_newliteral(L, "pow"));
luaV_gettable(L, gt(L), &o, &f); luaV_gettable(L, gt(L), &o, &f);
if (ttype(&f) != LUA_TFUNCTION) if (ttype(&f) != LUA_TFUNCTION)
@ -323,10 +321,10 @@ static void powOp (lua_State *L, StkId ra, StkId rb, StkId rc) {
} }
#define luaV_poscall(L,c,f) \ #define luaV_poscall(L,c,f,ci) \
if (c != NO_REG) { \ if (c != NO_REG) { \
luaD_poscall(L, c, f); \ luaD_poscall(L, c, f); \
L->top = base + cl->p->maxstacksize; \ L->top = ci->top; \
} \ } \
else { \ else { \
luaD_poscall(L, LUA_MULTRET, f); \ luaD_poscall(L, LUA_MULTRET, f); \
@ -344,14 +342,15 @@ StkId luaV_execute (lua_State *L, const LClosure *cl, StkId base) {
lua_Hook linehook; lua_Hook linehook;
reinit: reinit:
lua_assert(L->ci->savedpc == NULL); lua_assert(L->ci->savedpc == NULL);
L->ci->pc = &pc;
L->ci->top = base + cl->p->maxstacksize;
if (cl->p->is_vararg) /* varargs? */ if (cl->p->is_vararg) /* varargs? */
adjust_varargs(L, base, cl->p->numparams); adjust_varargs(L, base, cl->p->numparams);
if (base > L->stack_last - cl->p->maxstacksize) if (base > L->stack_last - cl->p->maxstacksize)
luaD_stackerror(L); luaD_stackerror(L);
while (L->top < base + cl->p->maxstacksize) while (L->top < L->ci->top)
setnilvalue(L->top++); setnilvalue(L->top++);
L->top = base + cl->p->maxstacksize; L->top = L->ci->top;
L->ci->pc = &pc;
linehook = L->ci->linehook = L->linehook; linehook = L->ci->linehook = L->linehook;
pc = cl->p->code; pc = cl->p->code;
/* main loop of interpreter */ /* main loop of interpreter */
@ -360,6 +359,8 @@ StkId luaV_execute (lua_State *L, const LClosure *cl, StkId base) {
const StkId ra = RA(i); const StkId ra = RA(i);
if (linehook) if (linehook)
traceexec(L, linehook); traceexec(L, linehook);
lua_assert(L->top == L->ci->top || GET_OPCODE(i) == OP_CALL ||
GET_OPCODE(i) == OP_RETURN || GET_OPCODE(i) == OP_SETLISTO);
switch (GET_OPCODE(i)) { switch (GET_OPCODE(i)) {
case OP_MOVE: { case OP_MOVE: {
setobj(ra, RB(i)); setobj(ra, RB(i));
@ -539,7 +540,7 @@ StkId luaV_execute (lua_State *L, const LClosure *cl, StkId base) {
firstResult = luaD_precall(L, ra); firstResult = luaD_precall(L, ra);
if (firstResult) { if (firstResult) {
/* it was a C function (`precall' called it); adjust results */ /* it was a C function (`precall' called it); adjust results */
luaV_poscall(L, GETARG_C(i), firstResult); luaV_poscall(L, GETARG_C(i), firstResult, L->ci);
} }
else { /* it is a Lua function: `call' it */ else { /* it is a Lua function: `call' it */
CallInfo *ci = L->ci; CallInfo *ci = L->ci;
@ -553,7 +554,7 @@ StkId luaV_execute (lua_State *L, const LClosure *cl, StkId base) {
case OP_RETURN: { case OP_RETURN: {
CallInfo *ci; CallInfo *ci;
int b; int b;
luaF_close(L, base); if (L->openupval) luaF_close(L, base);
b = GETARG_B(i); b = GETARG_B(i);
if (b != NO_REG) L->top = ra+b; if (b != NO_REG) L->top = ra+b;
ci = L->ci - 1; ci = L->ci - 1;
@ -567,7 +568,7 @@ StkId luaV_execute (lua_State *L, const LClosure *cl, StkId base) {
pc = ci->savedpc; pc = ci->savedpc;
ci->savedpc = NULL; ci->savedpc = NULL;
lua_assert(GET_OPCODE(*(pc-1)) == OP_CALL); lua_assert(GET_OPCODE(*(pc-1)) == OP_CALL);
luaV_poscall(L, GETARG_C(*(pc-1)), ra); luaV_poscall(L, GETARG_C(*(pc-1)), ra, ci);
} }
break; break;
} }
@ -630,8 +631,10 @@ StkId luaV_execute (lua_State *L, const LClosure *cl, StkId base) {
bc = GETARG_Bc(i); bc = GETARG_Bc(i);
if (GET_OPCODE(i) == OP_SETLIST) if (GET_OPCODE(i) == OP_SETLIST)
n = (bc&(LFIELDS_PER_FLUSH-1)) + 1; n = (bc&(LFIELDS_PER_FLUSH-1)) + 1;
else else {
n = L->top - ra - 1; n = L->top - ra - 1;
L->top = L->ci->top;
}
bc &= ~(LFIELDS_PER_FLUSH-1); /* bc = bc - bc%FPF */ bc &= ~(LFIELDS_PER_FLUSH-1); /* bc = bc - bc%FPF */
for (; n > 0; n--) for (; n > 0; n--)
luaH_setnum(L, h, bc+n, ra+n); luaH_setnum(L, h, bc+n, ra+n);