diff options
Diffstat (limited to 'src/lj_gc.c')
-rw-r--r-- | src/lj_gc.c | 12 |
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); |