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: { |