summaryrefslogtreecommitdiffhomepage
path: root/src/backtrace.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2013-10-15 12:49:41 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2013-10-15 12:49:41 +0900
commita7c9a71684fccf8121f16803f8e3d758f0dea001 (patch)
tree0c6d48062d84fa4afef1e55842452f9f8cac98e0 /src/backtrace.c
parent8ecbff3f7ba38709ed8dcd6c993456883b33d218 (diff)
downloadmruby-a7c9a71684fccf8121f16803f8e3d758f0dea001.tar.gz
mruby-a7c9a71684fccf8121f16803f8e3d758f0dea001.zip
better error position display
Diffstat (limited to 'src/backtrace.c')
-rw-r--r--src/backtrace.c13
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)