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 fc157843..e9dd36d8 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 | ||
