commit 42754c0f15ded97342d3aa67f719e1962fab702a
parent 18afb90349fc1b698d179e29fdc014589c2e1145
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date: Thu, 20 Dec 2001 19:26:30 -0200
small optimizations
Diffstat:
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;