diff options
Diffstat (limited to 'vm_eval.c')
-rw-r--r-- | vm_eval.c | 30 |
1 files changed, 21 insertions, 9 deletions
@@ -1609,19 +1609,31 @@ rb_catch_obj(VALUE tag, VALUE (*func)(), VALUE data) static VALUE rb_f_caller(int argc, VALUE *argv) { - VALUE level; - int lev; + VALUE level, vn; + int lev, n; - rb_scan_args(argc, argv, "01", &level); + rb_scan_args(argc, argv, "02", &level, &vn); - if (NIL_P(level)) - lev = 1; - else - lev = NUM2INT(level); - if (lev < 0) + lev = NIL_P(level) ? 1 : NUM2INT(level); + + if (NIL_P(vn)) { + n = 0; + } + else { + n = NUM2INT(vn); + if (n == 0) { + return rb_ary_new(); + } + } + + if (lev < 0) { rb_raise(rb_eArgError, "negative level (%d)", lev); + } + if (n < 0) { + rb_raise(rb_eArgError, "negative n (%d)", n); + } - return vm_backtrace_str_ary(GET_THREAD(), lev+1, 0); + return vm_backtrace_str_ary(GET_THREAD(), lev+1, n); } void |