summaryrefslogtreecommitdiffhomepage
path: root/src/backtrace.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2021-05-28 07:36:20 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2021-05-28 07:36:20 +0900
commit2a717cf2aa47993c460455d55d6cc23223578f98 (patch)
treeb0a4b9554aaae453699eca8da43289cab2a68a44 /src/backtrace.c
parentcefbc21e6762bada94612caea5a7c592cc4a2ad3 (diff)
downloadmruby-2a717cf2aa47993c460455d55d6cc23223578f98.tar.gz
mruby-2a717cf2aa47993c460455d55d6cc23223578f98.zip
backtrace.c: do not skip frames for C function calls.
Diffstat (limited to 'src/backtrace.c')
-rw-r--r--src/backtrace.c26
1 files changed, 14 insertions, 12 deletions
diff --git a/src/backtrace.c b/src/backtrace.c
index 6d7e8b33b..7ff1cea6c 100644
--- a/src/backtrace.c
+++ b/src/backtrace.c
@@ -38,27 +38,29 @@ each_backtrace(mrb_state *mrb, ptrdiff_t ciidx, each_backtrace_func func, void *
for (ptrdiff_t i=ciidx; i >= 0; i--) {
struct backtrace_location loc;
mrb_callinfo *ci;
- const mrb_irep *irep;
+ const mrb_irep *irep = 0;
const mrb_code *pc;
uint32_t idx;
ci = &mrb->c->cibase[i];
- if (!ci->proc) continue;
- if (MRB_PROC_CFUNC_P(ci->proc)) continue;
-
- irep = ci->proc->body.irep;
- if (!irep) continue;
- if (mrb->c->cibase[i].pc) {
- pc = &mrb->c->cibase[i].pc[-1];
+ if (!ci->proc || MRB_PROC_CFUNC_P(ci->proc)) {
+ loc.lineno = -1;
+ idx = 0;
}
else {
- continue;
+ irep = ci->proc->body.irep;
+ if (!irep) continue;
+ if (mrb->c->cibase[i].pc) {
+ pc = &mrb->c->cibase[i].pc[-1];
+ }
+ else {
+ continue;
+ }
+ idx = (uint32_t)(pc - irep->iseq);
+ loc.lineno = mrb_debug_get_line(mrb, irep, idx);
}
-
loc.method_id = ci->mid;
- idx = (uint32_t)(pc - irep->iseq);
- loc.lineno = mrb_debug_get_line(mrb, irep, idx);
if (loc.lineno == -1) {
for (ptrdiff_t j=i-1; j >= 0; j--) {
ci = &mrb->c->cibase[j];