diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-10-15 12:49:41 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-10-15 12:49:41 +0900 |
| commit | a7c9a71684fccf8121f16803f8e3d758f0dea001 (patch) | |
| tree | 0c6d48062d84fa4afef1e55842452f9f8cac98e0 /src/backtrace.c | |
| parent | 8ecbff3f7ba38709ed8dcd6c993456883b33d218 (diff) | |
| download | mruby-a7c9a71684fccf8121f16803f8e3d758f0dea001.tar.gz mruby-a7c9a71684fccf8121f16803f8e3d758f0dea001.zip | |
better error position display
Diffstat (limited to 'src/backtrace.c')
| -rw-r--r-- | src/backtrace.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/src/backtrace.c b/src/backtrace.c index 4ad792a5e..54927ec00 100644 --- a/src/backtrace.c +++ b/src/backtrace.c @@ -77,18 +77,21 @@ mrb_output_backtrace(mrb_state *mrb, struct RObject *exc, output_stream_func fun if (MRB_PROC_CFUNC_P(ci->proc)) { continue; } - if(!MRB_PROC_CFUNC_P(ci->proc)) { + else { mrb_irep *irep = ci->proc->body.irep; mrb_code *pc; - if (i+1 <= ciidx) { - pc = mrb->c->cibase[i+1].pc; + if (mrb->c->cibase[i].err) { + pc = mrb->c->cibase[i].err; + } + else if (i+1 <= ciidx) { + pc = mrb->c->cibase[i+1].pc - 1; } else { pc = (mrb_code*)mrb_cptr(mrb_obj_iv_get(mrb, exc, mrb_intern2(mrb, "lastpc", 6))); } - filename = mrb_debug_get_filename(irep, pc - irep->iseq - 1); - line = mrb_debug_get_line(irep, pc - irep->iseq - 1); + filename = mrb_debug_get_filename(irep, pc - irep->iseq); + line = mrb_debug_get_line(irep, pc - irep->iseq); } if (line == -1) continue; if (ci->target_class == ci->proc->target_class) |
