32/64 bit memory ref cleanup, part 2: GCproto ->uvname and ->chunkname.

This commit is contained in:
Mike Pall
2010-02-05 00:52:21 +01:00
parent c8d55e8506
commit d778982120
8 changed files with 43 additions and 30 deletions

View File

@@ -1017,20 +1017,23 @@ static uint32_t indexupvalue(FuncState *fs, GCstr *name, ExpDesc *v)
{
uint32_t i;
GCproto *pt = fs->pt;
GCRef *uvname;
for (i = 0; i < fs->nuv; i++) {
if (fs->upvalues[i].info == v->u.s.info && fs->upvalues[i].k == v->k) {
lua_assert(pt->uvname[i] == name);
lua_assert(gco2str(proto_uvname(pt, i)) == name);
return i;
}
}
/* Not found, create a new upvalue for this name. */
uvname = mref(pt->uvname, GCRef);
if (LJ_UNLIKELY(fs->nuv >= pt->sizeuvname)) {
MSize oldsize = pt->sizeuvname;
checklimit(fs, fs->nuv, LJ_MAX_UPVAL, "upvalues");
lj_mem_growvec(fs->L, pt->uvname, pt->sizeuvname, LJ_MAX_UPVAL, GCstr *);
while (oldsize < pt->sizeuvname) pt->uvname[oldsize++] = NULL;
lj_mem_growvec(fs->L, uvname, pt->sizeuvname, LJ_MAX_UPVAL, GCRef);
setmref(pt->uvname, uvname);
while (oldsize < pt->sizeuvname) setgcrefnull(uvname[oldsize++]);
}
pt->uvname[fs->nuv] = name;
setgcref(uvname[fs->nuv], obj2gco(name));
lj_gc_objbarrier(fs->L, pt, name);
lua_assert(v->k == VLOCAL || v->k == VUPVAL);
fs->upvalues[fs->nuv].k = cast_byte(v->k);
@@ -1123,7 +1126,7 @@ static void open_func(LexState *ls, FuncState *fs)
fs->nactvar = 0;
fs->nuv = 0;
fs->bl = NULL;
pt->chunkname = ls->chunkname;
setgcref(pt->chunkname, obj2gco(ls->chunkname));
pt->framesize = 2; /* registers 0/1 are always valid */
fs->kt = lj_tab_new(L, 0, 0);
/* anchor table of constants and prototype (to avoid being collected) */
@@ -1176,12 +1179,13 @@ static void collectk(FuncState *fs, GCproto *pt)
static void collectuv(FuncState *fs, GCproto *pt)
{
uint32_t i;
pt->uv = lj_mem_newvec(fs->L, fs->nuv, uint16_t);
uint16_t *uv = lj_mem_newvec(fs->L, fs->nuv, uint16_t);
setmref(pt->uv, uv);
pt->sizeuv = fs->nuv;
for (i = 0; i < pt->sizeuv; i++) {
uint32_t v = fs->upvalues[i].info;
if (fs->upvalues[i].k == VLOCAL) v |= 0x8000;
pt->uv[i] = (uint16_t)v;
uv[i] = (uint16_t)v;
}
}
@@ -1228,6 +1232,7 @@ static void close_func(LexState *ls)
FuncState *fs = ls->fs;
GCproto *pt = fs->pt;
BCIns *bc;
GCRef *uvname;
removevars(ls, 0);
finalret(fs, pt);
bc = proto_bc(pt);
@@ -1240,7 +1245,9 @@ static void close_func(LexState *ls)
pt->sizelineinfo = fs->pc;
lj_mem_reallocvec(L, pt->varinfo, pt->sizevarinfo, fs->nlocvars, VarInfo);
pt->sizevarinfo = fs->nlocvars;
lj_mem_reallocvec(L, pt->uvname, pt->sizeuvname, fs->nuv, GCstr *);
uvname = mref(pt->uvname, GCRef);
lj_mem_reallocvec(L, uvname, pt->sizeuvname, fs->nuv, GCRef);
setmref(pt->uvname, uvname);
pt->sizeuvname = fs->nuv;
lua_assert(fs->bl == NULL);
lj_vmevent_send(L, BC,