diff options
Diffstat (limited to 'vm_eval.c')
-rw-r--r-- | vm_eval.c | 128 |
1 files changed, 2 insertions, 126 deletions
@@ -20,9 +20,8 @@ static VALUE vm_exec(rb_thread_t *th); static void vm_set_eval_stack(rb_thread_t * th, VALUE iseqval, const NODE *cref); static int vm_collect_local_variables_in_heap(rb_thread_t *th, VALUE *dfp, VALUE ary); -static VALUE vm_backtrace_str_ary(rb_thread_t *th, int lev, int n); -static VALUE vm_backtrace_frame_ary(rb_thread_t *th, int lev, int n); -static void vm_backtrace_print(FILE *fp); +/* vm_backtrace.c */ +VALUE vm_backtrace_str_ary(rb_thread_t *th, int lev, int n); typedef enum call_type { CALL_PUBLIC, @@ -1579,127 +1578,6 @@ rb_catch_obj(VALUE tag, VALUE (*func)(), VALUE data) /* * call-seq: - * caller(start=1) -> array or nil - * - * Returns the current execution stack---an array containing strings in - * the form ``<em>file:line</em>'' or ``<em>file:line: in - * `method'</em>''. The optional _start_ parameter - * determines the number of initial stack entries to omit from the - * result. - * - * Returns +nil+ if _start_ is greater than the size of - * current execution stack. - * - * def a(skip) - * caller(skip) - * end - * def b(skip) - * a(skip) - * end - * def c(skip) - * b(skip) - * end - * c(0) #=> ["prog:2:in `a'", "prog:5:in `b'", "prog:8:in `c'", "prog:10:in `<main>'"] - * c(1) #=> ["prog:5:in `b'", "prog:8:in `c'", "prog:11:in `<main>'"] - * c(2) #=> ["prog:8:in `c'", "prog:12:in `<main>'"] - * c(3) #=> ["prog:13:in `<main>'"] - * c(4) #=> [] - * c(5) #=> nil - */ - -static VALUE -rb_f_caller(int argc, VALUE *argv) -{ - VALUE level, vn; - int lev, n; - - rb_scan_args(argc, argv, "02", &level, &vn); - - 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, n); -} - -static VALUE -rb_f_caller_frame_info(int argc, VALUE *argv) -{ - VALUE level, vn; - int lev, n; - - rb_scan_args(argc, argv, "02", &level, &vn); - - 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_frame_ary(GET_THREAD(), lev+1, n); -} - -void -rb_backtrace(void) -{ - vm_backtrace_print(stderr); -} - -VALUE -rb_make_backtrace(void) -{ - return vm_backtrace_str_ary(GET_THREAD(), 0, 0); -} - -VALUE -rb_thread_backtrace(VALUE thval) -{ - rb_thread_t *th; - GetThreadPtr(thval, th); - - switch (th->status) { - case THREAD_RUNNABLE: - case THREAD_STOPPED: - case THREAD_STOPPED_FOREVER: - break; - case THREAD_TO_KILL: - case THREAD_KILLED: - return Qnil; - } - - return vm_backtrace_str_ary(th, 0, 0); -} - -/* - * call-seq: * local_variables -> array * * Returns the names of the current local variables. @@ -1834,6 +1712,4 @@ Init_vm_eval(void) rb_define_method(rb_cModule, "class_exec", rb_mod_module_exec, -1); rb_define_method(rb_cModule, "module_eval", rb_mod_module_eval, -1); rb_define_method(rb_cModule, "class_eval", rb_mod_module_eval, -1); - - rb_define_global_function("caller", rb_f_caller, -1); } |