summaryrefslogtreecommitdiffhomepage
path: root/src/error.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/error.c
parent8ecbff3f7ba38709ed8dcd6c993456883b33d218 (diff)
downloadmruby-a7c9a71684fccf8121f16803f8e3d758f0dea001.tar.gz
mruby-a7c9a71684fccf8121f16803f8e3d758f0dea001.zip
better error position display
Diffstat (limited to 'src/error.c')
-rw-r--r--src/error.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/src/error.c b/src/error.c
index 4ce2b4ade..10ba6170f 100644
--- a/src/error.c
+++ b/src/error.c
@@ -194,14 +194,16 @@ exc_debug_info(mrb_state *mrb, struct RObject *exc)
mrb_code *pc = ci->pc;
mrb_obj_iv_set(mrb, exc, mrb_intern2(mrb, "ciidx", 5), mrb_fixnum_value(ci - mrb->c->cibase));
- ci--;
while (ci >= mrb->c->cibase) {
- if (ci->proc && !MRB_PROC_CFUNC_P(ci->proc)) {
+ mrb_code *err = ci->err;
+
+ if (!err && pc) err = pc - 1;
+ if (err && ci->proc && !MRB_PROC_CFUNC_P(ci->proc)) {
mrb_irep *irep = ci->proc->body.irep;
- int32_t const line = mrb_debug_get_line(irep, pc - irep->iseq - 1);
- char const* file = mrb_debug_get_filename(irep, pc - irep->iseq - 1);
- if(line != -1 && file) {
+ int32_t const line = mrb_debug_get_line(irep, err - irep->iseq);
+ char const* file = mrb_debug_get_filename(irep, err - irep->iseq);
+ if (line != -1 && file) {
mrb_obj_iv_set(mrb, exc, mrb_intern2(mrb, "file", 4), mrb_str_new_cstr(mrb, file));
mrb_obj_iv_set(mrb, exc, mrb_intern2(mrb, "line", 4), mrb_fixnum_value(line));
return;