diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-08-30 17:56:43 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-08-30 17:56:43 -0300 |
| commit | 8c8ad5f3fffae16a751f2419a5972ec7ffd6babf (patch) | |
| tree | db9e7977a263eb91b4c990420af203ce0d4f7d2a | |
| parent | 34a09b65f3b6ef5f7699263b09ad088ec087aca2 (diff) | |
| download | lua-8c8ad5f3fffae16a751f2419a5972ec7ffd6babf.tar.gz lua-8c8ad5f3fffae16a751f2419a5972ec7ffd6babf.tar.bz2 lua-8c8ad5f3fffae16a751f2419a5972ec7ffd6babf.zip | |
better locality of assignment of table values
| -rw-r--r-- | lapi.c | 6 | ||||
| -rw-r--r-- | lcode.c | 4 | ||||
| -rw-r--r-- | ltable.c | 36 | ||||
| -rw-r--r-- | ltable.h | 11 | ||||
| -rw-r--r-- | ltm.c | 10 | ||||
| -rw-r--r-- | lvm.c | 21 |
6 files changed, 48 insertions, 40 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lapi.c,v 1.148 2001/07/12 18:11:58 roberto Exp roberto $ | 2 | ** $Id: lapi.c,v 1.149 2001/07/22 00:59:36 roberto Exp roberto $ |
| 3 | ** Lua API | 3 | ** Lua API |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -443,7 +443,7 @@ LUA_API void lua_rawset (lua_State *L, int index) { | |||
| 443 | api_checknelems(L, 2); | 443 | api_checknelems(L, 2); |
| 444 | t = luaA_index(L, index); | 444 | t = luaA_index(L, index); |
| 445 | api_check(L, ttype(t) == LUA_TTABLE); | 445 | api_check(L, ttype(t) == LUA_TTABLE); |
| 446 | setobj(luaH_set(L, hvalue(t), L->top-2), (L->top-1)); | 446 | luaH_set(L, hvalue(t), L->top-2, L->top-1); |
| 447 | L->top -= 2; | 447 | L->top -= 2; |
| 448 | lua_unlock(L); | 448 | lua_unlock(L); |
| 449 | } | 449 | } |
| @@ -455,7 +455,7 @@ LUA_API void lua_rawseti (lua_State *L, int index, int n) { | |||
| 455 | api_checknelems(L, 1); | 455 | api_checknelems(L, 1); |
| 456 | o = luaA_index(L, index); | 456 | o = luaA_index(L, index); |
| 457 | api_check(L, ttype(o) == LUA_TTABLE); | 457 | api_check(L, ttype(o) == LUA_TTABLE); |
| 458 | setobj(luaH_setnum(L, hvalue(o), n), (L->top-1)); | 458 | luaH_setnum(L, hvalue(o), n, L->top-1); |
| 459 | L->top--; | 459 | L->top--; |
| 460 | lua_unlock(L); | 460 | lua_unlock(L); |
| 461 | } | 461 | } |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lcode.c,v 1.78 2001/07/24 17:19:07 roberto Exp roberto $ | 2 | ** $Id: lcode.c,v 1.79 2001/08/27 15:16:28 roberto Exp roberto $ |
| 3 | ** Code generator for Lua | 3 | ** Code generator for Lua |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -235,7 +235,7 @@ static int addk (FuncState *fs, TObject *k) { | |||
| 235 | MAXARG_Bc, l_s("constant table overflow")); | 235 | MAXARG_Bc, l_s("constant table overflow")); |
| 236 | setobj(&f->k[fs->nk], k); | 236 | setobj(&f->k[fs->nk], k); |
| 237 | setnvalue(&o, fs->nk); | 237 | setnvalue(&o, fs->nk); |
| 238 | setobj(luaH_set(fs->L, fs->h, k), &o); | 238 | luaH_set(fs->L, fs->h, k, &o); |
| 239 | return fs->nk++; | 239 | return fs->nk++; |
| 240 | } | 240 | } |
| 241 | } | 241 | } |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ltable.c,v 1.82 2001/06/26 13:20:45 roberto Exp roberto $ | 2 | ** $Id: ltable.c,v 1.83 2001/07/05 20:31:14 roberto Exp roberto $ |
| 3 | ** Lua tables (hash) | 3 | ** Lua tables (hash) |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -161,10 +161,8 @@ static void rehash (lua_State *L, Hash *t) { | |||
| 161 | setnodevector(L, t, oldsize); /* just rehash; keep the same size */ | 161 | setnodevector(L, t, oldsize); /* just rehash; keep the same size */ |
| 162 | for (i=0; i<oldsize; i++) { | 162 | for (i=0; i<oldsize; i++) { |
| 163 | Node *old = nold+i; | 163 | Node *old = nold+i; |
| 164 | if (ttype(val(old)) != LUA_TNIL) { | 164 | if (ttype(val(old)) != LUA_TNIL) |
| 165 | TObject *v = luaH_set(L, t, key(old)); | 165 | luaH_set(L, t, key(old), val(old)); |
| 166 | setobj(v, val(old)); | ||
| 167 | } | ||
| 168 | } | 166 | } |
| 169 | luaM_freearray(L, nold, oldsize, Node); /* free old array */ | 167 | luaM_freearray(L, nold, oldsize, Node); /* free old array */ |
| 170 | } | 168 | } |
| @@ -206,7 +204,7 @@ static TObject *newkey (lua_State *L, Hash *t, const TObject *key) { | |||
| 206 | else (t->firstfree)--; | 204 | else (t->firstfree)--; |
| 207 | } | 205 | } |
| 208 | rehash(L, t); /* no more free places */ | 206 | rehash(L, t); /* no more free places */ |
| 209 | return luaH_set(L, t, key); /* `rehash' invalidates this insertion */ | 207 | return newkey(L, t, key); /* `rehash' invalidates this insertion */ |
| 210 | } | 208 | } |
| 211 | 209 | ||
| 212 | 210 | ||
| @@ -271,32 +269,34 @@ const TObject *luaH_get (Hash *t, const TObject *key) { | |||
| 271 | } | 269 | } |
| 272 | 270 | ||
| 273 | 271 | ||
| 274 | TObject *luaH_set (lua_State *L, Hash *t, const TObject *key) { | 272 | void luaH_set (lua_State *L, Hash *t, const TObject *key, const TObject *val) { |
| 275 | const TObject *p = luaH_get(t, key); | 273 | const TObject *p = luaH_get(t, key); |
| 276 | if (p != &luaO_nilobject) return (TObject *)p; | 274 | if (p == &luaO_nilobject) { |
| 277 | else if (ttype(key) == LUA_TNIL) luaD_error(L, l_s("table index is nil")); | 275 | if (ttype(key) == LUA_TNIL) luaD_error(L, l_s("table index is nil")); |
| 278 | return newkey(L, t, key); | 276 | p = newkey(L, t, key); |
| 277 | } | ||
| 278 | settableval(p, val); | ||
| 279 | } | 279 | } |
| 280 | 280 | ||
| 281 | 281 | ||
| 282 | TObject *luaH_setstr (lua_State *L, Hash *t, TString *key) { | 282 | void luaH_setstr (lua_State *L, Hash *t, TString *key, const TObject *val) { |
| 283 | const TObject *p = luaH_getstr(t, key); | 283 | const TObject *p = luaH_getstr(t, key); |
| 284 | if (p != &luaO_nilobject) return (TObject *)p; | 284 | if (p == &luaO_nilobject) { |
| 285 | else { | ||
| 286 | TObject k; | 285 | TObject k; |
| 287 | setsvalue(&k, key); | 286 | setsvalue(&k, key); |
| 288 | return newkey(L, t, &k); | 287 | p = newkey(L, t, &k); |
| 289 | } | 288 | } |
| 289 | settableval(p, val); | ||
| 290 | } | 290 | } |
| 291 | 291 | ||
| 292 | 292 | ||
| 293 | TObject *luaH_setnum (lua_State *L, Hash *t, int key) { | 293 | void luaH_setnum (lua_State *L, Hash *t, int key, const TObject *val) { |
| 294 | const TObject *p = luaH_getnum(t, key); | 294 | const TObject *p = luaH_getnum(t, key); |
| 295 | if (p != &luaO_nilobject) return (TObject *)p; | 295 | if (p == &luaO_nilobject) { |
| 296 | else { | ||
| 297 | TObject k; | 296 | TObject k; |
| 298 | setnvalue(&k, key); | 297 | setnvalue(&k, key); |
| 299 | return newkey(L, t, &k); | 298 | p = newkey(L, t, &k); |
| 300 | } | 299 | } |
| 300 | settableval(p, val); | ||
| 301 | } | 301 | } |
| 302 | 302 | ||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ltable.h,v 1.33 2001/06/26 13:20:45 roberto Exp roberto $ | 2 | ** $Id: ltable.h,v 1.34 2001/07/05 20:31:14 roberto Exp roberto $ |
| 3 | ** Lua tables (hash) | 3 | ** Lua tables (hash) |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -14,12 +14,15 @@ | |||
| 14 | #define key(_n) (&(_n)->key) | 14 | #define key(_n) (&(_n)->key) |
| 15 | #define val(_n) (&(_n)->val) | 15 | #define val(_n) (&(_n)->val) |
| 16 | 16 | ||
| 17 | #define settableval(p,v) setobj((TObject *)p, v) | ||
| 18 | |||
| 19 | |||
| 17 | const TObject *luaH_getnum (Hash *t, int key); | 20 | const TObject *luaH_getnum (Hash *t, int key); |
| 18 | TObject *luaH_setnum (lua_State *L, Hash *t, int key); | 21 | void luaH_setnum (lua_State *L, Hash *t, int key, const TObject *val); |
| 19 | const TObject *luaH_getstr (Hash *t, TString *key); | 22 | const TObject *luaH_getstr (Hash *t, TString *key); |
| 20 | TObject *luaH_setstr (lua_State *L, Hash *t, TString *key); | 23 | void luaH_setstr (lua_State *L, Hash *t, TString *key, const TObject *val); |
| 21 | const TObject *luaH_get (Hash *t, const TObject *key); | 24 | const TObject *luaH_get (Hash *t, const TObject *key); |
| 22 | TObject *luaH_set (lua_State *L, Hash *t, const TObject *key); | 25 | void luaH_set (lua_State *L, Hash *t, const TObject *key, const TObject *val); |
| 23 | Hash *luaH_new (lua_State *L, int nhash); | 26 | Hash *luaH_new (lua_State *L, int nhash); |
| 24 | void luaH_free (lua_State *L, Hash *t); | 27 | void luaH_free (lua_State *L, Hash *t); |
| 25 | Node *luaH_next (lua_State *L, Hash *t, const TObject *r); | 28 | Node *luaH_next (lua_State *L, Hash *t, const TObject *r); |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ltm.c,v 1.75 2001/07/23 19:56:00 roberto Exp roberto $ | 2 | ** $Id: ltm.c,v 1.76 2001/07/24 22:39:34 roberto Exp roberto $ |
| 3 | ** Tag methods | 3 | ** Tag methods |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -84,11 +84,13 @@ int luaT_newtag (lua_State *L, const l_char *name, int basictype) { | |||
| 84 | MAX_INT, l_s("tag table overflow")); | 84 | MAX_INT, l_s("tag table overflow")); |
| 85 | tag = G(L)->ntag; | 85 | tag = G(L)->ntag; |
| 86 | if (name) { | 86 | if (name) { |
| 87 | TObject *v; | 87 | const TObject *v; |
| 88 | TObject otag; | ||
| 88 | ts = luaS_new(L, name); | 89 | ts = luaS_new(L, name); |
| 89 | v = luaH_setstr(L, G(L)->type2tag, ts); | 90 | v = luaH_getstr(G(L)->type2tag, ts); |
| 90 | if (ttype(v) == LUA_TNUMBER) return (int)nvalue(v); | 91 | if (ttype(v) == LUA_TNUMBER) return (int)nvalue(v); |
| 91 | setnvalue(v, tag); | 92 | setnvalue(&otag, tag); |
| 93 | luaH_setstr(L, G(L)->type2tag, ts, &otag); | ||
| 92 | } | 94 | } |
| 93 | for (i=0; i<TM_N; i++) | 95 | for (i=0; i<TM_N; i++) |
| 94 | luaT_gettm(G(L), tag, i) = NULL; | 96 | luaT_gettm(G(L), tag, i) = NULL; |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lvm.c,v 1.189 2001/06/28 14:48:44 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 1.190 2001/06/28 14:57:17 roberto Exp roberto $ |
| 3 | ** Lua virtual machine | 3 | ** Lua virtual machine |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -186,7 +186,7 @@ void luaV_settable (lua_State *L, StkId t, TObject *key, StkId val) { | |||
| 186 | int tg = hvalue(t)->htag; | 186 | int tg = hvalue(t)->htag; |
| 187 | if (hvalue(t)->htag == LUA_TTABLE || /* with default tag? */ | 187 | if (hvalue(t)->htag == LUA_TTABLE || /* with default tag? */ |
| 188 | (tm = luaT_gettm(G(L), tg, TM_SETTABLE)) == NULL) { /* or no TM? */ | 188 | (tm = luaT_gettm(G(L), tg, TM_SETTABLE)) == NULL) { /* or no TM? */ |
| 189 | setobj(luaH_set(L, hvalue(t), key), val); /* do a primitive set */ | 189 | luaH_set(L, hvalue(t), key, val); /* do a primitive set */ |
| 190 | return; | 190 | return; |
| 191 | } | 191 | } |
| 192 | /* else will call the tag method */ | 192 | /* else will call the tag method */ |
| @@ -212,11 +212,14 @@ void luaV_getglobal (lua_State *L, TString *name, StkId res) { | |||
| 212 | 212 | ||
| 213 | 213 | ||
| 214 | void luaV_setglobal (lua_State *L, TString *name, StkId val) { | 214 | void luaV_setglobal (lua_State *L, TString *name, StkId val) { |
| 215 | TObject *oldvalue = luaH_setstr(L, L->gt, name); | 215 | const TObject *oldvalue = luaH_getstr(L->gt, name); |
| 216 | Closure *tm; | 216 | Closure *tm; |
| 217 | if (!HAS_TM_SETGLOBAL(L, ttype(oldvalue)) || /* no tag methods? */ | 217 | if (!HAS_TM_SETGLOBAL(L, ttype(oldvalue)) || /* no tag methods? */ |
| 218 | (tm = luaT_gettmbyObj(G(L), oldvalue, TM_SETGLOBAL)) == NULL) { | 218 | (tm = luaT_gettmbyObj(G(L), oldvalue, TM_SETGLOBAL)) == NULL) { |
| 219 | setobj(oldvalue, val); /* raw set */ | 219 | if (oldvalue == &luaO_nilobject) |
| 220 | luaH_setstr(L, L->gt, name, val); /* raw set */ | ||
| 221 | else | ||
| 222 | settableval(oldvalue, val); /* warning: tricky optimization! */ | ||
| 220 | } | 223 | } |
| 221 | else | 224 | else |
| 222 | setTM(L, callTM(L, tm, l_s("soo"), name, oldvalue, val)); | 225 | 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) { | |||
| 317 | static void luaV_pack (lua_State *L, StkId firstelem) { | 320 | static void luaV_pack (lua_State *L, StkId firstelem) { |
| 318 | int i; | 321 | int i; |
| 319 | Hash *htab = luaH_new(L, 0); | 322 | Hash *htab = luaH_new(L, 0); |
| 320 | TObject *n; | 323 | TObject n; |
| 321 | for (i=0; firstelem+i<L->top; i++) | 324 | for (i=0; firstelem+i<L->top; i++) |
| 322 | setobj(luaH_setnum(L, htab, i+1), firstelem+i); | 325 | luaH_setnum(L, htab, i+1, firstelem+i); |
| 323 | /* store counter in field `n' */ | 326 | /* store counter in field `n' */ |
| 324 | n = luaH_setstr(L, htab, luaS_newliteral(L, l_s("n"))); | 327 | setnvalue(&n, i); |
| 325 | setnvalue(n, i); | 328 | luaH_setstr(L, htab, luaS_newliteral(L, l_s("n")), &n); |
| 326 | L->top = firstelem; /* remove elements from the stack */ | 329 | L->top = firstelem; /* remove elements from the stack */ |
| 327 | sethvalue(L->top, htab); | 330 | sethvalue(L->top, htab); |
| 328 | incr_top; | 331 | incr_top; |
| @@ -640,7 +643,7 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
| 640 | n = L->top - ra - 1; | 643 | n = L->top - ra - 1; |
| 641 | bc &= ~(LFIELDS_PER_FLUSH-1); /* bc = bc - bc%FPF */ | 644 | bc &= ~(LFIELDS_PER_FLUSH-1); /* bc = bc - bc%FPF */ |
| 642 | for (; n > 0; n--) | 645 | for (; n > 0; n--) |
| 643 | setobj(luaH_setnum(L, h, bc+n), ra+n); | 646 | luaH_setnum(L, h, bc+n, ra+n); |
| 644 | break; | 647 | break; |
| 645 | } | 648 | } |
| 646 | case OP_CLOSURE: { | 649 | case OP_CLOSURE: { |
