summaryrefslogtreecommitdiff
path: root/ltable.c
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 /ltable.c
parent34a09b65f3b6ef5f7699263b09ad088ec087aca2 (diff)
downloadlua-8c8ad5f3fffae16a751f2419a5972ec7ffd6babf.tar.gz
lua-8c8ad5f3fffae16a751f2419a5972ec7ffd6babf.tar.bz2
lua-8c8ad5f3fffae16a751f2419a5972ec7ffd6babf.zip
better locality of assignment of table values
Diffstat (limited to 'ltable.c')
-rw-r--r--ltable.c36
1 files changed, 18 insertions, 18 deletions
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