diff options
Diffstat (limited to 'src/lj_func.c')
-rw-r--r-- | src/lj_func.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/src/lj_func.c b/src/lj_func.c index 5df652d8..9795a771 100644 --- a/src/lj_func.c +++ b/src/lj_func.c | |||
@@ -24,9 +24,11 @@ void LJ_FASTCALL lj_func_freeproto(global_State *g, GCproto *pt) | |||
24 | 24 | ||
25 | /* -- Upvalues ------------------------------------------------------------ */ | 25 | /* -- Upvalues ------------------------------------------------------------ */ |
26 | 26 | ||
27 | static void unlinkuv(GCupval *uv) | 27 | static void unlinkuv(global_State *g, GCupval *uv) |
28 | { | 28 | { |
29 | lua_assert(uvprev(uvnext(uv)) == uv && uvnext(uvprev(uv)) == uv); | 29 | UNUSED(g); |
30 | lj_assertG(uvprev(uvnext(uv)) == uv && uvnext(uvprev(uv)) == uv, | ||
31 | "broken upvalue chain"); | ||
30 | setgcrefr(uvnext(uv)->prev, uv->prev); | 32 | setgcrefr(uvnext(uv)->prev, uv->prev); |
31 | setgcrefr(uvprev(uv)->next, uv->next); | 33 | setgcrefr(uvprev(uv)->next, uv->next); |
32 | } | 34 | } |
@@ -40,7 +42,7 @@ static GCupval *func_finduv(lua_State *L, TValue *slot) | |||
40 | GCupval *uv; | 42 | GCupval *uv; |
41 | /* Search the sorted list of open upvalues. */ | 43 | /* Search the sorted list of open upvalues. */ |
42 | while (gcref(*pp) != NULL && uvval((p = gco2uv(gcref(*pp)))) >= slot) { | 44 | while (gcref(*pp) != NULL && uvval((p = gco2uv(gcref(*pp)))) >= slot) { |
43 | lua_assert(!p->closed && uvval(p) != &p->tv); | 45 | lj_assertG(!p->closed && uvval(p) != &p->tv, "closed upvalue in chain"); |
44 | if (uvval(p) == slot) { /* Found open upvalue pointing to same slot? */ | 46 | if (uvval(p) == slot) { /* Found open upvalue pointing to same slot? */ |
45 | if (isdead(g, obj2gco(p))) /* Resurrect it, if it's dead. */ | 47 | if (isdead(g, obj2gco(p))) /* Resurrect it, if it's dead. */ |
46 | flipwhite(obj2gco(p)); | 48 | flipwhite(obj2gco(p)); |
@@ -61,7 +63,8 @@ static GCupval *func_finduv(lua_State *L, TValue *slot) | |||
61 | setgcrefr(uv->next, g->uvhead.next); | 63 | setgcrefr(uv->next, g->uvhead.next); |
62 | setgcref(uvnext(uv)->prev, obj2gco(uv)); | 64 | setgcref(uvnext(uv)->prev, obj2gco(uv)); |
63 | setgcref(g->uvhead.next, obj2gco(uv)); | 65 | setgcref(g->uvhead.next, obj2gco(uv)); |
64 | lua_assert(uvprev(uvnext(uv)) == uv && uvnext(uvprev(uv)) == uv); | 66 | lj_assertG(uvprev(uvnext(uv)) == uv && uvnext(uvprev(uv)) == uv, |
67 | "broken upvalue chain"); | ||
65 | return uv; | 68 | return uv; |
66 | } | 69 | } |
67 | 70 | ||
@@ -84,12 +87,13 @@ void LJ_FASTCALL lj_func_closeuv(lua_State *L, TValue *level) | |||
84 | while (gcref(L->openupval) != NULL && | 87 | while (gcref(L->openupval) != NULL && |
85 | uvval((uv = gco2uv(gcref(L->openupval)))) >= level) { | 88 | uvval((uv = gco2uv(gcref(L->openupval)))) >= level) { |
86 | GCobj *o = obj2gco(uv); | 89 | GCobj *o = obj2gco(uv); |
87 | lua_assert(!isblack(o) && !uv->closed && uvval(uv) != &uv->tv); | 90 | lj_assertG(!isblack(o), "bad black upvalue"); |
91 | lj_assertG(!uv->closed && uvval(uv) != &uv->tv, "closed upvalue in chain"); | ||
88 | setgcrefr(L->openupval, uv->nextgc); /* No longer in open list. */ | 92 | setgcrefr(L->openupval, uv->nextgc); /* No longer in open list. */ |
89 | if (isdead(g, o)) { | 93 | if (isdead(g, o)) { |
90 | lj_func_freeuv(g, uv); | 94 | lj_func_freeuv(g, uv); |
91 | } else { | 95 | } else { |
92 | unlinkuv(uv); | 96 | unlinkuv(g, uv); |
93 | lj_gc_closeuv(g, uv); | 97 | lj_gc_closeuv(g, uv); |
94 | } | 98 | } |
95 | } | 99 | } |
@@ -98,7 +102,7 @@ void LJ_FASTCALL lj_func_closeuv(lua_State *L, TValue *level) | |||
98 | void LJ_FASTCALL lj_func_freeuv(global_State *g, GCupval *uv) | 102 | void LJ_FASTCALL lj_func_freeuv(global_State *g, GCupval *uv) |
99 | { | 103 | { |
100 | if (!uv->closed) | 104 | if (!uv->closed) |
101 | unlinkuv(uv); | 105 | unlinkuv(g, uv); |
102 | lj_mem_freet(g, uv); | 106 | lj_mem_freet(g, uv); |
103 | } | 107 | } |
104 | 108 | ||