aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2001-08-30 17:56:43 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2001-08-30 17:56:43 -0300
commit8c8ad5f3fffae16a751f2419a5972ec7ffd6babf (patch)
treedb9e7977a263eb91b4c990420af203ce0d4f7d2a
parent34a09b65f3b6ef5f7699263b09ad088ec087aca2 (diff)
downloadlua-8c8ad5f3fffae16a751f2419a5972ec7ffd6babf.tar.gz
lua-8c8ad5f3fffae16a751f2419a5972ec7ffd6babf.tar.bz2
lua-8c8ad5f3fffae16a751f2419a5972ec7ffd6babf.zip
better locality of assignment of table values
-rw-r--r--lapi.c6
-rw-r--r--lcode.c4
-rw-r--r--ltable.c36
-rw-r--r--ltable.h11
-rw-r--r--ltm.c10
-rw-r--r--lvm.c21
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 @@
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}
diff --git a/lcode.c b/lcode.c
index 49b7ed4f..694a715d 100644
--- a/lcode.c
+++ b/lcode.c
@@ -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}
diff --git a/ltable.c b/ltable.c
index aea20f38..2cafc51b 100644
--- a/ltable.c
+++ b/ltable.c
@@ -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
274TObject *luaH_set (lua_State *L, Hash *t, const TObject *key) { 272void 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
282TObject *luaH_setstr (lua_State *L, Hash *t, TString *key) { 282void 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
293TObject *luaH_setnum (lua_State *L, Hash *t, int key) { 293void 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
diff --git a/ltable.h b/ltable.h
index df0ff232..24ec0355 100644
--- a/ltable.h
+++ b/ltable.h
@@ -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
17const TObject *luaH_getnum (Hash *t, int key); 20const TObject *luaH_getnum (Hash *t, int key);
18TObject *luaH_setnum (lua_State *L, Hash *t, int key); 21void luaH_setnum (lua_State *L, Hash *t, int key, const TObject *val);
19const TObject *luaH_getstr (Hash *t, TString *key); 22const TObject *luaH_getstr (Hash *t, TString *key);
20TObject *luaH_setstr (lua_State *L, Hash *t, TString *key); 23void luaH_setstr (lua_State *L, Hash *t, TString *key, const TObject *val);
21const TObject *luaH_get (Hash *t, const TObject *key); 24const TObject *luaH_get (Hash *t, const TObject *key);
22TObject *luaH_set (lua_State *L, Hash *t, const TObject *key); 25void luaH_set (lua_State *L, Hash *t, const TObject *key, const TObject *val);
23Hash *luaH_new (lua_State *L, int nhash); 26Hash *luaH_new (lua_State *L, int nhash);
24void luaH_free (lua_State *L, Hash *t); 27void luaH_free (lua_State *L, Hash *t);
25Node *luaH_next (lua_State *L, Hash *t, const TObject *r); 28Node *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 @@
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;
diff --git a/lvm.c b/lvm.c
index da8876dd..b043c916 100644
--- a/lvm.c
+++ b/lvm.c
@@ -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
214void luaV_setglobal (lua_State *L, TString *name, StkId val) { 214void 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) {
317static void luaV_pack (lua_State *L, StkId firstelem) { 320static 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: {