diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-06-26 10:20:45 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-06-26 10:20:45 -0300 |
| commit | 37f3a1c0452439bce1f5c2069ca015af148bf62f (patch) | |
| tree | 0ad887fb08400103904dab1954695d28aece0500 /ltable.c | |
| parent | 9559c111a32479794acc59fba2cbeab365a567f3 (diff) | |
| download | lua-37f3a1c0452439bce1f5c2069ca015af148bf62f.tar.gz lua-37f3a1c0452439bce1f5c2069ca015af148bf62f.tar.bz2 lua-37f3a1c0452439bce1f5c2069ca015af148bf62f.zip | |
too much optimization to "break" keys in tables; keep them as TObjects...
Diffstat (limited to 'ltable.c')
| -rw-r--r-- | ltable.c | 57 |
1 files changed, 27 insertions, 30 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ltable.c,v 1.80 2001/06/06 18:00:19 roberto Exp roberto $ | 2 | ** $Id: ltable.c,v 1.81 2001/06/15 20:36:57 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 | */ |
| @@ -32,9 +32,9 @@ | |||
| 32 | #define TagDefault LUA_TTABLE | 32 | #define TagDefault LUA_TTABLE |
| 33 | 33 | ||
| 34 | 34 | ||
| 35 | #define hashnum(t,n) (&t->node[lmod((lu_hash)(ls_hash)(n), t->size)]) | 35 | #define hashnum(t,n) (node(t, lmod((lu_hash)(ls_hash)(n), t->size))) |
| 36 | #define hashstr(t,str) (&t->node[lmod((str)->tsv.hash, t->size)]) | 36 | #define hashstr(t,str) (node(t, lmod((str)->tsv.hash, t->size))) |
| 37 | #define hashpointer(t,p) (&t->node[lmod(IntPoint(p), t->size)]) | 37 | #define hashpointer(t,p) (node(t, lmod(IntPoint(p), t->size))) |
| 38 | 38 | ||
| 39 | 39 | ||
| 40 | /* | 40 | /* |
| @@ -42,13 +42,13 @@ | |||
| 42 | ** of its hash value) | 42 | ** of its hash value) |
| 43 | */ | 43 | */ |
| 44 | Node *luaH_mainposition (const Hash *t, const Node *n) { | 44 | Node *luaH_mainposition (const Hash *t, const Node *n) { |
| 45 | switch (ttype_key(n)) { | 45 | switch (ttype(key(n))) { |
| 46 | case LUA_TNUMBER: | 46 | case LUA_TNUMBER: |
| 47 | return hashnum(t, nvalue_key(n)); | 47 | return hashnum(t, nvalue(key(n))); |
| 48 | case LUA_TSTRING: | 48 | case LUA_TSTRING: |
| 49 | return hashstr(t, tsvalue_key(n)); | 49 | return hashstr(t, tsvalue(key(n))); |
| 50 | default: /* all other types are hashed as (void *) */ | 50 | default: /* all other types are hashed as (void *) */ |
| 51 | return hashpointer(t, tsvalue_key(n)); | 51 | return hashpointer(t, tsvalue(key(n))); |
| 52 | } | 52 | } |
| 53 | } | 53 | } |
| 54 | 54 | ||
| @@ -62,7 +62,7 @@ Node *luaH_next (lua_State *L, Hash *t, const TObject *key) { | |||
| 62 | if (v == &luaO_nilobject) | 62 | if (v == &luaO_nilobject) |
| 63 | luaD_error(L, l_s("invalid key for `next'")); | 63 | luaD_error(L, l_s("invalid key for `next'")); |
| 64 | i = (int)(((const l_char *)v - | 64 | i = (int)(((const l_char *)v - |
| 65 | (const l_char *)(&t->node[0].val)) / sizeof(Node)) + 1; | 65 | (const l_char *)(val(node(t, 0)))) / sizeof(Node)) + 1; |
| 66 | } | 66 | } |
| 67 | for (; i<t->size; i++) { | 67 | for (; i<t->size; i++) { |
| 68 | Node *n = node(t, i); | 68 | Node *n = node(t, i); |
| @@ -103,11 +103,11 @@ static void setnodevector (lua_State *L, Hash *t, int size) { | |||
| 103 | t->node = luaM_newvector(L, size, Node); | 103 | t->node = luaM_newvector(L, size, Node); |
| 104 | for (i=0; i<size; i++) { | 104 | for (i=0; i<size; i++) { |
| 105 | t->node[i].next = NULL; | 105 | t->node[i].next = NULL; |
| 106 | t->node[i].key_tt = LUA_TNIL; | 106 | setnilvalue(key(node(t, i))); |
| 107 | setnilvalue(&t->node[i].val); | 107 | setnilvalue(val(node(t, i))); |
| 108 | } | 108 | } |
| 109 | t->size = size; | 109 | t->size = size; |
| 110 | t->firstfree = &t->node[size-1]; /* first free position to be used */ | 110 | t->firstfree = node(t, size-1); /* first free position to be used */ |
| 111 | } | 111 | } |
| 112 | 112 | ||
| 113 | 113 | ||
| @@ -161,12 +161,9 @@ 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(&old->val) != LUA_TNIL) { | 164 | if (ttype(val(old)) != LUA_TNIL) { |
| 165 | TObject o; | 165 | TObject *v = luaH_set(L, t, key(old)); |
| 166 | TObject *v; | 166 | setobj(v, val(old)); |
| 167 | setkey2obj(&o, old); | ||
| 168 | v = luaH_set(L, t, &o); | ||
| 169 | setobj(v, &old->val); | ||
| 170 | } | 167 | } |
| 171 | } | 168 | } |
| 172 | luaM_freearray(L, nold, oldsize, Node); /* free old array */ | 169 | luaM_freearray(L, nold, oldsize, Node); /* free old array */ |
| @@ -181,7 +178,7 @@ static void rehash (lua_State *L, Hash *t) { | |||
| 181 | ** position), new key goes to an empty position. | 178 | ** position), new key goes to an empty position. |
| 182 | */ | 179 | */ |
| 183 | static TObject *newkey (lua_State *L, Hash *t, Node *mp, const TObject *key) { | 180 | static TObject *newkey (lua_State *L, Hash *t, Node *mp, const TObject *key) { |
| 184 | if (ttype(&mp->val) != LUA_TNIL) { /* main position is not free? */ | 181 | if (ttype(val(mp)) != LUA_TNIL) { /* main position is not free? */ |
| 185 | Node *othern = luaH_mainposition(t, mp); /* `mp' of colliding node */ | 182 | Node *othern = luaH_mainposition(t, mp); /* `mp' of colliding node */ |
| 186 | Node *n = t->firstfree; /* get a free place */ | 183 | Node *n = t->firstfree; /* get a free place */ |
| 187 | if (othern != mp) { /* is colliding node out of its main position? */ | 184 | if (othern != mp) { /* is colliding node out of its main position? */ |
| @@ -190,7 +187,7 @@ static TObject *newkey (lua_State *L, Hash *t, Node *mp, const TObject *key) { | |||
| 190 | othern->next = n; /* redo the chain with `n' in place of `mp' */ | 187 | othern->next = n; /* redo the chain with `n' in place of `mp' */ |
| 191 | *n = *mp; /* copy colliding node into free pos. (mp->next also goes) */ | 188 | *n = *mp; /* copy colliding node into free pos. (mp->next also goes) */ |
| 192 | mp->next = NULL; /* now `mp' is free */ | 189 | mp->next = NULL; /* now `mp' is free */ |
| 193 | setnilvalue(&mp->val); | 190 | setnilvalue(val(mp)); |
| 194 | } | 191 | } |
| 195 | else { /* colliding node is in its own main position */ | 192 | else { /* colliding node is in its own main position */ |
| 196 | /* new node will go into free position */ | 193 | /* new node will go into free position */ |
| @@ -199,11 +196,11 @@ static TObject *newkey (lua_State *L, Hash *t, Node *mp, const TObject *key) { | |||
| 199 | mp = n; | 196 | mp = n; |
| 200 | } | 197 | } |
| 201 | } | 198 | } |
| 202 | setobj2key(mp, key); | 199 | setobj(key(mp), key); |
| 203 | lua_assert(ttype(&mp->val) == LUA_TNIL); | 200 | lua_assert(ttype(val(mp)) == LUA_TNIL); |
| 204 | for (;;) { /* correct `firstfree' */ | 201 | for (;;) { /* correct `firstfree' */ |
| 205 | if (ttype_key(t->firstfree) == LUA_TNIL) | 202 | if (ttype(key(t->firstfree)) == LUA_TNIL) |
| 206 | return &mp->val; /* OK; table still has a free place */ | 203 | return val(mp); /* OK; table still has a free place */ |
| 207 | else if (t->firstfree == t->node) break; /* cannot decrement from here */ | 204 | else if (t->firstfree == t->node) break; /* cannot decrement from here */ |
| 208 | else (t->firstfree)--; | 205 | else (t->firstfree)--; |
| 209 | } | 206 | } |
| @@ -220,8 +217,8 @@ TObject *luaH_setnum (lua_State *L, Hash *t, lua_Number key) { | |||
| 220 | Node *mp = hashnum(t, key); | 217 | Node *mp = hashnum(t, key); |
| 221 | Node *n = mp; | 218 | Node *n = mp; |
| 222 | do { /* check whether `key' is somewhere in the chain */ | 219 | do { /* check whether `key' is somewhere in the chain */ |
| 223 | if (ttype_key(n) == LUA_TNUMBER && nvalue_key(n) == key) | 220 | if (ttype(key(n)) == LUA_TNUMBER && nvalue(key(n)) == key) |
| 224 | return &n->val; /* that's all */ | 221 | return val(n); /* that's all */ |
| 225 | else n = n->next; | 222 | else n = n->next; |
| 226 | } while (n); | 223 | } while (n); |
| 227 | if (L == NULL) return (TObject *)&luaO_nilobject; /* get option */ | 224 | if (L == NULL) return (TObject *)&luaO_nilobject; /* get option */ |
| @@ -239,8 +236,8 @@ TObject *luaH_setstr (lua_State *L, Hash *t, TString *key) { | |||
| 239 | Node *mp = hashstr(t, key); | 236 | Node *mp = hashstr(t, key); |
| 240 | Node *n = mp; | 237 | Node *n = mp; |
| 241 | do { /* check whether `key' is somewhere in the chain */ | 238 | do { /* check whether `key' is somewhere in the chain */ |
| 242 | if (ttype_key(n) == LUA_TSTRING && tsvalue_key(n) == key) | 239 | if (ttype(key(n)) == LUA_TSTRING && tsvalue(key(n)) == key) |
| 243 | return &n->val; /* that's all */ | 240 | return val(n); /* that's all */ |
| 244 | else n = n->next; | 241 | else n = n->next; |
| 245 | } while (n); | 242 | } while (n); |
| 246 | if (L == NULL) return (TObject *)&luaO_nilobject; /* get option */ | 243 | if (L == NULL) return (TObject *)&luaO_nilobject; /* get option */ |
| @@ -258,8 +255,8 @@ static TObject *luaH_setany (lua_State *L, Hash *t, const TObject *key) { | |||
| 258 | Node *n = mp; | 255 | Node *n = mp; |
| 259 | do { /* check whether `key' is somewhere in the chain */ | 256 | do { /* check whether `key' is somewhere in the chain */ |
| 260 | /* compare as `tsvalue', but may be other pointers (it is the same) */ | 257 | /* compare as `tsvalue', but may be other pointers (it is the same) */ |
| 261 | if (ttype_key(n) == ttype(key) && tsvalue_key(n) == tsvalue(key)) | 258 | if (ttype(key(n)) == ttype(key) && tsvalue(key(n)) == tsvalue(key)) |
| 262 | return &n->val; /* that's all */ | 259 | return val(n); /* that's all */ |
| 263 | else n = n->next; | 260 | else n = n->next; |
| 264 | } while (n); | 261 | } while (n); |
| 265 | if (L == NULL) return (TObject *)&luaO_nilobject; /* get option */ | 262 | if (L == NULL) return (TObject *)&luaO_nilobject; /* get option */ |
