From 8c8ad5f3fffae16a751f2419a5972ec7ffd6babf Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Thu, 30 Aug 2001 17:56:43 -0300 Subject: better locality of assignment of table values --- lapi.c | 6 +++--- lcode.c | 4 ++-- ltable.c | 36 ++++++++++++++++++------------------ ltable.h | 11 +++++++---- ltm.c | 10 ++++++---- lvm.c | 21 ++++++++++++--------- 6 files changed, 48 insertions(+), 40 deletions(-) diff --git a/lapi.c b/lapi.c index 60877553..a349c657 100644 --- a/lapi.c +++ b/lapi.c @@ -1,5 +1,5 @@ /* -** $Id: lapi.c,v 1.148 2001/07/12 18:11:58 roberto Exp roberto $ +** $Id: lapi.c,v 1.149 2001/07/22 00:59:36 roberto Exp roberto $ ** Lua API ** See Copyright Notice in lua.h */ @@ -443,7 +443,7 @@ LUA_API void lua_rawset (lua_State *L, int index) { api_checknelems(L, 2); t = luaA_index(L, index); api_check(L, ttype(t) == LUA_TTABLE); - setobj(luaH_set(L, hvalue(t), L->top-2), (L->top-1)); + luaH_set(L, hvalue(t), L->top-2, L->top-1); L->top -= 2; lua_unlock(L); } @@ -455,7 +455,7 @@ LUA_API void lua_rawseti (lua_State *L, int index, int n) { api_checknelems(L, 1); o = luaA_index(L, index); api_check(L, ttype(o) == LUA_TTABLE); - setobj(luaH_setnum(L, hvalue(o), n), (L->top-1)); + luaH_setnum(L, hvalue(o), n, L->top-1); L->top--; lua_unlock(L); } diff --git a/lcode.c b/lcode.c index 49b7ed4f..694a715d 100644 --- a/lcode.c +++ b/lcode.c @@ -1,5 +1,5 @@ /* -** $Id: lcode.c,v 1.78 2001/07/24 17:19:07 roberto Exp roberto $ +** $Id: lcode.c,v 1.79 2001/08/27 15:16:28 roberto Exp roberto $ ** Code generator for Lua ** See Copyright Notice in lua.h */ @@ -235,7 +235,7 @@ static int addk (FuncState *fs, TObject *k) { MAXARG_Bc, l_s("constant table overflow")); setobj(&f->k[fs->nk], k); setnvalue(&o, fs->nk); - setobj(luaH_set(fs->L, fs->h, k), &o); + luaH_set(fs->L, fs->h, k, &o); return fs->nk++; } } diff --git a/ltable.c b/ltable.c index aea20f38..2cafc51b 100644 --- a/ltable.c +++ b/ltable.c @@ -1,5 +1,5 @@ /* -** $Id: ltable.c,v 1.82 2001/06/26 13:20:45 roberto Exp roberto $ +** $Id: ltable.c,v 1.83 2001/07/05 20:31:14 roberto Exp roberto $ ** Lua tables (hash) ** See Copyright Notice in lua.h */ @@ -161,10 +161,8 @@ static void rehash (lua_State *L, Hash *t) { setnodevector(L, t, oldsize); /* just rehash; keep the same size */ for (i=0; ifirstfree)--; } rehash(L, t); /* no more free places */ - return luaH_set(L, t, key); /* `rehash' invalidates this insertion */ + return newkey(L, t, key); /* `rehash' invalidates this insertion */ } @@ -271,32 +269,34 @@ const TObject *luaH_get (Hash *t, const TObject *key) { } -TObject *luaH_set (lua_State *L, Hash *t, const TObject *key) { +void luaH_set (lua_State *L, Hash *t, const TObject *key, const TObject *val) { const TObject *p = luaH_get(t, key); - if (p != &luaO_nilobject) return (TObject *)p; - else if (ttype(key) == LUA_TNIL) luaD_error(L, l_s("table index is nil")); - return newkey(L, t, key); + if (p == &luaO_nilobject) { + if (ttype(key) == LUA_TNIL) luaD_error(L, l_s("table index is nil")); + p = newkey(L, t, key); + } + settableval(p, val); } -TObject *luaH_setstr (lua_State *L, Hash *t, TString *key) { +void luaH_setstr (lua_State *L, Hash *t, TString *key, const TObject *val) { const TObject *p = luaH_getstr(t, key); - if (p != &luaO_nilobject) return (TObject *)p; - else { + if (p == &luaO_nilobject) { TObject k; setsvalue(&k, key); - return newkey(L, t, &k); + p = newkey(L, t, &k); } + settableval(p, val); } -TObject *luaH_setnum (lua_State *L, Hash *t, int key) { +void luaH_setnum (lua_State *L, Hash *t, int key, const TObject *val) { const TObject *p = luaH_getnum(t, key); - if (p != &luaO_nilobject) return (TObject *)p; - else { + if (p == &luaO_nilobject) { TObject k; setnvalue(&k, key); - return newkey(L, t, &k); + p = newkey(L, t, &k); } + settableval(p, val); } diff --git a/ltable.h b/ltable.h index df0ff232..24ec0355 100644 --- a/ltable.h +++ b/ltable.h @@ -1,5 +1,5 @@ /* -** $Id: ltable.h,v 1.33 2001/06/26 13:20:45 roberto Exp roberto $ +** $Id: ltable.h,v 1.34 2001/07/05 20:31:14 roberto Exp roberto $ ** Lua tables (hash) ** See Copyright Notice in lua.h */ @@ -14,12 +14,15 @@ #define key(_n) (&(_n)->key) #define val(_n) (&(_n)->val) +#define settableval(p,v) setobj((TObject *)p, v) + + const TObject *luaH_getnum (Hash *t, int key); -TObject *luaH_setnum (lua_State *L, Hash *t, int key); +void luaH_setnum (lua_State *L, Hash *t, int key, const TObject *val); const TObject *luaH_getstr (Hash *t, TString *key); -TObject *luaH_setstr (lua_State *L, Hash *t, TString *key); +void luaH_setstr (lua_State *L, Hash *t, TString *key, const TObject *val); const TObject *luaH_get (Hash *t, const TObject *key); -TObject *luaH_set (lua_State *L, Hash *t, const TObject *key); +void luaH_set (lua_State *L, Hash *t, const TObject *key, const TObject *val); Hash *luaH_new (lua_State *L, int nhash); void luaH_free (lua_State *L, Hash *t); Node *luaH_next (lua_State *L, Hash *t, const TObject *r); diff --git a/ltm.c b/ltm.c index 4b66124f..1552c84b 100644 --- a/ltm.c +++ b/ltm.c @@ -1,5 +1,5 @@ /* -** $Id: ltm.c,v 1.75 2001/07/23 19:56:00 roberto Exp roberto $ +** $Id: ltm.c,v 1.76 2001/07/24 22:39:34 roberto Exp roberto $ ** Tag methods ** See Copyright Notice in lua.h */ @@ -84,11 +84,13 @@ int luaT_newtag (lua_State *L, const l_char *name, int basictype) { MAX_INT, l_s("tag table overflow")); tag = G(L)->ntag; if (name) { - TObject *v; + const TObject *v; + TObject otag; ts = luaS_new(L, name); - v = luaH_setstr(L, G(L)->type2tag, ts); + v = luaH_getstr(G(L)->type2tag, ts); if (ttype(v) == LUA_TNUMBER) return (int)nvalue(v); - setnvalue(v, tag); + setnvalue(&otag, tag); + luaH_setstr(L, G(L)->type2tag, ts, &otag); } for (i=0; ihtag; if (hvalue(t)->htag == LUA_TTABLE || /* with default tag? */ (tm = luaT_gettm(G(L), tg, TM_SETTABLE)) == NULL) { /* or no TM? */ - setobj(luaH_set(L, hvalue(t), key), val); /* do a primitive set */ + luaH_set(L, hvalue(t), key, val); /* do a primitive set */ return; } /* else will call the tag method */ @@ -212,11 +212,14 @@ void luaV_getglobal (lua_State *L, TString *name, StkId res) { void luaV_setglobal (lua_State *L, TString *name, StkId val) { - TObject *oldvalue = luaH_setstr(L, L->gt, name); + const TObject *oldvalue = luaH_getstr(L->gt, name); Closure *tm; if (!HAS_TM_SETGLOBAL(L, ttype(oldvalue)) || /* no tag methods? */ (tm = luaT_gettmbyObj(G(L), oldvalue, TM_SETGLOBAL)) == NULL) { - setobj(oldvalue, val); /* raw set */ + if (oldvalue == &luaO_nilobject) + luaH_setstr(L, L->gt, name, val); /* raw set */ + else + settableval(oldvalue, val); /* warning: tricky optimization! */ } else setTM(L, callTM(L, tm, l_s("soo"), name, oldvalue, val)); @@ -317,12 +320,12 @@ void luaV_strconc (lua_State *L, int total, StkId top) { static void luaV_pack (lua_State *L, StkId firstelem) { int i; Hash *htab = luaH_new(L, 0); - TObject *n; + TObject n; for (i=0; firstelem+itop; i++) - setobj(luaH_setnum(L, htab, i+1), firstelem+i); + luaH_setnum(L, htab, i+1, firstelem+i); /* store counter in field `n' */ - n = luaH_setstr(L, htab, luaS_newliteral(L, l_s("n"))); - setnvalue(n, i); + setnvalue(&n, i); + luaH_setstr(L, htab, luaS_newliteral(L, l_s("n")), &n); L->top = firstelem; /* remove elements from the stack */ sethvalue(L->top, htab); incr_top; @@ -640,7 +643,7 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { n = L->top - ra - 1; bc &= ~(LFIELDS_PER_FLUSH-1); /* bc = bc - bc%FPF */ for (; n > 0; n--) - setobj(luaH_setnum(L, h, bc+n), ra+n); + luaH_setnum(L, h, bc+n, ra+n); break; } case OP_CLOSURE: { -- cgit v1.2.3-55-g6feb