diff --git a/lib/dump.lua b/lib/dump.lua index c12b0ba8..ccd43d72 100644 --- a/lib/dump.lua +++ b/lib/dump.lua @@ -483,15 +483,21 @@ local function dump_record(tr, func, pc, depth, callee) recdepth = depth recprefix = rep(" .", depth) end - local line = bcline(func, pc, recprefix) - if dumpmode.H then line = gsub(line, "[<>&]", html_escape) end - if type(callee) == "function" then - out:write(sub(line, 1, -2), " ; ", fmtfunc(callee), "\n") + local line + if pc >= 0 then + line = bcline(func, pc, recprefix) + if dumpmode.H then line = gsub(line, "[<>&]", html_escape) end + else + line = "0000 "..recprefix.." FUNCC \n" + callee = func + end + if pc <= 0 then + out:write(sub(line, 1, -2), " ; ", fmtfunc(func), "\n") else out:write(line) end - if band(funcbc(func, pc), 0xff) < 16 then -- Write JMP for cond. ORDER BC - out:write(bcline(func, pc+1, recprefix)) + if pc >= 0 and band(funcbc(func, pc), 0xff) < 16 then -- ORDER BC + out:write(bcline(func, pc+1, recprefix)) -- Write JMP for cond. end end diff --git a/src/lj_trace.c b/src/lj_trace.c index 7b366d54..8cbbf0f3 100644 --- a/src/lj_trace.c +++ b/src/lj_trace.c @@ -475,18 +475,12 @@ static TValue *trace_state(lua_State *L, lua_CFunction dummy, void *ud) case LJ_TRACE_RECORD: setvmstate(J2G(J), RECORD); - if (J->pt) - lj_vmevent_send(L, RECORD, - setintV(L->top++, J->curtrace); - setfuncV(L, L->top++, J->fn); - setintV(L->top++, proto_bcpos(J->pt, J->pc)); - setintV(L->top++, J->framedepth); - if (bcmode_mm(bc_op(*J->pc)) == MM_call) { - cTValue *o = &L->base[bc_a(*J->pc)]; - if (bc_op(*J->pc) == BC_ITERC) o -= 3; - copyTV(L, L->top++, o); - } - ); + lj_vmevent_send(L, RECORD, + setintV(L->top++, J->curtrace); + setfuncV(L, L->top++, J->fn); + setintV(L->top++, J->pt ? (int32_t)proto_bcpos(J->pt, J->pc) : -1); + setintV(L->top++, J->framedepth); + ); lj_record_ins(J); break;