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, |
