summaryrefslogtreecommitdiff
path: root/src/lj_func.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_func.c')
-rw-r--r--src/lj_func.c9
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;