diff options
author | Mike Pall <mike> | 2010-02-05 00:52:21 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2010-02-05 00:52:21 +0100 |
commit | d7789821208336a7fe6e0b6d706b6b4844e6fa9e (patch) | |
tree | f6b3c28815c0dec1164ec851d10f76cf8cb62102 /src | |
parent | c8d55e850624bc237532fd103d1591b64d291081 (diff) | |
download | luajit-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.c | 4 | ||||
-rw-r--r-- | src/lj_api.c | 2 | ||||
-rw-r--r-- | src/lj_err.c | 9 | ||||
-rw-r--r-- | src/lj_func.c | 12 | ||||
-rw-r--r-- | src/lj_gc.c | 10 | ||||
-rw-r--r-- | src/lj_gdbjit.c | 2 | ||||
-rw-r--r-- | src/lj_obj.h | 11 | ||||
-rw-r--r-- | src/lj_parse.c | 23 |
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 | ||
218 | void lj_err_pushloc(lua_State *L, GCproto *pt, BCPos pc) | 219 | void 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) | |||
1176 | static void collectuv(FuncState *fs, GCproto *pt) | 1179 | static 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, |