aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2010-02-05 01:35:38 +0100
committerMike Pall <mike>2010-02-05 01:35:38 +0100
commita0914c409b615af85eafb7e2787be628483ffde2 (patch)
treecce46eed095637c4d4873ce38c4dbd952f7851d3
parent8dcc4364cf2c56c9bdd8047fd0dceb4b70f727d2 (diff)
downloadluajit-a0914c409b615af85eafb7e2787be628483ffde2.tar.gz
luajit-a0914c409b615af85eafb7e2787be628483ffde2.tar.bz2
luajit-a0914c409b615af85eafb7e2787be628483ffde2.zip
32/64 bit memory ref cleanup, part 4: GCproto ->varinfo.
-rw-r--r--src/lj_err.c6
-rw-r--r--src/lj_func.c4
-rw-r--r--src/lj_gc.c4
-rw-r--r--src/lj_obj.h5
-rw-r--r--src/lj_parse.c17
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)
138static const char *getvarname(const GCproto *pt, BCPos pc, BCReg slot) 138static const char *getvarname(const GCproto *pt, BCPos pc, BCReg slot)
139{ 139{
140 MSize i; 140 MSize i;
141 for (i = 0; i < pt->sizevarinfo && pt->varinfo[i].startpc <= pc; i++) 141 for (i = 0; i < pt->sizevarinfo && proto_varinfo(pt)[i].startpc <= pc; i++)
142 if (pc < pt->varinfo[i].endpc && slot-- == 0) 142 if (pc < proto_varinfo(pt)[i].endpc && slot-- == 0)
143 return strdata(pt->varinfo[i].name); 143 return strdata(gco2str(gcref(proto_varinfo(pt)[i].name)));
144 return NULL; 144 return NULL;
145} 145}
146 146
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)
38 pt->linedefined = 0; 38 pt->linedefined = 0;
39 pt->lastlinedefined = 0; 39 pt->lastlinedefined = 0;
40 setmref(pt->lineinfo, NULL); 40 setmref(pt->lineinfo, NULL);
41 pt->varinfo = NULL; 41 setmref(pt->varinfo, NULL);
42 setmref(pt->uvname, NULL); 42 setmref(pt->uvname, NULL);
43 setgcrefnull(pt->chunkname); 43 setgcrefnull(pt->chunkname);
44 return pt; 44 return pt;
@@ -53,7 +53,7 @@ void LJ_FASTCALL lj_func_freeproto(global_State *g, GCproto *pt)
53 lj_mem_freevec(g, proto_bc(pt), pt->sizebc, BCIns); 53 lj_mem_freevec(g, proto_bc(pt), pt->sizebc, BCIns);
54 lj_mem_freevec(g, proto_uv(pt), pt->sizeuv, uint16_t); 54 lj_mem_freevec(g, proto_uv(pt), pt->sizeuv, uint16_t);
55 lj_mem_freevec(g, proto_lineinfo(pt), pt->sizelineinfo, BCLine); 55 lj_mem_freevec(g, proto_lineinfo(pt), pt->sizelineinfo, BCLine);
56 lj_mem_freevec(g, pt->varinfo, pt->sizevarinfo, struct VarInfo); 56 lj_mem_freevec(g, proto_varinfo(pt), pt->sizevarinfo, VarInfo);
57 lj_mem_freevec(g, mref(pt->uvname, GCRef), pt->sizeuvname, GCRef); 57 lj_mem_freevec(g, mref(pt->uvname, GCRef), pt->sizeuvname, GCRef);
58 lj_trace_freeproto(g, pt); 58 lj_trace_freeproto(g, pt);
59 lj_mem_freet(g, pt); 59 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)
259 if (proto_uvname(pt, i)) 259 if (proto_uvname(pt, i))
260 gc_mark_str(gco2str(proto_uvname(pt, i))); 260 gc_mark_str(gco2str(proto_uvname(pt, i)));
261 for (i = 0; i < (ptrdiff_t)pt->sizevarinfo; i++) /* Mark names of locals. */ 261 for (i = 0; i < (ptrdiff_t)pt->sizevarinfo; i++) /* Mark names of locals. */
262 if (pt->varinfo[i].name) 262 if (gcref(proto_varinfo(pt)[i].name))
263 gc_mark_str(pt->varinfo[i].name); 263 gc_mark_str(gco2str(gcref(proto_varinfo(pt)[i].name)));
264} 264}
265 265
266/* Traverse the frame structure of a stack. */ 266/* 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 {
339#define round_nkgc(n) (((n) + SCALE_NUM_GCO-1) & ~(SCALE_NUM_GCO-1)) 339#define round_nkgc(n) (((n) + SCALE_NUM_GCO-1) & ~(SCALE_NUM_GCO-1))
340 340
341typedef struct VarInfo { 341typedef struct VarInfo {
342 GCstr *name; /* Local variable name. */ 342 GCRef name; /* Local variable name. */
343 BCPos startpc; /* First point where the local variable is active. */ 343 BCPos startpc; /* First point where the local variable is active. */
344 BCPos endpc; /* First point where the local variable is dead. */ 344 BCPos endpc; /* First point where the local variable is dead. */
345} VarInfo; 345} VarInfo;
@@ -365,7 +365,7 @@ typedef struct GCproto {
365 BCLine linedefined; /* First line of the function definition. */ 365 BCLine linedefined; /* First line of the function definition. */
366 BCLine lastlinedefined; /* Last line of the function definition. */ 366 BCLine lastlinedefined; /* Last line of the function definition. */
367 MRef lineinfo; /* Map from bytecode instructions to source lines. */ 367 MRef lineinfo; /* Map from bytecode instructions to source lines. */
368 struct VarInfo *varinfo; /* Names and extents of local variables. */ 368 MRef varinfo; /* Names and extents of local variables. */
369 MRef uvname; /* Array of upvalue names (GCRef of GCstr). */ 369 MRef uvname; /* Array of upvalue names (GCRef of GCstr). */
370 GCRef chunkname; /* Name of the chunk this function was defined in. */ 370 GCRef chunkname; /* Name of the chunk this function was defined in. */
371} GCproto; 371} GCproto;
@@ -396,6 +396,7 @@ typedef struct GCproto {
396#define proto_lineinfo(pt) (mref((pt)->lineinfo, BCLine)) 396#define proto_lineinfo(pt) (mref((pt)->lineinfo, BCLine))
397#define proto_line(pt, pos) \ 397#define proto_line(pt, pos) \
398 check_exp((uintptr_t)(pos) < (pt)->sizebc, proto_lineinfo(pt)[(pos)]) 398 check_exp((uintptr_t)(pos) < (pt)->sizebc, proto_lineinfo(pt)[(pos)])
399#define proto_varinfo(pt) (mref((pt)->varinfo, VarInfo))
399 400
400/* -- Upvalue object ------------------------------------------------------ */ 401/* -- Upvalue object ------------------------------------------------------ */
401 402
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)
974 974
975/* -- Variable handling --------------------------------------------------- */ 975/* -- Variable handling --------------------------------------------------- */
976 976
977#define getlocvar(fs, i) ((fs)->pt->varinfo[(fs)->actvar[(i)]]) 977#define getlocvar(fs, i) (proto_varinfo((fs)->pt)[(fs)->actvar[(i)]])
978 978
979static BCReg registerlocalvar(LexState *ls, GCstr *name) 979static BCReg registerlocalvar(LexState *ls, GCstr *name)
980{ 980{
981 FuncState *fs = ls->fs; 981 FuncState *fs = ls->fs;
982 GCproto *pt = fs->pt; 982 GCproto *pt = fs->pt;
983 VarInfo *varinfo = proto_varinfo(pt);
983 if (LJ_UNLIKELY(fs->nlocvars >= pt->sizevarinfo)) { 984 if (LJ_UNLIKELY(fs->nlocvars >= pt->sizevarinfo)) {
984 MSize oldsize = pt->sizevarinfo; 985 MSize oldsize = pt->sizevarinfo;
985 checklimit(fs, fs->nlocvars, 32767, "local variables"); 986 checklimit(fs, fs->nlocvars, 32767, "local variables");
986 lj_mem_growvec(fs->L, pt->varinfo, pt->sizevarinfo, 32767, VarInfo); 987 lj_mem_growvec(fs->L, varinfo, pt->sizevarinfo, 32767, VarInfo);
987 while (oldsize < pt->sizevarinfo) pt->varinfo[oldsize++].name = NULL; 988 setmref(pt->varinfo, varinfo);
989 while (oldsize < pt->sizevarinfo) setgcrefnull(varinfo[oldsize++].name);
988 } 990 }
989 pt->varinfo[fs->nlocvars].name = name; 991 setgcref(varinfo[fs->nlocvars].name, obj2gco(name));
990 lj_gc_objbarrier(ls->L, pt, name); 992 lj_gc_objbarrier(ls->L, pt, name);
991 return fs->nlocvars++; 993 return fs->nlocvars++;
992} 994}
@@ -1048,7 +1050,7 @@ static BCReg searchvar(FuncState *fs, GCstr *n)
1048{ 1050{
1049 int i; 1051 int i;
1050 for (i = fs->nactvar-1; i >= 0; i--) { 1052 for (i = fs->nactvar-1; i >= 0; i--) {
1051 if (n == getlocvar(fs, i).name) 1053 if (n == gco2str(gcref(getlocvar(fs, i).name)))
1052 return (BCReg)i; 1054 return (BCReg)i;
1053 } 1055 }
1054 return (BCReg)-1; /* Not found. */ 1056 return (BCReg)-1; /* Not found. */
@@ -1237,6 +1239,7 @@ static void close_func(LexState *ls)
1237 BCIns *bc; 1239 BCIns *bc;
1238 GCRef *uvname; 1240 GCRef *uvname;
1239 BCLine *lineinfo; 1241 BCLine *lineinfo;
1242 VarInfo *varinfo;
1240 removevars(ls, 0); 1243 removevars(ls, 0);
1241 finalret(fs, pt); 1244 finalret(fs, pt);
1242 bc = proto_bc(pt); 1245 bc = proto_bc(pt);
@@ -1249,7 +1252,9 @@ static void close_func(LexState *ls)
1249 lj_mem_reallocvec(L, lineinfo, pt->sizelineinfo, fs->pc, BCLine); 1252 lj_mem_reallocvec(L, lineinfo, pt->sizelineinfo, fs->pc, BCLine);
1250 setmref(pt->lineinfo, lineinfo); 1253 setmref(pt->lineinfo, lineinfo);
1251 pt->sizelineinfo = fs->pc; 1254 pt->sizelineinfo = fs->pc;
1252 lj_mem_reallocvec(L, pt->varinfo, pt->sizevarinfo, fs->nlocvars, VarInfo); 1255 varinfo = proto_varinfo(pt);
1256 lj_mem_reallocvec(L, varinfo, pt->sizevarinfo, fs->nlocvars, VarInfo);
1257 setmref(pt->varinfo, varinfo);
1253 pt->sizevarinfo = fs->nlocvars; 1258 pt->sizevarinfo = fs->nlocvars;
1254 uvname = mref(pt->uvname, GCRef); 1259 uvname = mref(pt->uvname, GCRef);
1255 lj_mem_reallocvec(L, uvname, pt->sizeuvname, fs->nuv, GCRef); 1260 lj_mem_reallocvec(L, uvname, pt->sizeuvname, fs->nuv, GCRef);