diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-06-02 15:59:37 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-06-02 15:59:37 +0000 |
commit | b57c81ae3efd33599e993500816bce18e108a2d3 (patch) | |
tree | 1b2b9ccd8ce1f6873bbea4a9bda8ef2b985cd654 /vm_eval.c | |
parent | 3657d629c151bfe063e2db62506e47060f946b56 (diff) | |
download | ruby-b57c81ae3efd33599e993500816bce18e108a2d3.tar.gz |
* common.mk: fix to build vm_backtrace.c only itself (vm_backtrace.c
is no longer included from vm.c). I hope this separation reduce
compile time of vm.c.
* internal.h: ditto.
* vm.c, vm_core.h, vm_dump.c, vm_eval.c: ditto.
* vm_eval.c: some functions (callee, etc) moved to vm_backtrace.c.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35871 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
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); } |