aboutsummaryrefslogtreecommitdiff
path: root/lgc.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2001-06-26 10:20:45 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2001-06-26 10:20:45 -0300
commit37f3a1c0452439bce1f5c2069ca015af148bf62f (patch)
tree0ad887fb08400103904dab1954695d28aece0500 /lgc.c
parent9559c111a32479794acc59fba2cbeab365a567f3 (diff)
downloadlua-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.c32
1 files changed, 14 insertions, 18 deletions
diff --git a/lgc.c b/lgc.c
index 11119585..112d02ac 100644
--- a/lgc.c
+++ b/lgc.c
@@ -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
129static void removekey (Node *n) { 129static 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
184static int hasmark (int tt, Value *v) { 181static 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 }