aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2010-02-05 00:52:21 +0100
committerMike Pall <mike>2010-02-05 00:52:21 +0100
commitd7789821208336a7fe6e0b6d706b6b4844e6fa9e (patch)
treef6b3c28815c0dec1164ec851d10f76cf8cb62102 /src
parentc8d55e850624bc237532fd103d1591b64d291081 (diff)
downloadluajit-d7789821208336a7fe6e0b6d706b6b4844e6fa9e.tar.gz
luajit-d7789821208336a7fe6e0b6d706b6b4844e6fa9e.tar.bz2
luajit-d7789821208336a7fe6e0b6d706b6b4844e6fa9e.zip
32/64 bit memory ref cleanup, part 2: GCproto ->uvname and ->chunkname.
Diffstat (limited to 'src')
-rw-r--r--src/lib_jit.c4
-rw-r--r--src/lj_api.c2
-rw-r--r--src/lj_err.c9
-rw-r--r--src/lj_func.c12
-rw-r--r--src/lj_gc.c10
-rw-r--r--src/lj_gdbjit.c2
-rw-r--r--src/lj_obj.h11
-rw-r--r--src/lj_parse.c23
8 files changed, 43 insertions, 30 deletions
diff --git a/src/lib_jit.c b/src/lib_jit.c
index ef6fd465..52368a8b 100644
--- a/src/lib_jit.c
+++ b/src/lib_jit.c
@@ -188,7 +188,7 @@ LJLIB_CF(jit_util_funcinfo)
188 setintfield(L, t, "currentline", pt->lineinfo ? pt->lineinfo[pc-1] : 0); 188 setintfield(L, t, "currentline", pt->lineinfo ? pt->lineinfo[pc-1] : 0);
189 lua_pushboolean(L, (pt->flags & PROTO_IS_VARARG)); 189 lua_pushboolean(L, (pt->flags & PROTO_IS_VARARG));
190 lua_setfield(L, -2, "isvararg"); 190 lua_setfield(L, -2, "isvararg");
191 setstrV(L, L->top++, pt->chunkname); 191 setstrV(L, L->top++, proto_chunkname(pt));
192 lua_setfield(L, -2, "source"); 192 lua_setfield(L, -2, "source");
193 lj_err_pushloc(L, pt, pc); 193 lj_err_pushloc(L, pt, pc);
194 lua_setfield(L, -2, "loc"); 194 lua_setfield(L, -2, "loc");
@@ -246,7 +246,7 @@ LJLIB_CF(jit_util_funcuvname)
246 GCproto *pt = check_Lproto(L, 0); 246 GCproto *pt = check_Lproto(L, 0);
247 uint32_t idx = (uint32_t)lj_lib_checkint(L, 2); 247 uint32_t idx = (uint32_t)lj_lib_checkint(L, 2);
248 if (idx < pt->sizeuvname) { 248 if (idx < pt->sizeuvname) {
249 setstrV(L, L->top-1, pt->uvname[idx]); 249 setstrV(L, L->top-1, gco2str(proto_uvname(pt, idx)));
250 return 1; 250 return 1;
251 } 251 }
252 return 0; 252 return 0;
diff --git a/src/lj_api.c b/src/lj_api.c
index a2d29723..8216c395 100644
--- a/src/lj_api.c
+++ b/src/lj_api.c
@@ -813,7 +813,7 @@ static const char *aux_upvalue(cTValue *f, uint32_t idx, TValue **val)
813 GCproto *pt = funcproto(fn); 813 GCproto *pt = funcproto(fn);
814 if (idx < pt->sizeuvname) { 814 if (idx < pt->sizeuvname) {
815 *val = uvval(&gcref(fn->l.uvptr[idx])->uv); 815 *val = uvval(&gcref(fn->l.uvptr[idx])->uv);
816 return strdata(pt->uvname[idx]); 816 return strdata(gco2str(proto_uvname(pt, idx)));
817 } 817 }
818 } else { 818 } else {
819 if (idx < fn->c.nupvalues) { 819 if (idx < fn->c.nupvalues) {
diff --git a/src/lj_err.c b/src/lj_err.c
index d1e705ea..0c54cf62 100644
--- a/src/lj_err.c
+++ b/src/lj_err.c
@@ -176,7 +176,8 @@ restart:
176 } 176 }
177 return "field"; 177 return "field";
178 case BC_UGET: 178 case BC_UGET:
179 *name = pt->uvname ? strdata(pt->uvname[bc_d(ins)]) : "?"; 179 *name = mref(pt->uvname, GCRef) ?
180 strdata(gco2str(proto_uvname(pt,bc_d(ins)))) : "?";
180 return "upvalue"; 181 return "upvalue";
181 default: 182 default:
182 return NULL; 183 return NULL;
@@ -217,7 +218,7 @@ static const char *getfuncname(lua_State *L, TValue *frame, const char **name)
217 218
218void lj_err_pushloc(lua_State *L, GCproto *pt, BCPos pc) 219void lj_err_pushloc(lua_State *L, GCproto *pt, BCPos pc)
219{ 220{
220 GCstr *name = pt->chunkname; 221 GCstr *name = proto_chunkname(pt);
221 if (name) { 222 if (name) {
222 const char *s = strdata(name); 223 const char *s = strdata(name);
223 MSize i, len = name->len; 224 MSize i, len = name->len;
@@ -344,7 +345,7 @@ LUA_API int lua_getinfo(lua_State *L, const char *what, lua_Debug *ar)
344 switch (*what) { 345 switch (*what) {
345 case 'S': 346 case 'S':
346 if (isluafunc(fn)) { 347 if (isluafunc(fn)) {
347 ar->source = strdata(funcproto(fn)->chunkname); 348 ar->source = strdata(proto_chunkname(funcproto(fn)));
348 ar->linedefined = cast_int(funcproto(fn)->linedefined); 349 ar->linedefined = cast_int(funcproto(fn)->linedefined);
349 ar->lastlinedefined = cast_int(funcproto(fn)->lastlinedefined); 350 ar->lastlinedefined = cast_int(funcproto(fn)->lastlinedefined);
350 ar->what = (ar->linedefined == 0) ? "main" : "Lua"; 351 ar->what = (ar->linedefined == 0) ? "main" : "Lua";
@@ -819,7 +820,7 @@ LJ_NOINLINE static void err_loc(lua_State *L, const char *msg,
819 if (isluafunc(fn)) { 820 if (isluafunc(fn)) {
820 char buff[LUA_IDSIZE]; 821 char buff[LUA_IDSIZE];
821 BCLine line = currentline(L, fn, nextframe); 822 BCLine line = currentline(L, fn, nextframe);
822 err_chunkid(buff, strdata(funcproto(fn)->chunkname)); 823 err_chunkid(buff, strdata(proto_chunkname(funcproto(fn))));
823 lj_str_pushf(L, "%s:%d: %s", buff, line, msg); 824 lj_str_pushf(L, "%s:%d: %s", buff, line, msg);
824 return; 825 return;
825 } 826 }
diff --git a/src/lj_func.c b/src/lj_func.c
index 27a8322f..284bd3b3 100644
--- a/src/lj_func.c
+++ b/src/lj_func.c
@@ -28,7 +28,7 @@ GCproto *lj_func_newproto(lua_State *L)
28 pt->trace = 0; 28 pt->trace = 0;
29 setmref(pt->k, NULL); 29 setmref(pt->k, NULL);
30 setmref(pt->bc, NULL); 30 setmref(pt->bc, NULL);
31 pt->uv = NULL; 31 setmref(pt->uv, NULL);
32 pt->sizebc = 0; 32 pt->sizebc = 0;
33 pt->sizekgc = 0; 33 pt->sizekgc = 0;
34 pt->sizekn = 0; 34 pt->sizekn = 0;
@@ -39,8 +39,8 @@ GCproto *lj_func_newproto(lua_State *L)
39 pt->lastlinedefined = 0; 39 pt->lastlinedefined = 0;
40 pt->lineinfo = NULL; 40 pt->lineinfo = NULL;
41 pt->varinfo = NULL; 41 pt->varinfo = NULL;
42 pt->uvname = NULL; 42 setmref(pt->uvname, NULL);
43 pt->chunkname = NULL; 43 setgcrefnull(pt->chunkname);
44 return pt; 44 return pt;
45} 45}
46 46
@@ -51,10 +51,10 @@ void LJ_FASTCALL lj_func_freeproto(global_State *g, GCproto *pt)
51 pt->sizekn*(MSize)sizeof(lua_Number); 51 pt->sizekn*(MSize)sizeof(lua_Number);
52 lj_mem_free(g, mref(pt->k, GCRef) - nkgc, sizek); 52 lj_mem_free(g, mref(pt->k, GCRef) - nkgc, sizek);
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, pt->uv, pt->sizeuv, uint16_t); 54 lj_mem_freevec(g, proto_uv(pt), pt->sizeuv, uint16_t);
55 lj_mem_freevec(g, pt->lineinfo, pt->sizelineinfo, int32_t); 55 lj_mem_freevec(g, pt->lineinfo, pt->sizelineinfo, int32_t);
56 lj_mem_freevec(g, pt->varinfo, pt->sizevarinfo, struct VarInfo); 56 lj_mem_freevec(g, pt->varinfo, pt->sizevarinfo, struct VarInfo);
57 lj_mem_freevec(g, pt->uvname, pt->sizeuvname, GCstr *); 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);
60} 60}
@@ -169,7 +169,7 @@ GCfunc *lj_func_newL_gc(lua_State *L, GCproto *pt, GCfuncL *parent)
169 nuv = fn->l.nupvalues; 169 nuv = fn->l.nupvalues;
170 base = L->base; 170 base = L->base;
171 for (i = 0; i < nuv; i++) { 171 for (i = 0; i < nuv; i++) {
172 uint32_t v = pt->uv[i]; 172 uint32_t v = proto_uv(pt)[i];
173 GCupval *uv; 173 GCupval *uv;
174 if ((v & 0x8000)) { 174 if ((v & 0x8000)) {
175 uv = func_finduv(L, base + (v & 0xff)); 175 uv = func_finduv(L, base + (v & 0xff));
diff --git a/src/lj_gc.c b/src/lj_gc.c
index 9f0ff2b6..3c1b847a 100644
--- a/src/lj_gc.c
+++ b/src/lj_gc.c
@@ -251,13 +251,13 @@ static void gc_traverse_proto(global_State *g, GCproto *pt)
251 } 251 }
252#endif 252#endif
253 /* GC during prototype creation could cause NULL fields. */ 253 /* GC during prototype creation could cause NULL fields. */
254 if (pt->chunkname) 254 if (gcref(pt->chunkname))
255 gc_mark_str(pt->chunkname); 255 gc_mark_str(proto_chunkname(pt));
256 for (i = -(ptrdiff_t)pt->sizekgc; i < 0; i++) /* Mark collectable consts. */ 256 for (i = -(ptrdiff_t)pt->sizekgc; i < 0; i++) /* Mark collectable consts. */
257 gc_markobj(g, proto_kgc(pt, i)); 257 gc_markobj(g, proto_kgc(pt, i));
258 for (i = 0; i < (ptrdiff_t)pt->sizeuvname; i++) /* Mark upvalue names. */ 258 for (i = 0; i < (ptrdiff_t)pt->sizeuvname; i++) /* Mark upvalue names. */
259 if (pt->uvname[i]) 259 if (proto_uvname(pt, i))
260 gc_mark_str(pt->uvname[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 (pt->varinfo[i].name)
263 gc_mark_str(pt->varinfo[i].name); 263 gc_mark_str(pt->varinfo[i].name);
@@ -332,7 +332,7 @@ static size_t propagatemark(global_State *g)
332 sizeof(uint16_t) * pt->sizeuv + 332 sizeof(uint16_t) * pt->sizeuv +
333 sizeof(int32_t) * pt->sizelineinfo + 333 sizeof(int32_t) * pt->sizelineinfo +
334 sizeof(VarInfo) * pt->sizevarinfo + 334 sizeof(VarInfo) * pt->sizevarinfo +
335 sizeof(GCstr *) * pt->sizeuvname; 335 sizeof(GCRef) * pt->sizeuvname;
336 } else { 336 } else {
337 lua_State *th = gco2th(o); 337 lua_State *th = gco2th(o);
338 setgcrefr(th->gclist, g->gc.grayagain); 338 setgcrefr(th->gclist, g->gc.grayagain);
diff --git a/src/lj_gdbjit.c b/src/lj_gdbjit.c
index 6fb8a1d3..af31b277 100644
--- a/src/lj_gdbjit.c
+++ b/src/lj_gdbjit.c
@@ -709,7 +709,7 @@ void lj_gdbjit_addtrace(jit_State *J, Trace *T, TraceNo traceno)
709 ctx.lineno = pt->lineinfo ? pt->lineinfo[proto_bcpos(pt, startpc)] : 0; 709 ctx.lineno = pt->lineinfo ? pt->lineinfo[proto_bcpos(pt, startpc)] : 0;
710 else 710 else
711 ctx.lineno = pt->linedefined; 711 ctx.lineno = pt->linedefined;
712 ctx.filename = strdata(pt->chunkname); 712 ctx.filename = strdata(proto_chunkname(pt));
713 if (*ctx.filename == '@' || *ctx.filename == '=') 713 if (*ctx.filename == '@' || *ctx.filename == '=')
714 ctx.filename++; 714 ctx.filename++;
715 else 715 else
diff --git a/src/lj_obj.h b/src/lj_obj.h
index 22b69c60..164ec853 100644
--- a/src/lj_obj.h
+++ b/src/lj_obj.h
@@ -352,7 +352,7 @@ typedef struct GCproto {
352 GCRef gclist; 352 GCRef gclist;
353 MRef k; /* Split constant array (points to the middle). */ 353 MRef k; /* Split constant array (points to the middle). */
354 MRef bc; /* Array of bytecode instructions. */ 354 MRef bc; /* Array of bytecode instructions. */
355 uint16_t *uv; /* Upvalue list. local slot|0x8000 or parent uv idx. */ 355 MRef uv; /* Upvalue list. local slot|0x8000 or parent uv idx. */
356 MSize sizekgc; /* Number of collectable constants. */ 356 MSize sizekgc; /* Number of collectable constants. */
357 MSize sizekn; /* Number of lua_Number constants. */ 357 MSize sizekn; /* Number of lua_Number constants. */
358 uint8_t sizeuv; /* Number of upvalues. */ 358 uint8_t sizeuv; /* Number of upvalues. */
@@ -366,8 +366,8 @@ typedef struct GCproto {
366 BCLine lastlinedefined; /* Last line of the function definition. */ 366 BCLine lastlinedefined; /* Last line of the function definition. */
367 BCLine *lineinfo; /* Map from bytecode instructions to source lines. */ 367 BCLine *lineinfo; /* Map from bytecode instructions to source lines. */
368 struct VarInfo *varinfo; /* Names and extents of local variables. */ 368 struct VarInfo *varinfo; /* Names and extents of local variables. */
369 GCstr **uvname; /* Upvalue names. */ 369 MRef uvname; /* Array of upvalue names (GCRef of GCstr). */
370 GCstr *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;
372 372
373#define PROTO_IS_VARARG 0x01 373#define PROTO_IS_VARARG 0x01
@@ -388,6 +388,11 @@ typedef struct GCproto {
388#define proto_insptr(pt, pos) \ 388#define proto_insptr(pt, pos) \
389 check_exp((uintptr_t)(pos) < (pt)->sizebc, &proto_bc(pt)[(pos)]) 389 check_exp((uintptr_t)(pos) < (pt)->sizebc, &proto_bc(pt)[(pos)])
390#define proto_bcpos(pt, pc) ((BCPos)((pc) - proto_bc(pt))) 390#define proto_bcpos(pt, pc) ((BCPos)((pc) - proto_bc(pt)))
391#define proto_uv(pt) (mref((pt)->uv, uint16_t))
392#define proto_uvname(pt, idx) \
393 check_exp((uintptr_t)(idx) < (pt)->sizeuvname, \
394 gcref(mref((pt)->uvname, GCRef)[(idx)]))
395#define proto_chunkname(pt) (gco2str(gcref((pt)->chunkname)))
391 396
392/* -- Upvalue object ------------------------------------------------------ */ 397/* -- Upvalue object ------------------------------------------------------ */
393 398
diff --git a/src/lj_parse.c b/src/lj_parse.c
index 1a596d72..864f9e20 100644
--- a/src/lj_parse.c
+++ b/src/lj_parse.c
@@ -1017,20 +1017,23 @@ static uint32_t indexupvalue(FuncState *fs, GCstr *name, ExpDesc *v)
1017{ 1017{
1018 uint32_t i; 1018 uint32_t i;
1019 GCproto *pt = fs->pt; 1019 GCproto *pt = fs->pt;
1020 GCRef *uvname;
1020 for (i = 0; i < fs->nuv; i++) { 1021 for (i = 0; i < fs->nuv; i++) {
1021 if (fs->upvalues[i].info == v->u.s.info && fs->upvalues[i].k == v->k) { 1022 if (fs->upvalues[i].info == v->u.s.info && fs->upvalues[i].k == v->k) {
1022 lua_assert(pt->uvname[i] == name); 1023 lua_assert(gco2str(proto_uvname(pt, i)) == name);
1023 return i; 1024 return i;
1024 } 1025 }
1025 } 1026 }
1026 /* Not found, create a new upvalue for this name. */ 1027 /* Not found, create a new upvalue for this name. */
1028 uvname = mref(pt->uvname, GCRef);
1027 if (LJ_UNLIKELY(fs->nuv >= pt->sizeuvname)) { 1029 if (LJ_UNLIKELY(fs->nuv >= pt->sizeuvname)) {
1028 MSize oldsize = pt->sizeuvname; 1030 MSize oldsize = pt->sizeuvname;
1029 checklimit(fs, fs->nuv, LJ_MAX_UPVAL, "upvalues"); 1031 checklimit(fs, fs->nuv, LJ_MAX_UPVAL, "upvalues");
1030 lj_mem_growvec(fs->L, pt->uvname, pt->sizeuvname, LJ_MAX_UPVAL, GCstr *); 1032 lj_mem_growvec(fs->L, uvname, pt->sizeuvname, LJ_MAX_UPVAL, GCRef);
1031 while (oldsize < pt->sizeuvname) pt->uvname[oldsize++] = NULL; 1033 setmref(pt->uvname, uvname);
1034 while (oldsize < pt->sizeuvname) setgcrefnull(uvname[oldsize++]);
1032 } 1035 }
1033 pt->uvname[fs->nuv] = name; 1036 setgcref(uvname[fs->nuv], obj2gco(name));
1034 lj_gc_objbarrier(fs->L, pt, name); 1037 lj_gc_objbarrier(fs->L, pt, name);
1035 lua_assert(v->k == VLOCAL || v->k == VUPVAL); 1038 lua_assert(v->k == VLOCAL || v->k == VUPVAL);
1036 fs->upvalues[fs->nuv].k = cast_byte(v->k); 1039 fs->upvalues[fs->nuv].k = cast_byte(v->k);
@@ -1123,7 +1126,7 @@ static void open_func(LexState *ls, FuncState *fs)
1123 fs->nactvar = 0; 1126 fs->nactvar = 0;
1124 fs->nuv = 0; 1127 fs->nuv = 0;
1125 fs->bl = NULL; 1128 fs->bl = NULL;
1126 pt->chunkname = ls->chunkname; 1129 setgcref(pt->chunkname, obj2gco(ls->chunkname));
1127 pt->framesize = 2; /* registers 0/1 are always valid */ 1130 pt->framesize = 2; /* registers 0/1 are always valid */
1128 fs->kt = lj_tab_new(L, 0, 0); 1131 fs->kt = lj_tab_new(L, 0, 0);
1129 /* anchor table of constants and prototype (to avoid being collected) */ 1132 /* anchor table of constants and prototype (to avoid being collected) */
@@ -1176,12 +1179,13 @@ static void collectk(FuncState *fs, GCproto *pt)
1176static void collectuv(FuncState *fs, GCproto *pt) 1179static void collectuv(FuncState *fs, GCproto *pt)
1177{ 1180{
1178 uint32_t i; 1181 uint32_t i;
1179 pt->uv = lj_mem_newvec(fs->L, fs->nuv, uint16_t); 1182 uint16_t *uv = lj_mem_newvec(fs->L, fs->nuv, uint16_t);
1183 setmref(pt->uv, uv);
1180 pt->sizeuv = fs->nuv; 1184 pt->sizeuv = fs->nuv;
1181 for (i = 0; i < pt->sizeuv; i++) { 1185 for (i = 0; i < pt->sizeuv; i++) {
1182 uint32_t v = fs->upvalues[i].info; 1186 uint32_t v = fs->upvalues[i].info;
1183 if (fs->upvalues[i].k == VLOCAL) v |= 0x8000; 1187 if (fs->upvalues[i].k == VLOCAL) v |= 0x8000;
1184 pt->uv[i] = (uint16_t)v; 1188 uv[i] = (uint16_t)v;
1185 } 1189 }
1186} 1190}
1187 1191
@@ -1228,6 +1232,7 @@ static void close_func(LexState *ls)
1228 FuncState *fs = ls->fs; 1232 FuncState *fs = ls->fs;
1229 GCproto *pt = fs->pt; 1233 GCproto *pt = fs->pt;
1230 BCIns *bc; 1234 BCIns *bc;
1235 GCRef *uvname;
1231 removevars(ls, 0); 1236 removevars(ls, 0);
1232 finalret(fs, pt); 1237 finalret(fs, pt);
1233 bc = proto_bc(pt); 1238 bc = proto_bc(pt);
@@ -1240,7 +1245,9 @@ static void close_func(LexState *ls)
1240 pt->sizelineinfo = fs->pc; 1245 pt->sizelineinfo = fs->pc;
1241 lj_mem_reallocvec(L, pt->varinfo, pt->sizevarinfo, fs->nlocvars, VarInfo); 1246 lj_mem_reallocvec(L, pt->varinfo, pt->sizevarinfo, fs->nlocvars, VarInfo);
1242 pt->sizevarinfo = fs->nlocvars; 1247 pt->sizevarinfo = fs->nlocvars;
1243 lj_mem_reallocvec(L, pt->uvname, pt->sizeuvname, fs->nuv, GCstr *); 1248 uvname = mref(pt->uvname, GCRef);
1249 lj_mem_reallocvec(L, uvname, pt->sizeuvname, fs->nuv, GCRef);
1250 setmref(pt->uvname, uvname);
1244 pt->sizeuvname = fs->nuv; 1251 pt->sizeuvname = fs->nuv;
1245 lua_assert(fs->bl == NULL); 1252 lua_assert(fs->bl == NULL);
1246 lj_vmevent_send(L, BC, 1253 lj_vmevent_send(L, BC,