mirror of
https://github.com/LuaJIT/LuaJIT.git
synced 2025-02-07 23:24:09 +00:00
32/64 bit memory ref cleanup, part 4: GCproto ->varinfo.
This commit is contained in:
parent
8dcc4364cf
commit
a0914c409b
@ -138,9 +138,9 @@ static BCLine currentline(lua_State *L, GCfunc *fn, cTValue *nextframe)
|
|||||||
static const char *getvarname(const GCproto *pt, BCPos pc, BCReg slot)
|
static const char *getvarname(const GCproto *pt, BCPos pc, BCReg slot)
|
||||||
{
|
{
|
||||||
MSize i;
|
MSize i;
|
||||||
for (i = 0; i < pt->sizevarinfo && pt->varinfo[i].startpc <= pc; i++)
|
for (i = 0; i < pt->sizevarinfo && proto_varinfo(pt)[i].startpc <= pc; i++)
|
||||||
if (pc < pt->varinfo[i].endpc && slot-- == 0)
|
if (pc < proto_varinfo(pt)[i].endpc && slot-- == 0)
|
||||||
return strdata(pt->varinfo[i].name);
|
return strdata(gco2str(gcref(proto_varinfo(pt)[i].name)));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@ GCproto *lj_func_newproto(lua_State *L)
|
|||||||
pt->linedefined = 0;
|
pt->linedefined = 0;
|
||||||
pt->lastlinedefined = 0;
|
pt->lastlinedefined = 0;
|
||||||
setmref(pt->lineinfo, NULL);
|
setmref(pt->lineinfo, NULL);
|
||||||
pt->varinfo = NULL;
|
setmref(pt->varinfo, NULL);
|
||||||
setmref(pt->uvname, NULL);
|
setmref(pt->uvname, NULL);
|
||||||
setgcrefnull(pt->chunkname);
|
setgcrefnull(pt->chunkname);
|
||||||
return pt;
|
return pt;
|
||||||
@ -53,7 +53,7 @@ void LJ_FASTCALL lj_func_freeproto(global_State *g, GCproto *pt)
|
|||||||
lj_mem_freevec(g, proto_bc(pt), pt->sizebc, BCIns);
|
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_uv(pt), pt->sizeuv, uint16_t);
|
||||||
lj_mem_freevec(g, proto_lineinfo(pt), pt->sizelineinfo, BCLine);
|
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_mem_freevec(g, mref(pt->uvname, GCRef), pt->sizeuvname, GCRef);
|
||||||
lj_trace_freeproto(g, pt);
|
lj_trace_freeproto(g, pt);
|
||||||
lj_mem_freet(g, pt);
|
lj_mem_freet(g, pt);
|
||||||
|
@ -259,8 +259,8 @@ static void gc_traverse_proto(global_State *g, GCproto *pt)
|
|||||||
if (proto_uvname(pt, i))
|
if (proto_uvname(pt, i))
|
||||||
gc_mark_str(gco2str(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. */
|
for (i = 0; i < (ptrdiff_t)pt->sizevarinfo; i++) /* Mark names of locals. */
|
||||||
if (pt->varinfo[i].name)
|
if (gcref(proto_varinfo(pt)[i].name))
|
||||||
gc_mark_str(pt->varinfo[i].name);
|
gc_mark_str(gco2str(gcref(proto_varinfo(pt)[i].name)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Traverse the frame structure of a stack. */
|
/* Traverse the frame structure of a stack. */
|
||||||
|
@ -339,7 +339,7 @@ enum {
|
|||||||
#define round_nkgc(n) (((n) + SCALE_NUM_GCO-1) & ~(SCALE_NUM_GCO-1))
|
#define round_nkgc(n) (((n) + SCALE_NUM_GCO-1) & ~(SCALE_NUM_GCO-1))
|
||||||
|
|
||||||
typedef struct VarInfo {
|
typedef struct VarInfo {
|
||||||
GCstr *name; /* Local variable name. */
|
GCRef name; /* Local variable name. */
|
||||||
BCPos startpc; /* First point where the local variable is active. */
|
BCPos startpc; /* First point where the local variable is active. */
|
||||||
BCPos endpc; /* First point where the local variable is dead. */
|
BCPos endpc; /* First point where the local variable is dead. */
|
||||||
} VarInfo;
|
} VarInfo;
|
||||||
@ -365,7 +365,7 @@ typedef struct GCproto {
|
|||||||
BCLine linedefined; /* First line of the function definition. */
|
BCLine linedefined; /* First line of the function definition. */
|
||||||
BCLine lastlinedefined; /* Last line of the function definition. */
|
BCLine lastlinedefined; /* Last line of the function definition. */
|
||||||
MRef lineinfo; /* Map from bytecode instructions to source lines. */
|
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). */
|
MRef uvname; /* Array of upvalue names (GCRef of GCstr). */
|
||||||
GCRef chunkname; /* Name of the chunk this function was defined in. */
|
GCRef chunkname; /* Name of the chunk this function was defined in. */
|
||||||
} GCproto;
|
} GCproto;
|
||||||
@ -396,6 +396,7 @@ typedef struct GCproto {
|
|||||||
#define proto_lineinfo(pt) (mref((pt)->lineinfo, BCLine))
|
#define proto_lineinfo(pt) (mref((pt)->lineinfo, BCLine))
|
||||||
#define proto_line(pt, pos) \
|
#define proto_line(pt, pos) \
|
||||||
check_exp((uintptr_t)(pos) < (pt)->sizebc, proto_lineinfo(pt)[(pos)])
|
check_exp((uintptr_t)(pos) < (pt)->sizebc, proto_lineinfo(pt)[(pos)])
|
||||||
|
#define proto_varinfo(pt) (mref((pt)->varinfo, VarInfo))
|
||||||
|
|
||||||
/* -- Upvalue object ------------------------------------------------------ */
|
/* -- Upvalue object ------------------------------------------------------ */
|
||||||
|
|
||||||
|
@ -974,19 +974,21 @@ static void checkname(LexState *ls, ExpDesc *e)
|
|||||||
|
|
||||||
/* -- Variable handling --------------------------------------------------- */
|
/* -- 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)
|
static BCReg registerlocalvar(LexState *ls, GCstr *name)
|
||||||
{
|
{
|
||||||
FuncState *fs = ls->fs;
|
FuncState *fs = ls->fs;
|
||||||
GCproto *pt = fs->pt;
|
GCproto *pt = fs->pt;
|
||||||
|
VarInfo *varinfo = proto_varinfo(pt);
|
||||||
if (LJ_UNLIKELY(fs->nlocvars >= pt->sizevarinfo)) {
|
if (LJ_UNLIKELY(fs->nlocvars >= pt->sizevarinfo)) {
|
||||||
MSize oldsize = pt->sizevarinfo;
|
MSize oldsize = pt->sizevarinfo;
|
||||||
checklimit(fs, fs->nlocvars, 32767, "local variables");
|
checklimit(fs, fs->nlocvars, 32767, "local variables");
|
||||||
lj_mem_growvec(fs->L, pt->varinfo, pt->sizevarinfo, 32767, VarInfo);
|
lj_mem_growvec(fs->L, varinfo, pt->sizevarinfo, 32767, VarInfo);
|
||||||
while (oldsize < pt->sizevarinfo) pt->varinfo[oldsize++].name = NULL;
|
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);
|
lj_gc_objbarrier(ls->L, pt, name);
|
||||||
return fs->nlocvars++;
|
return fs->nlocvars++;
|
||||||
}
|
}
|
||||||
@ -1048,7 +1050,7 @@ static BCReg searchvar(FuncState *fs, GCstr *n)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i = fs->nactvar-1; i >= 0; 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)i;
|
||||||
}
|
}
|
||||||
return (BCReg)-1; /* Not found. */
|
return (BCReg)-1; /* Not found. */
|
||||||
@ -1237,6 +1239,7 @@ static void close_func(LexState *ls)
|
|||||||
BCIns *bc;
|
BCIns *bc;
|
||||||
GCRef *uvname;
|
GCRef *uvname;
|
||||||
BCLine *lineinfo;
|
BCLine *lineinfo;
|
||||||
|
VarInfo *varinfo;
|
||||||
removevars(ls, 0);
|
removevars(ls, 0);
|
||||||
finalret(fs, pt);
|
finalret(fs, pt);
|
||||||
bc = proto_bc(pt);
|
bc = proto_bc(pt);
|
||||||
@ -1249,7 +1252,9 @@ static void close_func(LexState *ls)
|
|||||||
lj_mem_reallocvec(L, lineinfo, pt->sizelineinfo, fs->pc, BCLine);
|
lj_mem_reallocvec(L, lineinfo, pt->sizelineinfo, fs->pc, BCLine);
|
||||||
setmref(pt->lineinfo, lineinfo);
|
setmref(pt->lineinfo, lineinfo);
|
||||||
pt->sizelineinfo = fs->pc;
|
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;
|
pt->sizevarinfo = fs->nlocvars;
|
||||||
uvname = mref(pt->uvname, GCRef);
|
uvname = mref(pt->uvname, GCRef);
|
||||||
lj_mem_reallocvec(L, uvname, pt->sizeuvname, fs->nuv, GCRef);
|
lj_mem_reallocvec(L, uvname, pt->sizeuvname, fs->nuv, GCRef);
|
||||||
|
Loading…
Reference in New Issue
Block a user