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 /lgc.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 'lgc.c')
-rw-r--r-- | lgc.c | 32 |
1 files changed, 14 insertions, 18 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lgc.c,v 1.106 2001/06/15 20:36:57 roberto Exp roberto $ | 2 | ** $Id: lgc.c,v 1.107 2001/06/21 16:41:34 roberto Exp roberto $ |
3 | ** Garbage Collector | 3 | ** Garbage Collector |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -128,8 +128,8 @@ static void traverseclosure (GCState *st, Closure *f) { | |||
128 | 128 | ||
129 | static void removekey (Node *n) { | 129 | static void removekey (Node *n) { |
130 | lua_assert(ttype(val(n)) == LUA_TNIL); | 130 | lua_assert(ttype(val(n)) == LUA_TNIL); |
131 | if (ttype_key(n) != LUA_TNIL && ttype_key(n) != LUA_TNUMBER) | 131 | if (ttype(key(n)) != LUA_TNIL && ttype(key(n)) != LUA_TNUMBER) |
132 | ttype_key(n) = LUA_TNONE; /* dead key; remove it */ | 132 | setttype(key(n), LUA_TNONE); /* dead key; remove it */ |
133 | } | 133 | } |
134 | 134 | ||
135 | 135 | ||
@@ -143,14 +143,11 @@ static void traversetable (GCState *st, Hash *h) { | |||
143 | if (ttype(val(n)) == LUA_TNIL) | 143 | if (ttype(val(n)) == LUA_TNIL) |
144 | removekey(n); | 144 | removekey(n); |
145 | else { | 145 | else { |
146 | lua_assert(ttype_key(n) != LUA_TNIL); | 146 | lua_assert(ttype(key(n)) != LUA_TNIL); |
147 | if (ttype_key(n) != LUA_TNUMBER && !(mode & LUA_WEAK_KEY)) { | 147 | if (ttype(key(n)) != LUA_TNUMBER && !(mode & LUA_WEAK_KEY)) |
148 | TObject k; | 148 | markobject(st, key(n)); |
149 | setkey2obj(&k, n); | ||
150 | markobject(st, &k); | ||
151 | } | ||
152 | if (!(mode & LUA_WEAK_VALUE)) | 149 | if (!(mode & LUA_WEAK_VALUE)) |
153 | markobject(st, &n->val); | 150 | markobject(st, val(n)); |
154 | } | 151 | } |
155 | } | 152 | } |
156 | } | 153 | } |
@@ -181,16 +178,16 @@ static void markall (lua_State *L) { | |||
181 | } | 178 | } |
182 | 179 | ||
183 | 180 | ||
184 | static int hasmark (int tt, Value *v) { | 181 | static int hasmark (const TObject *o) { |
185 | switch (tt) { | 182 | switch (ttype(o)) { |
186 | case LUA_TSTRING: | 183 | case LUA_TSTRING: |
187 | return v->ts->tsv.marked; | 184 | return tsvalue(o)->tsv.marked; |
188 | case LUA_TUSERDATA: | 185 | case LUA_TUSERDATA: |
189 | return ismarkedudata(v->u); | 186 | return ismarkedudata(uvalue(o)); |
190 | case LUA_TTABLE: | 187 | case LUA_TTABLE: |
191 | return ismarked(v->h); | 188 | return ismarked(hvalue(o)); |
192 | case LUA_TFUNCTION: | 189 | case LUA_TFUNCTION: |
193 | return ismarked(v->cl); | 190 | return ismarked(clvalue(o)); |
194 | default: /* number, nil */ | 191 | default: /* number, nil */ |
195 | return 1; | 192 | return 1; |
196 | } | 193 | } |
@@ -202,8 +199,7 @@ static void cleardeadnodes (Hash *h) { | |||
202 | for (i=0; i<h->size; i++) { | 199 | for (i=0; i<h->size; i++) { |
203 | Node *n = node(h, i); | 200 | Node *n = node(h, i); |
204 | if (ttype(val(n)) == LUA_TNIL) continue; /* empty node */ | 201 | if (ttype(val(n)) == LUA_TNIL) continue; /* empty node */ |
205 | if (!hasmark(ttype(val(n)), &(val(n)->value)) || | 202 | if (!hasmark(val(n)) || !hasmark(key(n))) { |
206 | !hasmark(ttype_key(n), &n->key_value)) { | ||
207 | setnilvalue(val(n)); /* remove value */ | 203 | setnilvalue(val(n)); /* remove value */ |
208 | removekey(n); | 204 | removekey(n); |
209 | } | 205 | } |