aboutsummaryrefslogtreecommitdiff
path: root/src/lj_gc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_gc.c')
-rw-r--r--src/lj_gc.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/src/lj_gc.c b/src/lj_gc.c
index e3d02cd4..ffe5d4b1 100644
--- a/src/lj_gc.c
+++ b/src/lj_gc.c
@@ -62,7 +62,7 @@ static void gc_mark(global_State *g, GCobj *o)
62 gc_markobj(g, tabref(gco2ud(o)->env)); 62 gc_markobj(g, tabref(gco2ud(o)->env));
63 } else if (LJ_UNLIKELY(o->gch.gct == ~LJ_TUPVAL)) { 63 } else if (LJ_UNLIKELY(o->gch.gct == ~LJ_TUPVAL)) {
64 GCupval *uv = gco2uv(o); 64 GCupval *uv = gco2uv(o);
65 gc_marktv(g, uv->v); 65 gc_marktv(g, uvval(uv));
66 if (uv->closed) 66 if (uv->closed)
67 gray2black(o); /* Closed upvalues are never gray. */ 67 gray2black(o); /* Closed upvalues are never gray. */
68 } else if (o->gch.gct != ~LJ_TSTR) { 68 } else if (o->gch.gct != ~LJ_TSTR) {
@@ -102,7 +102,7 @@ static void gc_mark_uv(global_State *g)
102 for (uv = uvnext(&g->uvhead); uv != &g->uvhead; uv = uvnext(uv)) { 102 for (uv = uvnext(&g->uvhead); uv != &g->uvhead; uv = uvnext(uv)) {
103 lua_assert(uvprev(uvnext(uv)) == uv && uvnext(uvprev(uv)) == uv); 103 lua_assert(uvprev(uvnext(uv)) == uv && uvnext(uvprev(uv)) == uv);
104 if (isgray(obj2gco(uv))) 104 if (isgray(obj2gco(uv)))
105 gc_marktv(g, uv->v); 105 gc_marktv(g, uvval(uv));
106 } 106 }
107} 107}
108 108
@@ -727,16 +727,16 @@ void lj_gc_closeuv(global_State *g, GCupval *uv)
727{ 727{
728 GCobj *o = obj2gco(uv); 728 GCobj *o = obj2gco(uv);
729 /* Copy stack slot to upvalue itself and point to the copy. */ 729 /* Copy stack slot to upvalue itself and point to the copy. */
730 copyTV(mainthread(g), &uv->tv, uv->v); 730 copyTV(mainthread(g), &uv->tv, uvval(uv));
731 uv->v = &uv->tv; 731 setmref(uv->v, &uv->tv);
732 uv->closed = 1; 732 uv->closed = 1;
733 setgcrefr(o->gch.nextgc, g->gc.root); 733 setgcrefr(o->gch.nextgc, g->gc.root);
734 setgcref(g->gc.root, o); 734 setgcref(g->gc.root, o);
735 if (isgray(o)) { /* A closed upvalue is never gray, so fix this. */ 735 if (isgray(o)) { /* A closed upvalue is never gray, so fix this. */
736 if (g->gc.state == GCSpropagate) { 736 if (g->gc.state == GCSpropagate) {
737 gray2black(o); /* Make it black and preserve invariant. */ 737 gray2black(o); /* Make it black and preserve invariant. */
738 if (tviswhite(uv->v)) 738 if (tviswhite(&uv->tv))
739 lj_gc_barrierf(g, o, gcV(uv->v)); 739 lj_gc_barrierf(g, o, gcV(&uv->tv));
740 } else { 740 } else {
741 makewhite(g, o); /* Make it white, i.e. sweep the upvalue. */ 741 makewhite(g, o); /* Make it white, i.e. sweep the upvalue. */
742 lua_assert(g->gc.state != GCSfinalize && g->gc.state != GCSpause); 742 lua_assert(g->gc.state != GCSfinalize && g->gc.state != GCSpause);