diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-11-29 18:22:22 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-11-29 18:22:22 -0200 |
commit | 413fc7334bf8ceaea71417d73edef15c99d3a793 (patch) | |
tree | 50e762d979ad8e80681902cdeb8aa42b041ae323 /lgc.c | |
parent | fca0a12e23f964006ce43d35ab86b27c6bbb0a48 (diff) | |
download | lua-413fc7334bf8ceaea71417d73edef15c99d3a793.tar.gz lua-413fc7334bf8ceaea71417d73edef15c99d3a793.tar.bz2 lua-413fc7334bf8ceaea71417d73edef15c99d3a793.zip |
new implementation for lua upvalues (sugested by E.T.): simpler and solves
a bug for multi-stacks
Diffstat (limited to 'lgc.c')
-rw-r--r-- | lgc.c | 50 |
1 files changed, 20 insertions, 30 deletions
@@ -65,10 +65,10 @@ static void markclosure (GCState *st, Closure *cl) { | |||
65 | lua_assert(cl->l.nupvalues == cl->l.p->nupvalues); | 65 | lua_assert(cl->l.nupvalues == cl->l.p->nupvalues); |
66 | protomark(cl->l.p); | 66 | protomark(cl->l.p); |
67 | for (i=0; i<cl->l.nupvalues; i++) { /* mark its upvalues */ | 67 | for (i=0; i<cl->l.nupvalues; i++) { /* mark its upvalues */ |
68 | TObject *u = cl->l.upvals[i]; | 68 | UpVal *u = cl->l.upvals[i]; |
69 | if (isclosed(u)) { | 69 | if (!u->mark) { |
70 | ttype(u-1) = LUA_TNIL; /* temporary value (to mark as visited) */ | 70 | u->mark = 1; |
71 | markobject(st, u); | 71 | markobject(st, u->v); |
72 | } | 72 | } |
73 | } | 73 | } |
74 | } | 74 | } |
@@ -101,7 +101,7 @@ static void markobject (GCState *st, TObject *o) { | |||
101 | break; | 101 | break; |
102 | } | 102 | } |
103 | default: { | 103 | default: { |
104 | lua_assert(0 <= ttype(o) && ttype(o) <= LUA_TUPVAL); | 104 | lua_assert(ttype(o) == LUA_TNIL || ttype(o) == LUA_TNUMBER); |
105 | break; | 105 | break; |
106 | } | 106 | } |
107 | } | 107 | } |
@@ -241,7 +241,8 @@ static void collectproto (lua_State *L) { | |||
241 | } | 241 | } |
242 | 242 | ||
243 | 243 | ||
244 | static void collectclosure (lua_State *L, Closure **p) { | 244 | static void collectclosures (lua_State *L) { |
245 | Closure **p = &G(L)->rootcl; | ||
245 | Closure *curr; | 246 | Closure *curr; |
246 | while ((curr = *p) != NULL) { | 247 | while ((curr = *p) != NULL) { |
247 | if (curr->c.marked) { | 248 | if (curr->c.marked) { |
@@ -256,13 +257,19 @@ static void collectclosure (lua_State *L, Closure **p) { | |||
256 | } | 257 | } |
257 | 258 | ||
258 | 259 | ||
259 | static void collectclosures (lua_State *L) { | 260 | static void collectupval (lua_State *L) { |
260 | lua_State *L1 = L; | 261 | UpVal **v = &G(L)->rootupval; |
261 | do { /* for each thread */ | 262 | UpVal *curr; |
262 | collectclosure(L1, &L1->opencl); | 263 | while ((curr = *v) != NULL) { |
263 | L1 = L1->next; | 264 | if (curr->mark) { |
264 | } while (L1 != L); | 265 | curr->mark = 0; |
265 | collectclosure(L, &G(L)->rootcl); | 266 | v = &curr->next; /* next */ |
267 | } | ||
268 | else { | ||
269 | *v = curr->next; /* next */ | ||
270 | luaM_freelem(L, curr); | ||
271 | } | ||
272 | } | ||
266 | } | 273 | } |
267 | 274 | ||
268 | 275 | ||
@@ -282,23 +289,6 @@ static void collecttable (lua_State *L) { | |||
282 | } | 289 | } |
283 | 290 | ||
284 | 291 | ||
285 | static void collectupval (lua_State *L) { | ||
286 | TObject **v = &G(L)->rootupval; | ||
287 | TObject *curr; | ||
288 | while ((curr = *v) != NULL) { | ||
289 | if (ttype(curr) == LUA_TNIL) { /* was marked? */ | ||
290 | ttype(curr) = LUA_HEAPUPVAL; /* unmark */ | ||
291 | v = &vvalue(curr); /* next */ | ||
292 | } | ||
293 | else { | ||
294 | lua_assert(ttype(curr) == LUA_HEAPUPVAL); | ||
295 | *v = vvalue(curr); /* next */ | ||
296 | luaM_freearray(L, curr, 2, TObject); | ||
297 | } | ||
298 | } | ||
299 | } | ||
300 | |||
301 | |||
302 | static void collectudata (lua_State *L, int keep) { | 292 | static void collectudata (lua_State *L, int keep) { |
303 | Udata **p = &G(L)->rootudata; | 293 | Udata **p = &G(L)->rootudata; |
304 | Udata *curr; | 294 | Udata *curr; |