aboutsummaryrefslogtreecommitdiff
path: root/ltable.c
diff options
context:
space:
mode:
Diffstat (limited to 'ltable.c')
-rw-r--r--ltable.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/ltable.c b/ltable.c
index 8a207b80..ea3ab4a9 100644
--- a/ltable.c
+++ b/ltable.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ltable.c,v 1.29 1999/11/10 15:39:35 roberto Exp roberto $ 2** $Id: ltable.c,v 1.30 1999/11/22 13:12:07 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*/
@@ -65,7 +65,9 @@ Node *luaH_mainposition (lua_State *L, const Hash *t, const TObject *key) {
65 lua_error(L, "unexpected type to index table"); 65 lua_error(L, "unexpected type to index table");
66 h = 0; /* to avoid warnings */ 66 h = 0; /* to avoid warnings */
67 } 67 }
68 return &t->node[h%(unsigned int)t->size]; 68 LUA_ASSERT(L, h%(unsigned int)t->size == (h&((unsigned int)t->size-1)),
69 "a&(x-1) == a%x, for x power of 2");
70 return &t->node[h&((unsigned int)t->size-1)];
69} 71}
70 72
71 73
@@ -109,7 +111,7 @@ static void setnodevector (lua_State *L, Hash *t, int size) {
109 111
110Hash *luaH_new (lua_State *L, int size) { 112Hash *luaH_new (lua_State *L, int size) {
111 Hash *t = luaM_new(L, Hash); 113 Hash *t = luaM_new(L, Hash);
112 setnodevector(L, t, luaO_redimension(L, size+1)); 114 setnodevector(L, t, luaO_power2(size));
113 t->htag = TagDefault; 115 t->htag = TagDefault;
114 t->next = L->roottable; 116 t->next = L->roottable;
115 L->roottable = t; 117 L->roottable = t;
@@ -125,7 +127,7 @@ void luaH_free (lua_State *L, Hash *t) {
125} 127}
126 128
127 129
128static int newsize (lua_State *L, const Hash *t) { 130static int newsize (const Hash *t) {
129 Node *v = t->node; 131 Node *v = t->node;
130 int size = t->size; 132 int size = t->size;
131 int realuse = 0; 133 int realuse = 0;
@@ -134,7 +136,7 @@ static int newsize (lua_State *L, const Hash *t) {
134 if (ttype(&v[i].val) != LUA_T_NIL) 136 if (ttype(&v[i].val) != LUA_T_NIL)
135 realuse++; 137 realuse++;
136 } 138 }
137 return luaO_redimension(L, realuse*2); 139 return luaO_power2(realuse+realuse/4+1);
138} 140}
139 141
140 142
@@ -148,7 +150,7 @@ static void rehash (lua_State *L, Hash *t) {
148 Node *nold = t->node; 150 Node *nold = t->node;
149 int i; 151 int i;
150 L->nblocks -= gcsize(L, oldsize); 152 L->nblocks -= gcsize(L, oldsize);
151 setnodevector(L, t, newsize(L, t)); /* create new array of nodes */ 153 setnodevector(L, t, newsize(t)); /* create new array of nodes */
152 /* first loop; set only elements that can go in their main positions */ 154 /* first loop; set only elements that can go in their main positions */
153 for (i=0; i<oldsize; i++) { 155 for (i=0; i<oldsize; i++) {
154 Node *old = nold+i; 156 Node *old = nold+i;