lua

A copy of the Lua development repository
Log | Files | Refs | README

commit 42754c0f15ded97342d3aa67f719e1962fab702a
parent 18afb90349fc1b698d179e29fdc014589c2e1145
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date:   Thu, 20 Dec 2001 19:26:30 -0200

small optimizations

Diffstat:
Mlapi.c | 4+++-
Mldo.c | 10----------
Mldo.h | 1-
Mlvm.c | 32+++++++++++++++-----------------
4 files changed, 18 insertions(+), 29 deletions(-)

diff --git a/lapi.c b/lapi.c @@ -104,7 +104,9 @@ LUA_API void lua_settop (lua_State *L, int index) { lua_lock(L); if (index >= 0) { api_check(L, index <= L->stack_last - L->ci->base); - luaD_adjusttop(L, L->ci->base+index); + while (L->top < L->ci->base + index) + setnilvalue(L->top++); + L->top = L->ci->base + index; } else { api_check(L, -(index+1) <= (L->top - L->ci->base)); diff --git a/ldo.c b/ldo.c @@ -69,16 +69,6 @@ void luaD_stackerror (lua_State *L) { /* -** adjust top to new value; assume that new top is valid -*/ -void luaD_adjusttop (lua_State *L, StkId newtop) { - while (L->top < newtop) - setnilvalue(L->top++); - L->top = newtop; /* `newtop' could be lower than `top' */ -} - - -/* ** Open a hole inside the stack at `pos' */ static void luaD_openstack (lua_State *L, StkId pos) { diff --git a/ldo.h b/ldo.h @@ -23,7 +23,6 @@ void luaD_init (lua_State *L, int stacksize); -void luaD_adjusttop (lua_State *L, StkId newtop); void luaD_lineHook (lua_State *L, int line, lua_Hook linehook); void luaD_callHook (lua_State *L, lua_Hook callhook, const char *event); StkId luaD_precall (lua_State *L, StkId func); diff --git a/lvm.c b/lvm.c @@ -256,33 +256,29 @@ void luaV_strconc (lua_State *L, int total, StkId top) { } -static void luaV_pack (lua_State *L, StkId firstelem) { +static void adjust_varargs (lua_State *L, StkId base, int nfixargs) { int i; - Table *htab = luaH_new(L, 0, 0); + Table *htab; TObject n, nname; - for (i=0; firstelem+i<L->top; i++) - luaH_setnum(L, htab, i+1, firstelem+i); + StkId firstvar = base + nfixargs; /* position of first vararg */ + if (L->top < firstvar) { + luaD_checkstack(L, firstvar - L->top); + while (L->top < firstvar) + setnilvalue(L->top++); + } + htab = luaH_new(L, 0, 0); + for (i=0; firstvar+i<L->top; i++) + luaH_setnum(L, htab, i+1, firstvar+i); /* store counter in field `n' */ setnvalue(&n, i); setsvalue(&nname, luaS_newliteral(L, "n")); luaH_set(L, htab, &nname, &n); - L->top = firstelem; /* remove elements from the stack */ + L->top = firstvar; /* remove elements from the stack */ sethvalue(L->top, htab); incr_top; } -static void adjust_varargs (lua_State *L, StkId base, int nfixargs) { - int nvararg = (L->top-base) - nfixargs; - StkId firstvar = base + nfixargs; /* position of first vararg */ - if (nvararg < 0) { - luaD_checkstack(L, -nvararg); - luaD_adjusttop(L, firstvar); - } - luaV_pack(L, firstvar); -} - - static void powOp (lua_State *L, StkId ra, StkId rb, StkId rc) { const TObject *b = rb; const TObject *c = rc; @@ -352,7 +348,9 @@ StkId luaV_execute (lua_State *L, const LClosure *cl, StkId base) { adjust_varargs(L, base, cl->p->numparams); if (base > L->stack_last - cl->p->maxstacksize) luaD_stackerror(L); - luaD_adjusttop(L, base + cl->p->maxstacksize); + while (L->top < base + cl->p->maxstacksize) + setnilvalue(L->top++); + L->top = base + cl->p->maxstacksize; L->ci->pc = &pc; linehook = L->ci->linehook = L->linehook; pc = cl->p->code;