diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib_jit.c | 6 | ||||
| -rw-r--r-- | src/lj_dispatch.c | 6 | ||||
| -rw-r--r-- | src/lj_err.c | 14 | ||||
| -rw-r--r-- | src/lj_func.c | 8 | ||||
| -rw-r--r-- | src/lj_gc.c | 2 | ||||
| -rw-r--r-- | src/lj_gdbjit.c | 5 | ||||
| -rw-r--r-- | src/lj_obj.h | 22 | ||||
| -rw-r--r-- | src/lj_parse.c | 63 | ||||
| -rw-r--r-- | src/lj_record.c | 14 | ||||
| -rw-r--r-- | src/lj_trace.c | 10 |
10 files changed, 84 insertions, 66 deletions
diff --git a/src/lib_jit.c b/src/lib_jit.c index 0728fc3a..ef6fd465 100644 --- a/src/lib_jit.c +++ b/src/lib_jit.c | |||
| @@ -209,7 +209,7 @@ LJLIB_CF(jit_util_funcbc) | |||
| 209 | GCproto *pt = check_Lproto(L, 0); | 209 | GCproto *pt = check_Lproto(L, 0); |
| 210 | BCPos pc = (BCPos)lj_lib_checkint(L, 2) - 1; | 210 | BCPos pc = (BCPos)lj_lib_checkint(L, 2) - 1; |
| 211 | if (pc < pt->sizebc) { | 211 | if (pc < pt->sizebc) { |
| 212 | BCIns ins = pt->bc[pc]; | 212 | BCIns ins = proto_ins(pt, pc); |
| 213 | BCOp op = bc_op(ins); | 213 | BCOp op = bc_op(ins); |
| 214 | lua_assert(op < BC__MAX); | 214 | lua_assert(op < BC__MAX); |
| 215 | setintV(L->top, ins); | 215 | setintV(L->top, ins); |
| @@ -227,12 +227,12 @@ LJLIB_CF(jit_util_funck) | |||
| 227 | ptrdiff_t idx = (ptrdiff_t)lj_lib_checkint(L, 2); | 227 | ptrdiff_t idx = (ptrdiff_t)lj_lib_checkint(L, 2); |
| 228 | if (idx >= 0) { | 228 | if (idx >= 0) { |
| 229 | if (idx < (ptrdiff_t)pt->sizekn) { | 229 | if (idx < (ptrdiff_t)pt->sizekn) { |
| 230 | setnumV(L->top-1, pt->k.n[idx]); | 230 | setnumV(L->top-1, proto_knum(pt, idx)); |
| 231 | return 1; | 231 | return 1; |
| 232 | } | 232 | } |
| 233 | } else { | 233 | } else { |
| 234 | if (~idx < (ptrdiff_t)pt->sizekgc) { | 234 | if (~idx < (ptrdiff_t)pt->sizekgc) { |
| 235 | GCobj *gc = gcref(pt->k.gc[idx]); | 235 | GCobj *gc = proto_kgc(pt, idx); |
| 236 | setgcV(L, L->top-1, &gc->gch, ~gc->gch.gct); | 236 | setgcV(L, L->top-1, &gc->gch, ~gc->gch.gct); |
| 237 | return 1; | 237 | return 1; |
| 238 | } | 238 | } |
diff --git a/src/lj_dispatch.c b/src/lj_dispatch.c index a94afea9..09cb2f5d 100644 --- a/src/lj_dispatch.c +++ b/src/lj_dispatch.c | |||
| @@ -117,7 +117,7 @@ static void setptmode_all(global_State *g, GCproto *pt, int mode) | |||
| 117 | { | 117 | { |
| 118 | ptrdiff_t i; | 118 | ptrdiff_t i; |
| 119 | for (i = -(ptrdiff_t)pt->sizekgc; i < 0; i++) { | 119 | for (i = -(ptrdiff_t)pt->sizekgc; i < 0; i++) { |
| 120 | GCobj *o = gcref(pt->k.gc[i]); | 120 | GCobj *o = proto_kgc(pt, i); |
| 121 | if (o->gch.gct == ~LJ_TPROTO) { | 121 | if (o->gch.gct == ~LJ_TPROTO) { |
| 122 | setptmode(g, gco2pt(o), mode); | 122 | setptmode(g, gco2pt(o), mode); |
| 123 | setptmode_all(g, gco2pt(o), mode); | 123 | setptmode_all(g, gco2pt(o), mode); |
| @@ -302,8 +302,8 @@ void LJ_FASTCALL lj_dispatch_ins(lua_State *L, const BCIns *pc) | |||
| 302 | callhook(L, LUA_HOOKCOUNT, -1); | 302 | callhook(L, LUA_HOOKCOUNT, -1); |
| 303 | } | 303 | } |
| 304 | if ((g->hookmask & LUA_MASKLINE) && pt->lineinfo) { | 304 | if ((g->hookmask & LUA_MASKLINE) && pt->lineinfo) { |
| 305 | BCPos npc = (BCPos)(pc - pt->bc)-1; | 305 | BCPos npc = proto_bcpos(pt, pc) - 1; |
| 306 | BCPos opc = (BCPos)(oldpc - pt->bc)-1; | 306 | BCPos opc = proto_bcpos(pt, oldpc) - 1; |
| 307 | BCLine line = pt->lineinfo[npc]; | 307 | BCLine line = pt->lineinfo[npc]; |
| 308 | if (npc == 0 || pc <= oldpc || | 308 | if (npc == 0 || pc <= oldpc || |
| 309 | opc >= pt->sizebc || line != pt->lineinfo[opc]) { | 309 | opc >= pt->sizebc || line != pt->lineinfo[opc]) { |
diff --git a/src/lj_err.c b/src/lj_err.c index 56ca0c37..d1e705ea 100644 --- a/src/lj_err.c +++ b/src/lj_err.c | |||
| @@ -120,7 +120,7 @@ static BCPos currentpc(lua_State *L, GCfunc *fn, cTValue *nextframe) | |||
| 120 | ins = cframe_pc(cf); | 120 | ins = cframe_pc(cf); |
| 121 | } | 121 | } |
| 122 | } | 122 | } |
| 123 | return (BCPos)((ins - funcproto(fn)->bc) - 1); | 123 | return proto_bcpos(funcproto(fn), ins) - 1; |
| 124 | } | 124 | } |
| 125 | 125 | ||
| 126 | static BCLine currentline(lua_State *L, GCfunc *fn, cTValue *nextframe) | 126 | static BCLine currentline(lua_State *L, GCfunc *fn, cTValue *nextframe) |
| @@ -149,9 +149,9 @@ static const char *getobjname(GCproto *pt, const BCIns *ip, BCReg slot, | |||
| 149 | { | 149 | { |
| 150 | const char *lname; | 150 | const char *lname; |
| 151 | restart: | 151 | restart: |
| 152 | lname = getvarname(pt, (BCPos)(ip - pt->bc), slot); | 152 | lname = getvarname(pt, proto_bcpos(pt, ip), slot); |
| 153 | if (lname != NULL) { *name = lname; return "local"; } | 153 | if (lname != NULL) { *name = lname; return "local"; } |
| 154 | while (--ip >= pt->bc) { | 154 | while (--ip >= proto_bc(pt)) { |
| 155 | BCIns ins = *ip; | 155 | BCIns ins = *ip; |
| 156 | BCOp op = bc_op(ins); | 156 | BCOp op = bc_op(ins); |
| 157 | BCReg ra = bc_a(ins); | 157 | BCReg ra = bc_a(ins); |
| @@ -164,11 +164,11 @@ restart: | |||
| 164 | if (ra == slot) { slot = bc_d(ins); goto restart; } | 164 | if (ra == slot) { slot = bc_d(ins); goto restart; } |
| 165 | break; | 165 | break; |
| 166 | case BC_GGET: | 166 | case BC_GGET: |
| 167 | *name = strdata(gco2str(gcref(pt->k.gc[~(ptrdiff_t)bc_d(ins)]))); | 167 | *name = strdata(gco2str(proto_kgc(pt, ~(ptrdiff_t)bc_d(ins)))); |
| 168 | return "global"; | 168 | return "global"; |
| 169 | case BC_TGETS: | 169 | case BC_TGETS: |
| 170 | *name = strdata(gco2str(gcref(pt->k.gc[~(ptrdiff_t)bc_c(ins)]))); | 170 | *name = strdata(gco2str(proto_kgc(pt, ~(ptrdiff_t)bc_c(ins)))); |
| 171 | if (ip > pt->bc) { | 171 | if (ip > proto_bc(pt)) { |
| 172 | BCIns insp = ip[-1]; | 172 | BCIns insp = ip[-1]; |
| 173 | if (bc_op(insp) == BC_MOV && bc_a(insp) == ra+1 && | 173 | if (bc_op(insp) == BC_MOV && bc_a(insp) == ra+1 && |
| 174 | bc_d(insp) == bc_b(ins)) | 174 | bc_d(insp) == bc_b(ins)) |
| @@ -201,7 +201,7 @@ static const char *getfuncname(lua_State *L, TValue *frame, const char **name) | |||
| 201 | if (pc == ~(BCPos)0) | 201 | if (pc == ~(BCPos)0) |
| 202 | return NULL; | 202 | return NULL; |
| 203 | lua_assert(pc < funcproto(fn)->sizebc); | 203 | lua_assert(pc < funcproto(fn)->sizebc); |
| 204 | ip = &funcproto(fn)->bc[pc]; | 204 | ip = &proto_bc(funcproto(fn))[pc]; |
| 205 | mm = bcmode_mm(bc_op(*ip)); | 205 | mm = bcmode_mm(bc_op(*ip)); |
| 206 | if (mm == MM_call) { | 206 | if (mm == MM_call) { |
| 207 | BCReg slot = bc_a(*ip); | 207 | BCReg slot = bc_a(*ip); |
diff --git a/src/lj_func.c b/src/lj_func.c index 078ced92..27a8322f 100644 --- a/src/lj_func.c +++ b/src/lj_func.c | |||
| @@ -26,8 +26,8 @@ GCproto *lj_func_newproto(lua_State *L) | |||
| 26 | pt->sizeuv = 0; | 26 | pt->sizeuv = 0; |
| 27 | pt->flags = 0; | 27 | pt->flags = 0; |
| 28 | pt->trace = 0; | 28 | pt->trace = 0; |
| 29 | pt->k.n = NULL; | 29 | setmref(pt->k, NULL); |
| 30 | pt->bc = NULL; | 30 | setmref(pt->bc, NULL); |
| 31 | pt->uv = NULL; | 31 | pt->uv = NULL; |
| 32 | pt->sizebc = 0; | 32 | pt->sizebc = 0; |
| 33 | pt->sizekgc = 0; | 33 | pt->sizekgc = 0; |
| @@ -49,8 +49,8 @@ void LJ_FASTCALL lj_func_freeproto(global_State *g, GCproto *pt) | |||
| 49 | MSize nkgc = round_nkgc(pt->sizekgc); | 49 | MSize nkgc = round_nkgc(pt->sizekgc); |
| 50 | MSize sizek = nkgc*(MSize)sizeof(GCRef) + | 50 | MSize sizek = nkgc*(MSize)sizeof(GCRef) + |
| 51 | pt->sizekn*(MSize)sizeof(lua_Number); | 51 | pt->sizekn*(MSize)sizeof(lua_Number); |
| 52 | lj_mem_free(g, pt->k.gc - nkgc, sizek); | 52 | lj_mem_free(g, mref(pt->k, GCRef) - nkgc, sizek); |
| 53 | lj_mem_freevec(g, pt->bc, 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, pt->uv, 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); |
diff --git a/src/lj_gc.c b/src/lj_gc.c index 764d74a8..9f0ff2b6 100644 --- a/src/lj_gc.c +++ b/src/lj_gc.c | |||
| @@ -254,7 +254,7 @@ static void gc_traverse_proto(global_State *g, GCproto *pt) | |||
| 254 | if (pt->chunkname) | 254 | if (pt->chunkname) |
| 255 | gc_mark_str(pt->chunkname); | 255 | gc_mark_str(pt->chunkname); |
| 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, gcref(pt->k.gc[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 (pt->uvname[i]) |
| 260 | gc_mark_str(pt->uvname[i]); | 260 | gc_mark_str(pt->uvname[i]); |
diff --git a/src/lj_gdbjit.c b/src/lj_gdbjit.c index 345afb51..6fb8a1d3 100644 --- a/src/lj_gdbjit.c +++ b/src/lj_gdbjit.c | |||
| @@ -705,7 +705,10 @@ void lj_gdbjit_addtrace(jit_State *J, Trace *T, TraceNo traceno) | |||
| 705 | ctx.szmcode = T->szmcode; | 705 | ctx.szmcode = T->szmcode; |
| 706 | ctx.spadjp = CFRAME_SIZE + (MSize)(parent ? J->trace[parent]->spadjust : 0); | 706 | ctx.spadjp = CFRAME_SIZE + (MSize)(parent ? J->trace[parent]->spadjust : 0); |
| 707 | ctx.spadj = CFRAME_SIZE + T->spadjust; | 707 | ctx.spadj = CFRAME_SIZE + T->spadjust; |
| 708 | ctx.lineno = pt->lineinfo ? pt->lineinfo[startpc - pt->bc] : 0; | 708 | if (startpc >= proto_bc(pt)) |
| 709 | ctx.lineno = pt->lineinfo ? pt->lineinfo[proto_bcpos(pt, startpc)] : 0; | ||
| 710 | else | ||
| 711 | ctx.lineno = pt->linedefined; | ||
| 709 | ctx.filename = strdata(pt->chunkname); | 712 | ctx.filename = strdata(pt->chunkname); |
| 710 | if (*ctx.filename == '@' || *ctx.filename == '=') | 713 | if (*ctx.filename == '@' || *ctx.filename == '=') |
| 711 | ctx.filename++; | 714 | ctx.filename++; |
diff --git a/src/lj_obj.h b/src/lj_obj.h index fbc1eff9..22b69c60 100644 --- a/src/lj_obj.h +++ b/src/lj_obj.h | |||
| @@ -335,12 +335,6 @@ enum { | |||
| 335 | 335 | ||
| 336 | /* -- Prototype object ---------------------------------------------------- */ | 336 | /* -- Prototype object ---------------------------------------------------- */ |
| 337 | 337 | ||
| 338 | /* Split constant array. Collectables are below, numbers above pointer. */ | ||
| 339 | typedef union ProtoK { | ||
| 340 | lua_Number *n; /* Numbers. */ | ||
| 341 | GCRef *gc; /* Collectable objects (strings/table/proto). */ | ||
| 342 | } ProtoK; | ||
| 343 | |||
| 344 | #define SCALE_NUM_GCO ((int32_t)sizeof(lua_Number)/sizeof(GCRef)) | 338 | #define SCALE_NUM_GCO ((int32_t)sizeof(lua_Number)/sizeof(GCRef)) |
| 345 | #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)) |
| 346 | 340 | ||
| @@ -356,8 +350,8 @@ typedef struct GCproto { | |||
| 356 | uint8_t framesize; /* Fixed frame size. */ | 350 | uint8_t framesize; /* Fixed frame size. */ |
| 357 | MSize sizebc; /* Number of bytecode instructions. */ | 351 | MSize sizebc; /* Number of bytecode instructions. */ |
| 358 | GCRef gclist; | 352 | GCRef gclist; |
| 359 | ProtoK k; /* Split constant array (points to the middle). */ | 353 | MRef k; /* Split constant array (points to the middle). */ |
| 360 | BCIns *bc; /* Array of bytecode instructions. */ | 354 | MRef bc; /* Array of bytecode instructions. */ |
| 361 | uint16_t *uv; /* Upvalue list. local slot|0x8000 or parent uv idx. */ | 355 | uint16_t *uv; /* Upvalue list. local slot|0x8000 or parent uv idx. */ |
| 362 | MSize sizekgc; /* Number of collectable constants. */ | 356 | MSize sizekgc; /* Number of collectable constants. */ |
| 363 | MSize sizekn; /* Number of lua_Number constants. */ | 357 | MSize sizekn; /* Number of lua_Number constants. */ |
| @@ -383,6 +377,18 @@ typedef struct GCproto { | |||
| 383 | #define PROTO_NO_JIT 0x10 | 377 | #define PROTO_NO_JIT 0x10 |
| 384 | #define PROTO_HAS_ILOOP 0x20 | 378 | #define PROTO_HAS_ILOOP 0x20 |
| 385 | 379 | ||
| 380 | #define proto_kgc(pt, idx) \ | ||
| 381 | check_exp((uintptr_t)(intptr_t)(idx) >= (uintptr_t)-(intptr_t)(pt)->sizekgc, \ | ||
| 382 | gcref(mref((pt)->k, GCRef)[(idx)])) | ||
| 383 | #define proto_knum(pt, idx) \ | ||
| 384 | check_exp((uintptr_t)(idx) < (pt)->sizekn, mref((pt)->k, lua_Number)[(idx)]) | ||
| 385 | #define proto_bc(pt) (mref((pt)->bc, BCIns)) | ||
| 386 | #define proto_ins(pt, pos) \ | ||
| 387 | check_exp((uintptr_t)(pos) < (pt)->sizebc, proto_bc(pt)[(pos)]) | ||
| 388 | #define proto_insptr(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))) | ||
| 391 | |||
| 386 | /* -- Upvalue object ------------------------------------------------------ */ | 392 | /* -- Upvalue object ------------------------------------------------------ */ |
| 387 | 393 | ||
| 388 | typedef struct GCupval { | 394 | typedef struct GCupval { |
diff --git a/src/lj_parse.c b/src/lj_parse.c index 8e94faa4..1a596d72 100644 --- a/src/lj_parse.c +++ b/src/lj_parse.c | |||
| @@ -152,7 +152,7 @@ LJ_NORET static void err_limit(FuncState *fs, uint32_t limit, const char *what) | |||
| 152 | 152 | ||
| 153 | static BCPos getjump(FuncState *fs, BCPos pc) | 153 | static BCPos getjump(FuncState *fs, BCPos pc) |
| 154 | { | 154 | { |
| 155 | ptrdiff_t delta = bc_j(fs->pt->bc[pc]); | 155 | ptrdiff_t delta = bc_j(proto_ins(fs->pt, pc)); |
| 156 | if ((BCPos)delta == NO_JMP) | 156 | if ((BCPos)delta == NO_JMP) |
| 157 | return NO_JMP; | 157 | return NO_JMP; |
| 158 | else | 158 | else |
| @@ -162,7 +162,7 @@ static BCPos getjump(FuncState *fs, BCPos pc) | |||
| 162 | static int need_value(FuncState *fs, BCPos list) | 162 | static int need_value(FuncState *fs, BCPos list) |
| 163 | { | 163 | { |
| 164 | for (; list != NO_JMP; list = getjump(fs, list)) { | 164 | for (; list != NO_JMP; list = getjump(fs, list)) { |
| 165 | BCOp op = bc_op(fs->pt->bc[list >= 1 ? list-1 : list]); | 165 | BCOp op = bc_op(proto_ins(fs->pt, list >= 1 ? list-1 : list)); |
| 166 | if (!(op == BC_ISTC || op == BC_ISFC)) return 1; | 166 | if (!(op == BC_ISTC || op == BC_ISFC)) return 1; |
| 167 | } | 167 | } |
| 168 | return 0; /* Not found. */ | 168 | return 0; /* Not found. */ |
| @@ -170,7 +170,7 @@ static int need_value(FuncState *fs, BCPos list) | |||
| 170 | 170 | ||
| 171 | static int patchtestreg(FuncState *fs, BCPos pc, BCReg reg) | 171 | static int patchtestreg(FuncState *fs, BCPos pc, BCReg reg) |
| 172 | { | 172 | { |
| 173 | BCIns *i = &fs->pt->bc[pc >= 1 ? pc-1 : pc]; | 173 | BCIns *i = proto_insptr(fs->pt, pc >= 1 ? pc-1 : pc); |
| 174 | BCOp op = bc_op(*i); | 174 | BCOp op = bc_op(*i); |
| 175 | if (!(op == BC_ISTC || op == BC_ISFC)) | 175 | if (!(op == BC_ISTC || op == BC_ISFC)) |
| 176 | return 0; /* cannot patch other instructions */ | 176 | return 0; /* cannot patch other instructions */ |
| @@ -191,7 +191,7 @@ static void removevalues(FuncState *fs, BCPos list) | |||
| 191 | 191 | ||
| 192 | static void fixjump(FuncState *fs, BCPos pc, BCPos dest) | 192 | static void fixjump(FuncState *fs, BCPos pc, BCPos dest) |
| 193 | { | 193 | { |
| 194 | BCIns *jmp = &fs->pt->bc[pc]; | 194 | BCIns *jmp = proto_insptr(fs->pt, pc); |
| 195 | BCPos offset = dest-(pc+1)+BCBIAS_J; | 195 | BCPos offset = dest-(pc+1)+BCBIAS_J; |
| 196 | lua_assert(dest != NO_JMP); | 196 | lua_assert(dest != NO_JMP); |
| 197 | if (offset > BCMAX_D) | 197 | if (offset > BCMAX_D) |
| @@ -251,11 +251,14 @@ static BCPos emitINS(FuncState *fs, BCIns i) | |||
| 251 | fs->jpc = NO_JMP; | 251 | fs->jpc = NO_JMP; |
| 252 | pt = fs->pt; | 252 | pt = fs->pt; |
| 253 | if (LJ_UNLIKELY(fs->pc >= pt->sizebc)) { | 253 | if (LJ_UNLIKELY(fs->pc >= pt->sizebc)) { |
| 254 | BCIns *bc; | ||
| 254 | checklimit(fs, fs->pc, LJ_MAX_BCINS, "bytecode instructions"); | 255 | checklimit(fs, fs->pc, LJ_MAX_BCINS, "bytecode instructions"); |
| 255 | lj_mem_growvec(fs->L, pt->bc, pt->sizebc, LJ_MAX_BCINS, BCIns); | 256 | bc = proto_bc(pt); |
| 257 | lj_mem_growvec(fs->L, bc, pt->sizebc, LJ_MAX_BCINS, BCIns); | ||
| 258 | setmref(pt->bc, bc); | ||
| 256 | lj_mem_growvec(fs->L, pt->lineinfo, pt->sizelineinfo, LJ_MAX_BCINS, BCLine); | 259 | lj_mem_growvec(fs->L, pt->lineinfo, pt->sizelineinfo, LJ_MAX_BCINS, BCLine); |
| 257 | } | 260 | } |
| 258 | pt->bc[fs->pc] = i; | 261 | *proto_insptr(pt, fs->pc) = i; |
| 259 | pt->lineinfo[fs->pc] = fs->ls->lastline; | 262 | pt->lineinfo[fs->pc] = fs->ls->lastline; |
| 260 | return fs->pc++; | 263 | return fs->pc++; |
| 261 | } | 264 | } |
| @@ -264,15 +267,16 @@ static BCPos emitINS(FuncState *fs, BCIns i) | |||
| 264 | #define emitAD(fs, o, a, d) emitINS(fs, BCINS_AD(o, a, d)) | 267 | #define emitAD(fs, o, a, d) emitINS(fs, BCINS_AD(o, a, d)) |
| 265 | #define emitAJ(fs, o, a, j) emitINS(fs, BCINS_AJ(o, a, j)) | 268 | #define emitAJ(fs, o, a, j) emitINS(fs, BCINS_AJ(o, a, j)) |
| 266 | 269 | ||
| 267 | #define bcptr(fs, e) (&(fs)->pt->bc[(e)->u.s.info]) | 270 | #define bcptr(fs, e) (proto_insptr((fs)->pt, (e)->u.s.info)) |
| 268 | 271 | ||
| 269 | static BCPos emit_jump(FuncState *fs) | 272 | static BCPos emit_jump(FuncState *fs) |
| 270 | { | 273 | { |
| 271 | BCPos jpc = fs->jpc; /* save list of jumps to here */ | 274 | BCPos jpc = fs->jpc; /* save list of jumps to here */ |
| 272 | BCPos j = fs->pc - 1; | 275 | BCPos j = fs->pc - 1; |
| 273 | fs->jpc = NO_JMP; | 276 | fs->jpc = NO_JMP; |
| 274 | if ((int32_t)j >= (int32_t)fs->lasttarget && bc_op(fs->pt->bc[j]) == BC_UCLO) | 277 | if ((int32_t)j >= (int32_t)fs->lasttarget && |
| 275 | setbc_j(&fs->pt->bc[j], NO_JMP); | 278 | bc_op(proto_ins(fs->pt, j)) == BC_UCLO) |
| 279 | setbc_j(proto_insptr(fs->pt, j), NO_JMP); | ||
| 276 | else | 280 | else |
| 277 | j = emitAJ(fs, BC_JMP, fs->freereg, NO_JMP); | 281 | j = emitAJ(fs, BC_JMP, fs->freereg, NO_JMP); |
| 278 | concatjumps(fs, &j, jpc); /* keep them on hold */ | 282 | concatjumps(fs, &j, jpc); /* keep them on hold */ |
| @@ -334,7 +338,7 @@ static void nilK(FuncState *fs, BCReg from, BCReg n) | |||
| 334 | BCIns *pr; | 338 | BCIns *pr; |
| 335 | if (fs->pc > fs->lasttarget) { /* no jumps to current position? */ | 339 | if (fs->pc > fs->lasttarget) { /* no jumps to current position? */ |
| 336 | BCReg pfrom, pto; | 340 | BCReg pfrom, pto; |
| 337 | pr = &fs->pt->bc[fs->pc-1]; | 341 | pr = proto_insptr(fs->pt, fs->pc-1); |
| 338 | pfrom = bc_a(*pr); | 342 | pfrom = bc_a(*pr); |
| 339 | switch (bc_op(*pr)) { | 343 | switch (bc_op(*pr)) { |
| 340 | case BC_KPRI: | 344 | case BC_KPRI: |
| @@ -1136,21 +1140,22 @@ static void collectk(FuncState *fs, GCproto *pt) | |||
| 1136 | Node *node; | 1140 | Node *node; |
| 1137 | BCReg nkgc; | 1141 | BCReg nkgc; |
| 1138 | MSize i, hmask, sizek; | 1142 | MSize i, hmask, sizek; |
| 1139 | GCRef *kstart; | 1143 | GCRef *kptr; |
| 1140 | checklimitgt(fs, fs->nkn, BCMAX_D+1, "constants"); | 1144 | checklimitgt(fs, fs->nkn, BCMAX_D+1, "constants"); |
| 1141 | checklimitgt(fs, fs->nkgc, BCMAX_D+1, "constants"); | 1145 | checklimitgt(fs, fs->nkgc, BCMAX_D+1, "constants"); |
| 1142 | nkgc = round_nkgc(fs->nkgc); | 1146 | nkgc = round_nkgc(fs->nkgc); |
| 1143 | sizek = (MSize)(nkgc*sizeof(GCRef) + fs->nkn*sizeof(lua_Number)); | 1147 | sizek = (MSize)(nkgc*sizeof(GCRef) + fs->nkn*sizeof(lua_Number)); |
| 1144 | kstart = lj_mem_newt(fs->L, sizek, GCRef); | 1148 | kptr = lj_mem_newt(fs->L, sizek, GCRef); |
| 1145 | if (nkgc) setgcrefnull(kstart[0]); /* May be uninitialized otherwise. */ | 1149 | if (nkgc) setgcrefnull(kptr[0]); /* May be uninitialized otherwise. */ |
| 1146 | pt->k.gc = kstart + nkgc; | 1150 | kptr += nkgc; |
| 1151 | setmref(pt->k, kptr); | ||
| 1147 | pt->sizekn = fs->nkn; | 1152 | pt->sizekn = fs->nkn; |
| 1148 | pt->sizekgc = fs->nkgc; | 1153 | pt->sizekgc = fs->nkgc; |
| 1149 | kt = fs->kt; | 1154 | kt = fs->kt; |
| 1150 | array = tvref(kt->array); | 1155 | array = tvref(kt->array); |
| 1151 | for (i = 0; i < kt->asize; i++) | 1156 | for (i = 0; i < kt->asize; i++) |
| 1152 | if (tvisnum(&array[i])) | 1157 | if (tvisnum(&array[i])) |
| 1153 | pt->k.n[array[i].u32.lo] = cast_num(i); | 1158 | ((lua_Number *)kptr)[array[i].u32.lo] = cast_num(i); |
| 1154 | node = noderef(kt->node); | 1159 | node = noderef(kt->node); |
| 1155 | hmask = kt->hmask; | 1160 | hmask = kt->hmask; |
| 1156 | for (i = 0; i <= hmask; i++) { | 1161 | for (i = 0; i <= hmask; i++) { |
| @@ -1158,10 +1163,10 @@ static void collectk(FuncState *fs, GCproto *pt) | |||
| 1158 | if (tvisnum(&n->val)) { | 1163 | if (tvisnum(&n->val)) { |
| 1159 | ptrdiff_t kidx = (ptrdiff_t)n->val.u32.lo; | 1164 | ptrdiff_t kidx = (ptrdiff_t)n->val.u32.lo; |
| 1160 | if (tvisnum(&n->key)) { | 1165 | if (tvisnum(&n->key)) { |
| 1161 | pt->k.n[kidx] = numV(&n->key); | 1166 | ((lua_Number *)kptr)[kidx] = numV(&n->key); |
| 1162 | } else { | 1167 | } else { |
| 1163 | GCobj *o = gcV(&n->key); | 1168 | GCobj *o = gcV(&n->key); |
| 1164 | setgcref(pt->k.gc[~kidx], o); | 1169 | setgcref(kptr[~kidx], o); |
| 1165 | lj_gc_objbarrier(fs->L, pt, o); | 1170 | lj_gc_objbarrier(fs->L, pt, o); |
| 1166 | } | 1171 | } |
| 1167 | } | 1172 | } |
| @@ -1184,7 +1189,7 @@ static void finalret(FuncState *fs, GCproto *pt) | |||
| 1184 | { | 1189 | { |
| 1185 | BCPos lastpc = fs->pc; | 1190 | BCPos lastpc = fs->pc; |
| 1186 | if (lastpc > fs->lasttarget) { | 1191 | if (lastpc > fs->lasttarget) { |
| 1187 | switch (bc_op(pt->bc[lastpc-1])) { | 1192 | switch (bc_op(proto_ins(pt, lastpc-1))) { |
| 1188 | case BC_CALLMT: case BC_CALLT: | 1193 | case BC_CALLMT: case BC_CALLT: |
| 1189 | case BC_RETM: case BC_RET: case BC_RET0: case BC_RET1: | 1194 | case BC_RETM: case BC_RET: case BC_RET0: case BC_RET1: |
| 1190 | goto suppress_return; /* already got a return */ | 1195 | goto suppress_return; /* already got a return */ |
| @@ -1195,21 +1200,22 @@ static void finalret(FuncState *fs, GCproto *pt) | |||
| 1195 | emitAJ(fs, BC_UCLO, 0, 0); | 1200 | emitAJ(fs, BC_UCLO, 0, 0); |
| 1196 | emitAD(fs, BC_RET0, 0, 1); /* final return */ | 1201 | emitAD(fs, BC_RET0, 0, 1); /* final return */ |
| 1197 | suppress_return: | 1202 | suppress_return: |
| 1198 | /* may need to fixup returns encoded before first function was created */ | 1203 | /* May need to fixup returns encoded before first function was created. */ |
| 1199 | if (fs->pt->flags & PROTO_FIXUP_RETURN) { | 1204 | if (fs->pt->flags & PROTO_FIXUP_RETURN) { |
| 1200 | BCPos pc; | 1205 | BCPos pc; |
| 1201 | for (pc = 0; pc < lastpc; pc++) { | 1206 | for (pc = 0; pc < lastpc; pc++) { |
| 1202 | BCIns i = pt->bc[pc]; | 1207 | BCIns i = proto_ins(pt, pc); |
| 1203 | BCPos offset; | 1208 | BCPos offset; |
| 1204 | switch (bc_op(i)) { | 1209 | switch (bc_op(i)) { |
| 1205 | case BC_CALLMT: case BC_CALLT: | 1210 | case BC_CALLMT: case BC_CALLT: |
| 1206 | case BC_RETM: case BC_RET: case BC_RET0: case BC_RET1: | 1211 | case BC_RETM: case BC_RET: case BC_RET0: case BC_RET1: |
| 1207 | offset = emitINS(fs, i)-(pc+1)+BCBIAS_J; /* copy return ins */ | 1212 | offset = emitINS(fs, i)-(pc+1)+BCBIAS_J; /* Copy return ins. */ |
| 1208 | if (offset > BCMAX_D) | 1213 | if (offset > BCMAX_D) |
| 1209 | err_syntax(fs->ls, LJ_ERR_XFIXUP); | 1214 | err_syntax(fs->ls, LJ_ERR_XFIXUP); |
| 1210 | pt->bc[pc] = BCINS_AD(BC_UCLO, 0, offset); /* replace w/ UCLO+branch */ | 1215 | /* Replace with UCLO plus branch. */ |
| 1216 | *proto_insptr(pt, pc) = BCINS_AD(BC_UCLO, 0, offset); | ||
| 1211 | break; | 1217 | break; |
| 1212 | case BC_UCLO: return; /* we're done */ | 1218 | case BC_UCLO: return; /* We're done. */ |
| 1213 | default: break; | 1219 | default: break; |
| 1214 | } | 1220 | } |
| 1215 | } | 1221 | } |
| @@ -1221,9 +1227,12 @@ static void close_func(LexState *ls) | |||
| 1221 | lua_State *L = ls->L; | 1227 | lua_State *L = ls->L; |
| 1222 | FuncState *fs = ls->fs; | 1228 | FuncState *fs = ls->fs; |
| 1223 | GCproto *pt = fs->pt; | 1229 | GCproto *pt = fs->pt; |
| 1230 | BCIns *bc; | ||
| 1224 | removevars(ls, 0); | 1231 | removevars(ls, 0); |
| 1225 | finalret(fs, pt); | 1232 | finalret(fs, pt); |
| 1226 | lj_mem_reallocvec(L, pt->bc, pt->sizebc, fs->pc, BCIns); | 1233 | bc = proto_bc(pt); |
| 1234 | lj_mem_reallocvec(L, bc, pt->sizebc, fs->pc, BCIns); | ||
| 1235 | setmref(pt->bc, bc); | ||
| 1227 | pt->sizebc = fs->pc; | 1236 | pt->sizebc = fs->pc; |
| 1228 | collectk(fs, pt); | 1237 | collectk(fs, pt); |
| 1229 | collectuv(fs, pt); | 1238 | collectuv(fs, pt); |
| @@ -1336,7 +1345,7 @@ static void constructor(LexState *ls, ExpDesc *e) | |||
| 1336 | BCReg kidx; | 1345 | BCReg kidx; |
| 1337 | t = lj_tab_new(fs->L, 0, 0); | 1346 | t = lj_tab_new(fs->L, 0, 0); |
| 1338 | kidx = gcK(fs, obj2gco(t), LJ_TTAB); | 1347 | kidx = gcK(fs, obj2gco(t), LJ_TTAB); |
| 1339 | fs->pt->bc[pc] = BCINS_AD(BC_TDUP, freg-1, kidx); | 1348 | *proto_insptr(fs->pt, pc) = BCINS_AD(BC_TDUP, freg-1, kidx); |
| 1340 | } | 1349 | } |
| 1341 | vcall = 0; | 1350 | vcall = 0; |
| 1342 | kexp2tv(&k, &key); | 1351 | kexp2tv(&k, &key); |
| @@ -1353,7 +1362,7 @@ static void constructor(LexState *ls, ExpDesc *e) | |||
| 1353 | } | 1362 | } |
| 1354 | checkmatch(ls, '}', '{', line); | 1363 | checkmatch(ls, '}', '{', line); |
| 1355 | if (vcall) { | 1364 | if (vcall) { |
| 1356 | BCIns *i = &fs->pt->bc[fs->pc-1]; | 1365 | BCIns *i = proto_insptr(fs->pt, fs->pc-1); |
| 1357 | ExpDesc en; | 1366 | ExpDesc en; |
| 1358 | lua_assert(bc_a(*i)==freg && bc_op(*i) == (narr>256?BC_TSETV:BC_TSETB)); | 1367 | lua_assert(bc_a(*i)==freg && bc_op(*i) == (narr>256?BC_TSETV:BC_TSETB)); |
| 1359 | init_exp(&en, VKNUM, 0); | 1368 | init_exp(&en, VKNUM, 0); |
| @@ -1373,7 +1382,7 @@ static void constructor(LexState *ls, ExpDesc *e) | |||
| 1373 | if (!needarr) narr = 0; | 1382 | if (!needarr) narr = 0; |
| 1374 | else if (narr < 3) narr = 3; | 1383 | else if (narr < 3) narr = 3; |
| 1375 | else if (narr > 0x7ff) narr = 0x7ff; | 1384 | else if (narr > 0x7ff) narr = 0x7ff; |
| 1376 | setbc_d(&fs->pt->bc[pc], (uint32_t)narr | (hsize2hbits(nhash) << 11)); | 1385 | setbc_d(proto_insptr(fs->pt, pc), (uint32_t)narr|(hsize2hbits(nhash)<<11)); |
| 1377 | } | 1386 | } |
| 1378 | } | 1387 | } |
| 1379 | 1388 | ||
diff --git a/src/lj_record.c b/src/lj_record.c index f6d13264..49e3d3b5 100644 --- a/src/lj_record.c +++ b/src/lj_record.c | |||
| @@ -263,7 +263,7 @@ static TRef fori_arg(jit_State *J, const BCIns *pc, BCReg slot, IRType t) | |||
| 263 | else | 263 | else |
| 264 | return lj_ir_knum(J, cast_num(k)); | 264 | return lj_ir_knum(J, cast_num(k)); |
| 265 | } else if (bc_op(ins) == BC_KNUM) { | 265 | } else if (bc_op(ins) == BC_KNUM) { |
| 266 | lua_Number n = J->pt->k.n[bc_d(ins)]; | 266 | lua_Number n = proto_knum(J->pt, bc_d(ins)); |
| 267 | if (t == IRT_INT) | 267 | if (t == IRT_INT) |
| 268 | return lj_ir_kint(J, lj_num2int(n)); | 268 | return lj_ir_kint(J, lj_num2int(n)); |
| 269 | else | 269 | else |
| @@ -1816,7 +1816,7 @@ void lj_record_ins(jit_State *J) | |||
| 1816 | case BCMnone: rb = 0; rc = bc_d(ins); break; /* Upgrade rc to 'rd'. */ | 1816 | case BCMnone: rb = 0; rc = bc_d(ins); break; /* Upgrade rc to 'rd'. */ |
| 1817 | case BCMvar: | 1817 | case BCMvar: |
| 1818 | copyTV(J->L, rbv, &lbase[rb]); ix.tab = rb = getslot(J, rb); break; | 1818 | copyTV(J->L, rbv, &lbase[rb]); ix.tab = rb = getslot(J, rb); break; |
| 1819 | case BCMnum: { lua_Number n = J->pt->k.n[rb]; | 1819 | case BCMnum: { lua_Number n = proto_knum(J->pt, rb); |
| 1820 | setnumV(rbv, n); ix.tab = rb = lj_ir_knumint(J, n); } break; | 1820 | setnumV(rbv, n); ix.tab = rb = lj_ir_knumint(J, n); } break; |
| 1821 | default: break; /* Handled later. */ | 1821 | default: break; /* Handled later. */ |
| 1822 | } | 1822 | } |
| @@ -1824,9 +1824,9 @@ void lj_record_ins(jit_State *J) | |||
| 1824 | case BCMvar: | 1824 | case BCMvar: |
| 1825 | copyTV(J->L, rcv, &lbase[rc]); ix.key = rc = getslot(J, rc); break; | 1825 | copyTV(J->L, rcv, &lbase[rc]); ix.key = rc = getslot(J, rc); break; |
| 1826 | case BCMpri: setitype(rcv, (int32_t)~rc); rc = TREF_PRI(IRT_NIL+rc); break; | 1826 | case BCMpri: setitype(rcv, (int32_t)~rc); rc = TREF_PRI(IRT_NIL+rc); break; |
| 1827 | case BCMnum: { lua_Number n = J->pt->k.n[rc]; | 1827 | case BCMnum: { lua_Number n = proto_knum(J->pt, rc); |
| 1828 | setnumV(rcv, n); ix.key = rc = lj_ir_knumint(J, n); } break; | 1828 | setnumV(rcv, n); ix.key = rc = lj_ir_knumint(J, n); } break; |
| 1829 | case BCMstr: { GCstr *s = strref(J->pt->k.gc[~(ptrdiff_t)rc]); | 1829 | case BCMstr: { GCstr *s = gco2str(proto_kgc(J->pt, ~(ptrdiff_t)rc)); |
| 1830 | setstrV(J->L, rcv, s); ix.key = rc = lj_ir_kstr(J, s); } break; | 1830 | setstrV(J->L, rcv, s); ix.key = rc = lj_ir_kstr(J, s); } break; |
| 1831 | default: break; /* Handled later. */ | 1831 | default: break; /* Handled later. */ |
| 1832 | } | 1832 | } |
| @@ -2018,7 +2018,7 @@ void lj_record_ins(jit_State *J) | |||
| 2018 | break; | 2018 | break; |
| 2019 | case BC_TDUP: | 2019 | case BC_TDUP: |
| 2020 | rc = emitir(IRT(IR_TDUP, IRT_TAB), | 2020 | rc = emitir(IRT(IR_TDUP, IRT_TAB), |
| 2021 | lj_ir_ktab(J, tabref(J->pt->k.gc[~(ptrdiff_t)rc])), 0); | 2021 | lj_ir_ktab(J, gco2tab(proto_kgc(J->pt, ~(ptrdiff_t)rc))), 0); |
| 2022 | break; | 2022 | break; |
| 2023 | 2023 | ||
| 2024 | /* -- Calls and vararg handling ----------------------------------------- */ | 2024 | /* -- Calls and vararg handling ----------------------------------------- */ |
| @@ -2315,7 +2315,7 @@ void lj_record_setup(jit_State *J) | |||
| 2315 | /* Check whether we could at least potentially form an extra loop. */ | 2315 | /* Check whether we could at least potentially form an extra loop. */ |
| 2316 | if (J->exitno == 0 && T->snap[0].nent == 0) { | 2316 | if (J->exitno == 0 && T->snap[0].nent == 0) { |
| 2317 | /* We can narrow a FORL for some side traces, too. */ | 2317 | /* We can narrow a FORL for some side traces, too. */ |
| 2318 | if (J->pc > J->pt->bc && bc_op(J->pc[-1]) == BC_JFORI && | 2318 | if (J->pc > proto_bc(J->pt) && bc_op(J->pc[-1]) == BC_JFORI && |
| 2319 | bc_d(J->pc[bc_j(J->pc[-1])-1]) == root) { | 2319 | bc_d(J->pc[bc_j(J->pc[-1])-1]) == root) { |
| 2320 | lj_snap_add(J); | 2320 | lj_snap_add(J); |
| 2321 | rec_setup_forl(J, J->pc-1); | 2321 | rec_setup_forl(J, J->pc-1); |
| @@ -2332,7 +2332,7 @@ void lj_record_setup(jit_State *J) | |||
| 2332 | rec_stop(J, TRACE_INTERP); | 2332 | rec_stop(J, TRACE_INTERP); |
| 2333 | } else { /* Root trace. */ | 2333 | } else { /* Root trace. */ |
| 2334 | J->cur.root = 0; | 2334 | J->cur.root = 0; |
| 2335 | if (J->pc >= J->pt->bc) { /* Not a hot CALL? */ | 2335 | if (J->pc >= proto_bc(J->pt)) { /* Not a hot CALL? */ |
| 2336 | J->cur.startins = *J->pc; | 2336 | J->cur.startins = *J->pc; |
| 2337 | J->pc = rec_setup_root(J); | 2337 | J->pc = rec_setup_root(J); |
| 2338 | /* Note: the loop instruction itself is recorded at the end and not | 2338 | /* Note: the loop instruction itself is recorded at the end and not |
diff --git a/src/lj_trace.c b/src/lj_trace.c index ce313df3..0bd32b1e 100644 --- a/src/lj_trace.c +++ b/src/lj_trace.c | |||
| @@ -146,7 +146,7 @@ void lj_trace_freeproto(global_State *g, GCproto *pt) | |||
| 146 | void lj_trace_reenableproto(GCproto *pt) | 146 | void lj_trace_reenableproto(GCproto *pt) |
| 147 | { | 147 | { |
| 148 | if ((pt->flags & PROTO_HAS_ILOOP)) { | 148 | if ((pt->flags & PROTO_HAS_ILOOP)) { |
| 149 | BCIns *bc = pt->bc; | 149 | BCIns *bc = proto_bc(pt); |
| 150 | BCPos i, sizebc = pt->sizebc;; | 150 | BCPos i, sizebc = pt->sizebc;; |
| 151 | pt->flags &= ~PROTO_HAS_ILOOP; | 151 | pt->flags &= ~PROTO_HAS_ILOOP; |
| 152 | for (i = 0; i < sizebc; i++) { | 152 | for (i = 0; i < sizebc; i++) { |
| @@ -323,7 +323,7 @@ static void trace_start(jit_State *J) | |||
| 323 | 323 | ||
| 324 | if ((J->pt->flags & PROTO_NO_JIT)) { /* JIT disabled for this proto? */ | 324 | if ((J->pt->flags & PROTO_NO_JIT)) { /* JIT disabled for this proto? */ |
| 325 | if (J->parent == 0) { | 325 | if (J->parent == 0) { |
| 326 | if (J->pc >= J->pt->bc) { | 326 | if (J->pc >= proto_bc(J->pt)) { |
| 327 | /* Lazy bytecode patching to disable hotcount events. */ | 327 | /* Lazy bytecode patching to disable hotcount events. */ |
| 328 | setbc_op(J->pc, (int)bc_op(*J->pc)+(int)BC_ILOOP-(int)BC_LOOP); | 328 | setbc_op(J->pc, (int)bc_op(*J->pc)+(int)BC_ILOOP-(int)BC_LOOP); |
| 329 | J->pt->flags |= PROTO_HAS_ILOOP; | 329 | J->pt->flags |= PROTO_HAS_ILOOP; |
| @@ -361,7 +361,7 @@ static void trace_start(jit_State *J) | |||
| 361 | setstrV(L, L->top++, lj_str_newlit(L, "start")); | 361 | setstrV(L, L->top++, lj_str_newlit(L, "start")); |
| 362 | setintV(L->top++, J->curtrace); | 362 | setintV(L->top++, J->curtrace); |
| 363 | setfuncV(L, L->top++, J->fn); | 363 | setfuncV(L, L->top++, J->fn); |
| 364 | setintV(L->top++, J->pc - J->pt->bc + 1); | 364 | setintV(L->top++, proto_bcpos(J->pt, J->pc) + 1); |
| 365 | if (J->parent) { | 365 | if (J->parent) { |
| 366 | setintV(L->top++, J->parent); | 366 | setintV(L->top++, J->parent); |
| 367 | setintV(L->top++, J->exitno); | 367 | setintV(L->top++, J->exitno); |
| @@ -444,7 +444,7 @@ static int trace_abort(jit_State *J) | |||
| 444 | setstrV(L, L->top++, lj_str_newlit(L, "abort")); | 444 | setstrV(L, L->top++, lj_str_newlit(L, "abort")); |
| 445 | setintV(L->top++, J->curtrace); | 445 | setintV(L->top++, J->curtrace); |
| 446 | setfuncV(L, L->top++, J->fn); | 446 | setfuncV(L, L->top++, J->fn); |
| 447 | setintV(L->top++, J->pc - J->pt->bc + 1); | 447 | setintV(L->top++, proto_bcpos(J->pt, J->pc) + 1); |
| 448 | copyTV(L, L->top++, restorestack(L, errobj)); | 448 | copyTV(L, L->top++, restorestack(L, errobj)); |
| 449 | copyTV(L, L->top++, &J->errinfo); | 449 | copyTV(L, L->top++, &J->errinfo); |
| 450 | ); | 450 | ); |
| @@ -478,7 +478,7 @@ static TValue *trace_state(lua_State *L, lua_CFunction dummy, void *ud) | |||
| 478 | lj_vmevent_send(L, RECORD, | 478 | lj_vmevent_send(L, RECORD, |
| 479 | setintV(L->top++, J->curtrace); | 479 | setintV(L->top++, J->curtrace); |
| 480 | setfuncV(L, L->top++, J->fn); | 480 | setfuncV(L, L->top++, J->fn); |
| 481 | setintV(L->top++, J->pc - J->pt->bc + 1); | 481 | setintV(L->top++, proto_bcpos(J->pt, J->pc) + 1); |
| 482 | setintV(L->top++, J->framedepth); | 482 | setintV(L->top++, J->framedepth); |
| 483 | if (bcmode_mm(bc_op(*J->pc)) == MM_call) { | 483 | if (bcmode_mm(bc_op(*J->pc)) == MM_call) { |
| 484 | cTValue *o = &L->base[bc_a(*J->pc)]; | 484 | cTValue *o = &L->base[bc_a(*J->pc)]; |
