aboutsummaryrefslogtreecommitdiff
path: root/ltable.c
diff options
context:
space:
mode:
Diffstat (limited to 'ltable.c')
-rw-r--r--ltable.c43
1 files changed, 23 insertions, 20 deletions
diff --git a/ltable.c b/ltable.c
index fdd15b66..deb853d6 100644
--- a/ltable.c
+++ b/ltable.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ltable.c,v 1.107 2002/05/13 13:38:59 roberto Exp roberto $ 2** $Id: ltable.c,v 1.108 2002/05/15 18:57:44 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*/
@@ -56,7 +56,7 @@
56#define hashboolean(t,p) (node(t, lmod(p, sizenode(t)))) 56#define hashboolean(t,p) (node(t, lmod(p, sizenode(t))))
57 57
58/* 58/*
59** for pointers, avoid modulus by power of 2, as they tend to have many 59** avoid modulus by power of 2 for pointers, as they tend to have many
60** 2 factors. 60** 2 factors.
61*/ 61*/
62#define hashpointer(t,p) (node(t, (IntPoint(p) % ((sizenode(t)-1)|1)))) 62#define hashpointer(t,p) (node(t, (IntPoint(p) % ((sizenode(t)-1)|1))))
@@ -261,7 +261,7 @@ static void resize (lua_State *L, Table *t, int nasize, int nhsize) {
261 /* re-insert elements from vanishing slice */ 261 /* re-insert elements from vanishing slice */
262 for (i=nasize; i<oldasize; i++) { 262 for (i=nasize; i<oldasize; i++) {
263 if (ttype(&t->array[i]) != LUA_TNIL) 263 if (ttype(&t->array[i]) != LUA_TNIL)
264 luaH_setnum(L, t, i+1, &t->array[i]); 264 setobj(luaH_setnum(L, t, i+1), &t->array[i]);
265 } 265 }
266 /* shrink array */ 266 /* shrink array */
267 luaM_reallocvector(L, t->array, oldasize, nasize, TObject); 267 luaM_reallocvector(L, t->array, oldasize, nasize, TObject);
@@ -270,7 +270,7 @@ static void resize (lua_State *L, Table *t, int nasize, int nhsize) {
270 for (i = twoto(oldhsize) - 1; i >= 0; i--) { 270 for (i = twoto(oldhsize) - 1; i >= 0; i--) {
271 Node *old = nold+i; 271 Node *old = nold+i;
272 if (ttype(val(old)) != LUA_TNIL) 272 if (ttype(val(old)) != LUA_TNIL)
273 luaH_set(L, t, key(old), val(old)); 273 setobj(luaH_set(L, t, key(old)), val(old));
274 } 274 }
275 if (oldhsize) 275 if (oldhsize)
276 luaM_freearray(L, nold, twoto(oldhsize), Node); /* free old array */ 276 luaM_freearray(L, nold, twoto(oldhsize), Node); /* free old array */
@@ -344,8 +344,8 @@ void luaH_remove (Table *t, Node *e) {
344** put new key in its main position; otherwise (colliding node is in its main 344** put new key in its main position; otherwise (colliding node is in its main
345** position), new key goes to an empty position. 345** position), new key goes to an empty position.
346*/ 346*/
347static void newkey (lua_State *L, Table *t, const TObject *key, 347static TObject *newkey (lua_State *L, Table *t, const TObject *key) {
348 const TObject *val) { 348 TObject *val;
349 Node *mp = luaH_mainposition(t, key); 349 Node *mp = luaH_mainposition(t, key);
350 if (ttype(val(mp)) != LUA_TNIL) { /* main position is not free? */ 350 if (ttype(val(mp)) != LUA_TNIL) { /* main position is not free? */
351 Node *othern = luaH_mainposition(t, key(mp)); /* `mp' of colliding node */ 351 Node *othern = luaH_mainposition(t, key(mp)); /* `mp' of colliding node */
@@ -367,14 +367,19 @@ static void newkey (lua_State *L, Table *t, const TObject *key,
367 } 367 }
368 setobj(key(mp), key); 368 setobj(key(mp), key);
369 lua_assert(ttype(val(mp)) == LUA_TNIL); 369 lua_assert(ttype(val(mp)) == LUA_TNIL);
370 settableval(val(mp), val);
371 for (;;) { /* correct `firstfree' */ 370 for (;;) { /* correct `firstfree' */
372 if (ttype(key(t->firstfree)) == LUA_TNIL) 371 if (ttype(key(t->firstfree)) == LUA_TNIL)
373 return; /* OK; table still has a free place */ 372 return val(mp); /* OK; table still has a free place */
374 else if (t->firstfree == t->node) break; /* cannot decrement from here */ 373 else if (t->firstfree == t->node) break; /* cannot decrement from here */
375 else (t->firstfree)--; 374 else (t->firstfree)--;
376 } 375 }
377 rehash(L, t); /* no more free places; must create one */ 376 /* no more free places; must create one */
377 setbvalue(val(mp), 0); /* avoid new key being removed */
378 rehash(L, t); /* grow table */
379 val = cast(TObject *, luaH_get(t, key)); /* get new position */
380 lua_assert(ttype(val) == LUA_TBOOLEAN);
381 setnilvalue(val);
382 return val;
378} 383}
379 384
380 385
@@ -444,28 +449,26 @@ const TObject *luaH_get (Table *t, const TObject *key) {
444} 449}
445 450
446 451
447void luaH_set (lua_State *L, Table *t, const TObject *key, const TObject *val) { 452TObject *luaH_set (lua_State *L, Table *t, const TObject *key) {
448 const TObject *p = luaH_get(t, key); 453 const TObject *p = luaH_get(t, key);
449 if (p != &luaO_nilobject) { 454 t->flags = 0;
450 settableval(p, val); 455 if (p != &luaO_nilobject)
451 } 456 return cast(TObject *, p);
452 else { 457 else {
453 if (ttype(key) == LUA_TNIL) luaG_runerror(L, "table index is nil"); 458 if (ttype(key) == LUA_TNIL) luaG_runerror(L, "table index is nil");
454 newkey(L, t, key, val); 459 return newkey(L, t, key);
455 } 460 }
456 t->flags = 0;
457} 461}
458 462
459 463
460void luaH_setnum (lua_State *L, Table *t, int key, const TObject *val) { 464TObject *luaH_setnum (lua_State *L, Table *t, int key) {
461 const TObject *p = luaH_getnum(t, key); 465 const TObject *p = luaH_getnum(t, key);
462 if (p != &luaO_nilobject) { 466 if (p != &luaO_nilobject)
463 settableval(p, val); 467 return cast(TObject *, p);
464 }
465 else { 468 else {
466 TObject k; 469 TObject k;
467 setnvalue(&k, key); 470 setnvalue(&k, key);
468 newkey(L, t, &k, val); 471 return newkey(L, t, &k);
469 } 472 }
470} 473}
471 474