diff options
Diffstat (limited to 'src/lj_func.c')
-rw-r--r-- | src/lj_func.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/src/lj_func.c b/src/lj_func.c index abb7afd5..231701db 100644 --- a/src/lj_func.c +++ b/src/lj_func.c | |||
@@ -51,7 +51,7 @@ void LJ_FASTCALL lj_func_freeproto(global_State *g, GCproto *pt) | |||
51 | pt->sizekn*(MSize)sizeof(lua_Number); | 51 | pt->sizekn*(MSize)sizeof(lua_Number); |
52 | lj_mem_free(g, pt->k.gc - nkgc, sizek); | 52 | lj_mem_free(g, pt->k.gc - nkgc, sizek); |
53 | lj_mem_freevec(g, pt->bc, pt->sizebc, BCIns); | 53 | lj_mem_freevec(g, pt->bc, pt->sizebc, BCIns); |
54 | lj_mem_freevec(g, pt->uv, pt->sizeuv, int16_t); | 54 | lj_mem_freevec(g, pt->uv, pt->sizeuv, uint16_t); |
55 | lj_mem_freevec(g, pt->lineinfo, pt->sizelineinfo, int32_t); | 55 | lj_mem_freevec(g, pt->lineinfo, pt->sizelineinfo, int32_t); |
56 | lj_mem_freevec(g, pt->varinfo, pt->sizevarinfo, struct VarInfo); | 56 | lj_mem_freevec(g, pt->varinfo, pt->sizevarinfo, struct VarInfo); |
57 | lj_mem_freevec(g, pt->uvname, pt->sizeuvname, GCstr *); | 57 | lj_mem_freevec(g, pt->uvname, pt->sizeuvname, GCstr *); |
@@ -170,7 +170,12 @@ GCfunc *lj_func_newL_gc(lua_State *L, GCproto *pt, GCfuncL *parent) | |||
170 | base = L->base; | 170 | base = L->base; |
171 | for (i = 0; i < nuv; i++) { | 171 | for (i = 0; i < nuv; i++) { |
172 | ptrdiff_t v = pt->uv[i]; | 172 | ptrdiff_t v = pt->uv[i]; |
173 | GCupval *uv = v < 0 ? &gcref(puv[~v])->uv : func_finduv(L, base + v); | 173 | GCupval *uv; |
174 | if ((v & 0x8000)) { | ||
175 | uv = func_finduv(L, base + (v & 0xff)); | ||
176 | } else { | ||
177 | uv = &gcref(puv[v])->uv; | ||
178 | } | ||
174 | setgcref(fn->l.uvptr[i], obj2gco(uv)); | 179 | setgcref(fn->l.uvptr[i], obj2gco(uv)); |
175 | } | 180 | } |
176 | return fn; | 181 | return fn; |