diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-12-20 19:26:52 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-12-20 19:26:52 -0200 |
commit | 42754c0f15ded97342d3aa67f719e1962fab702a (patch) | |
tree | 5d90865c6b16474307aeba155550184ad12df5a6 /lvm.c | |
parent | 18afb90349fc1b698d179e29fdc014589c2e1145 (diff) | |
download | lua-github-42754c0f15ded97342d3aa67f719e1962fab702a.tar.gz |
small optimizations
Diffstat (limited to 'lvm.c')
-rw-r--r-- | lvm.c | 32 |
1 files changed, 15 insertions, 17 deletions
@@ -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; |