pt->sizekn*(MSize)sizeof(lua_Number);
lj_mem_free(g, pt->k.gc - nkgc, sizek);
lj_mem_freevec(g, pt->bc, pt->sizebc, BCIns);
- lj_mem_freevec(g, pt->uv, pt->sizeuv, int16_t);
+ lj_mem_freevec(g, pt->uv, pt->sizeuv, uint16_t);
lj_mem_freevec(g, pt->lineinfo, pt->sizelineinfo, int32_t);
lj_mem_freevec(g, pt->varinfo, pt->sizevarinfo, struct VarInfo);
lj_mem_freevec(g, pt->uvname, pt->sizeuvname, GCstr *);
base = L->base;
for (i = 0; i < nuv; i++) {
ptrdiff_t v = pt->uv[i];
- GCupval *uv = v < 0 ? &gcref(puv[~v])->uv : func_finduv(L, base + v);
+ GCupval *uv;
+ if ((v & 0x8000)) {
+ uv = func_finduv(L, base + (v & 0xff));
+ } else {
+ uv = &gcref(puv[v])->uv;
+ }
setgcref(fn->l.uvptr[i], obj2gco(uv));
}
return fn;
return sizeof(GCproto) + sizeof(BCIns) * pt->sizebc +
sizeof(GCRef) * pt->sizekgc +
sizeof(lua_Number) * pt->sizekn +
- sizeof(int16_t) * pt->sizeuv +
+ sizeof(uint16_t) * pt->sizeuv +
sizeof(int32_t) * pt->sizelineinfo +
sizeof(VarInfo) * pt->sizevarinfo +
sizeof(GCstr *) * pt->sizeuvname;
GCRef gclist;
ProtoK k; /* Split constant array (points to the middle). */
BCIns *bc; /* Array of bytecode instructions. */
- int16_t *uv; /* Upvalue list. local >= 0. parent uv < 0. */
+ uint16_t *uv; /* Upvalue list. local slot|0x8000 or parent uv idx. */
MSize sizekgc; /* Number of collectable constants. */
MSize sizekn; /* Number of lua_Number constants. */
uint8_t sizeuv; /* Number of upvalues. */
uint32_t i;
GCproto *pt = fs->pt;
for (i = 0; i < fs->nuv; i++) {
- if (fs->upvalues[i].k == v->k && fs->upvalues[i].info == v->u.s.info) {
+ if (fs->upvalues[i].info == v->u.s.info && fs->upvalues[i].k == v->k) {
lua_assert(pt->uvname[i] == name);
return i;
}
static void collectuv(FuncState *fs, GCproto *pt)
{
uint32_t i;
- pt->uv = lj_mem_newvec(fs->L, fs->nuv, int16_t);
+ pt->uv = lj_mem_newvec(fs->L, fs->nuv, uint16_t);
pt->sizeuv = fs->nuv;
for (i = 0; i < pt->sizeuv; i++) {
uint32_t v = fs->upvalues[i].info;
- if (fs->upvalues[i].k == VUPVAL) v = ~v;
- pt->uv[i] = (int16_t)v;
+ if (fs->upvalues[i].k == VLOCAL) v |= 0x8000;
+ pt->uv[i] = (uint16_t)v;
}
}