diff options
author | Mike Pall <mike> | 2010-02-05 01:35:38 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2010-02-05 01:35:38 +0100 |
commit | a0914c409b615af85eafb7e2787be628483ffde2 (patch) | |
tree | cce46eed095637c4d4873ce38c4dbd952f7851d3 | |
parent | 8dcc4364cf2c56c9bdd8047fd0dceb4b70f727d2 (diff) | |
download | luajit-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.c | 6 | ||||
-rw-r--r-- | src/lj_func.c | 4 | ||||
-rw-r--r-- | src/lj_gc.c | 4 | ||||
-rw-r--r-- | src/lj_obj.h | 5 | ||||
-rw-r--r-- | 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) | |||
138 | static const char *getvarname(const GCproto *pt, BCPos pc, BCReg slot) | 138 | static 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 | ||
341 | typedef struct VarInfo { | 341 | typedef 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 | ||
979 | static BCReg registerlocalvar(LexState *ls, GCstr *name) | 979 | static 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); |