diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2000-08-07 17:21:34 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2000-08-07 17:21:34 -0300 |
| commit | d9e61e8ceafe8c3f6ad936979719ca7c446ce228 (patch) | |
| tree | 0808ada3d7b7219022b9002503894c76c7253df6 /ltable.c | |
| parent | 397905ef8694ec716a51acebc993bb625340d388 (diff) | |
| download | lua-d9e61e8ceafe8c3f6ad936979719ca7c446ce228.tar.gz lua-d9e61e8ceafe8c3f6ad936979719ca7c446ce228.tar.bz2 lua-d9e61e8ceafe8c3f6ad936979719ca7c446ce228.zip | |
new algorithm for traversing in GC to avoid deep recursion calls
Diffstat (limited to 'ltable.c')
| -rw-r--r-- | ltable.c | 12 |
1 files changed, 7 insertions, 5 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ltable.c,v 1.50 2000/06/30 14:35:17 roberto Exp roberto $ | 2 | ** $Id: ltable.c,v 1.51 2000/08/04 19:38:35 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 | */ |
| @@ -127,14 +127,16 @@ int luaH_pos (lua_State *L, const Hash *t, const TObject *key) { | |||
| 127 | ** hash, change `key' for a number with the same hash. | 127 | ** hash, change `key' for a number with the same hash. |
| 128 | */ | 128 | */ |
| 129 | void luaH_remove (Hash *t, TObject *key) { | 129 | void luaH_remove (Hash *t, TObject *key) { |
| 130 | /* do not remove numbers */ | 130 | if (ttype(key) == TAG_NUMBER || |
| 131 | if (ttype(key) != TAG_NUMBER) { | 131 | (ttype(key) == TAG_STRING && tsvalue(key)->u.s.len <= 30)) |
| 132 | return; /* do not remove numbers nor small strings */ | ||
| 133 | else { | ||
| 132 | /* try to find a number `n' with the same hash as `key' */ | 134 | /* try to find a number `n' with the same hash as `key' */ |
| 133 | Node *mp = luaH_mainposition(t, key); | 135 | Node *mp = luaH_mainposition(t, key); |
| 134 | int n = mp - &t->node[0]; | 136 | int n = mp - &t->node[0]; |
| 135 | /* make sure `n' is not in `t' */ | 137 | /* make sure `n' is not in `t' */ |
| 136 | while (luaH_getnum(t, n) != &luaO_nilobject) { | 138 | while (luaH_getnum(t, n) != &luaO_nilobject) { |
| 137 | if (t->size >= MAX_INT-n) | 139 | if (n >= MAX_INT - t->size) |
| 138 | return; /* give up; (to avoid overflow) */ | 140 | return; /* give up; (to avoid overflow) */ |
| 139 | n += t->size; | 141 | n += t->size; |
| 140 | } | 142 | } |
| @@ -165,7 +167,7 @@ Hash *luaH_new (lua_State *L, int size) { | |||
| 165 | t->htag = TagDefault; | 167 | t->htag = TagDefault; |
| 166 | t->next = L->roottable; | 168 | t->next = L->roottable; |
| 167 | L->roottable = t; | 169 | L->roottable = t; |
| 168 | t->marked = 0; | 170 | t->mark = t; |
| 169 | t->size = 0; | 171 | t->size = 0; |
| 170 | L->nblocks += gcsize(L, 0); | 172 | L->nblocks += gcsize(L, 0); |
| 171 | t->node = NULL; | 173 | t->node = NULL; |
