diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-05-26 04:49:23 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-05-26 04:49:23 +0000 |
commit | 4f54d4710e1edfbcb8b0d7d7feea1bd8c519229f (patch) | |
tree | d70505cbff9b7012a1871cd0d69a86c31ad79792 /vm_eval.c | |
parent | fbf531c4a249e75260e80ed767114b02e0a1e985 (diff) |
* vm.c (RubyVM::FrameInfo): add a class to access each frame
information. You don't need to parse strings from caller().
FrameInfo has the following methods:
FrameInfo#name: method name, class name, etc with decorations.
FrameInfo#basename: name without decorations.
FrameInfo#line_no: line number.
FrameInfo#filename: file name.
FrameInfo#filepath: full filepath.
FrameInfo#iseq: iseq if it is iseq frame (defined by ruby script)
FrameInfo#to_s: return caller() method style string.
RubyVM::FrameInfoFrameInfo.caller(n, lev) returns array of
FrameInfo objects. The name "RubyVM::FrameInfoFrameInfo.caller"
is long and ambiguous (same as caller() method), we need to change
the name before Ruby 2.0 release.
Good names or comments are welcome.
* test/ruby/test_backtrace.rb: add a test for above change.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35801 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm_eval.c')
-rw-r--r-- | vm_eval.c | 32 |
1 files changed, 31 insertions, 1 deletions
@@ -21,6 +21,7 @@ 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, size_t lev, size_t n); +static VALUE vm_backtrace_frame_ary(rb_thread_t *th, size_t lev, size_t n); static void vm_backtrace_print(FILE *fp); typedef enum call_type { @@ -1636,6 +1637,36 @@ rb_f_caller(int argc, VALUE *argv) 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) { @@ -1806,4 +1837,3 @@ Init_vm_eval(void) rb_define_global_function("caller", rb_f_caller, -1); } - |