From a0914c409b615af85eafb7e2787be628483ffde2 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Fri, 5 Feb 2010 01:35:38 +0100 Subject: [PATCH] 32/64 bit memory ref cleanup, part 4: GCproto ->varinfo. --- src/lj_err.c | 6 +++--- src/lj_func.c | 4 ++-- src/lj_gc.c | 4 ++-- src/lj_obj.h | 5 +++-- src/lj_parse.c | 17 +++++++++++------ 5 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/lj_err.c b/src/lj_err.c index cf7f9ae4..b0143c5a 100644 --- a/src/lj_err.c +++ b/src/lj_err.c @@ -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) { 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; } diff --git a/src/lj_func.c b/src/lj_func.c index 4354aa21..74aba745 100644 --- a/src/lj_func.c +++ b/src/lj_func.c @@ -38,7 +38,7 @@ GCproto *lj_func_newproto(lua_State *L) 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; @@ -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_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); diff --git a/src/lj_gc.c b/src/lj_gc.c index 04aa7161..c1ade95a 100644 --- a/src/lj_gc.c +++ b/src/lj_gc.c @@ -259,8 +259,8 @@ static void gc_traverse_proto(global_State *g, GCproto *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. */ diff --git a/src/lj_obj.h b/src/lj_obj.h index cdb90dff..a0dc689c 100644 --- a/src/lj_obj.h +++ b/src/lj_obj.h @@ -339,7 +339,7 @@ enum { #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; @@ -365,7 +365,7 @@ typedef struct GCproto { 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; @@ -396,6 +396,7 @@ typedef struct 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 ------------------------------------------------------ */ diff --git a/src/lj_parse.c b/src/lj_parse.c index a3291553..30a423bd 100644 --- a/src/lj_parse.c +++ b/src/lj_parse.c @@ -974,19 +974,21 @@ static void checkname(LexState *ls, ExpDesc *e) /* -- 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++; } @@ -1048,7 +1050,7 @@ static BCReg searchvar(FuncState *fs, GCstr *n) { 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. */ @@ -1237,6 +1239,7 @@ static void close_func(LexState *ls) BCIns *bc; GCRef *uvname; BCLine *lineinfo; + VarInfo *varinfo; removevars(ls, 0); finalret(fs, 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); 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);