static const char *getvarname(const GCproto *pt, BCPos pc, BCReg slot)
{
MSize i;
- for (i = 0; i < pt->sizevarinfo && pt->varinfo[i].startpc <= pc; i++)
- if (pc < pt->varinfo[i].endpc && slot-- == 0)
- return strdata(pt->varinfo[i].name);
+ for (i = 0; i < pt->sizevarinfo && proto_varinfo(pt)[i].startpc <= pc; i++)
+ if (pc < proto_varinfo(pt)[i].endpc && slot-- == 0)
+ return strdata(gco2str(gcref(proto_varinfo(pt)[i].name)));
return NULL;
}
pt->linedefined = 0;
pt->lastlinedefined = 0;
setmref(pt->lineinfo, NULL);
- pt->varinfo = NULL;
+ setmref(pt->varinfo, NULL);
setmref(pt->uvname, NULL);
setgcrefnull(pt->chunkname);
return pt;
lj_mem_freevec(g, proto_bc(pt), pt->sizebc, BCIns);
lj_mem_freevec(g, proto_uv(pt), pt->sizeuv, uint16_t);
lj_mem_freevec(g, proto_lineinfo(pt), pt->sizelineinfo, BCLine);
- lj_mem_freevec(g, pt->varinfo, pt->sizevarinfo, struct VarInfo);
+ lj_mem_freevec(g, proto_varinfo(pt), pt->sizevarinfo, VarInfo);
lj_mem_freevec(g, mref(pt->uvname, GCRef), pt->sizeuvname, GCRef);
lj_trace_freeproto(g, pt);
lj_mem_freet(g, pt);
if (proto_uvname(pt, i))
gc_mark_str(gco2str(proto_uvname(pt, i)));
for (i = 0; i < (ptrdiff_t)pt->sizevarinfo; i++) /* Mark names of locals. */
- if (pt->varinfo[i].name)
- gc_mark_str(pt->varinfo[i].name);
+ if (gcref(proto_varinfo(pt)[i].name))
+ gc_mark_str(gco2str(gcref(proto_varinfo(pt)[i].name)));
}
/* Traverse the frame structure of a stack. */
#define round_nkgc(n) (((n) + SCALE_NUM_GCO-1) & ~(SCALE_NUM_GCO-1))
typedef struct VarInfo {
- GCstr *name; /* Local variable name. */
+ GCRef name; /* Local variable name. */
BCPos startpc; /* First point where the local variable is active. */
BCPos endpc; /* First point where the local variable is dead. */
} VarInfo;
BCLine linedefined; /* First line of the function definition. */
BCLine lastlinedefined; /* Last line of the function definition. */
MRef lineinfo; /* Map from bytecode instructions to source lines. */
- struct VarInfo *varinfo; /* Names and extents of local variables. */
+ MRef varinfo; /* Names and extents of local variables. */
MRef uvname; /* Array of upvalue names (GCRef of GCstr). */
GCRef chunkname; /* Name of the chunk this function was defined in. */
} GCproto;
#define proto_lineinfo(pt) (mref((pt)->lineinfo, BCLine))
#define proto_line(pt, pos) \
check_exp((uintptr_t)(pos) < (pt)->sizebc, proto_lineinfo(pt)[(pos)])
+#define proto_varinfo(pt) (mref((pt)->varinfo, VarInfo))
/* -- Upvalue object ------------------------------------------------------ */
/* -- Variable handling --------------------------------------------------- */
-#define getlocvar(fs, i) ((fs)->pt->varinfo[(fs)->actvar[(i)]])
+#define getlocvar(fs, i) (proto_varinfo((fs)->pt)[(fs)->actvar[(i)]])
static BCReg registerlocalvar(LexState *ls, GCstr *name)
{
FuncState *fs = ls->fs;
GCproto *pt = fs->pt;
+ VarInfo *varinfo = proto_varinfo(pt);
if (LJ_UNLIKELY(fs->nlocvars >= pt->sizevarinfo)) {
MSize oldsize = pt->sizevarinfo;
checklimit(fs, fs->nlocvars, 32767, "local variables");
- lj_mem_growvec(fs->L, pt->varinfo, pt->sizevarinfo, 32767, VarInfo);
- while (oldsize < pt->sizevarinfo) pt->varinfo[oldsize++].name = NULL;
+ lj_mem_growvec(fs->L, varinfo, pt->sizevarinfo, 32767, VarInfo);
+ setmref(pt->varinfo, varinfo);
+ while (oldsize < pt->sizevarinfo) setgcrefnull(varinfo[oldsize++].name);
}
- pt->varinfo[fs->nlocvars].name = name;
+ setgcref(varinfo[fs->nlocvars].name, obj2gco(name));
lj_gc_objbarrier(ls->L, pt, name);
return fs->nlocvars++;
}
{
int i;
for (i = fs->nactvar-1; i >= 0; i--) {
- if (n == getlocvar(fs, i).name)
+ if (n == gco2str(gcref(getlocvar(fs, i).name)))
return (BCReg)i;
}
return (BCReg)-1; /* Not found. */
BCIns *bc;
GCRef *uvname;
BCLine *lineinfo;
+ VarInfo *varinfo;
removevars(ls, 0);
finalret(fs, pt);
bc = proto_bc(pt);
lj_mem_reallocvec(L, lineinfo, pt->sizelineinfo, fs->pc, BCLine);
setmref(pt->lineinfo, lineinfo);
pt->sizelineinfo = fs->pc;
- lj_mem_reallocvec(L, pt->varinfo, pt->sizevarinfo, fs->nlocvars, VarInfo);
+ varinfo = proto_varinfo(pt);
+ lj_mem_reallocvec(L, varinfo, pt->sizevarinfo, fs->nlocvars, VarInfo);
+ setmref(pt->varinfo, varinfo);
pt->sizevarinfo = fs->nlocvars;
uvname = mref(pt->uvname, GCRef);
lj_mem_reallocvec(L, uvname, pt->sizeuvname, fs->nuv, GCRef);