summaryrefslogtreecommitdiff
path: root/vm_eval.c
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-05-25 11:01:01 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-05-25 11:01:01 +0000
commit4258db79543d97845f0684f9b69911b67181cecd (patch)
tree5c1ab5e2bc5ec1f1e89853efa273cceb8a7e5470 /vm_eval.c
parenta5f190615e894c0d1931300b27d8651f7eedf5e1 (diff)
* vm_eval.c (rb_f_caller): caller() method accepts second optional
argument `n' which specify how many frames should return. For example, `caller(0, 1)' returns only one frame information which calls caller() method. If there are less than n frame information, then all frame information are returned. If n is 0, then always return []. This fix is part of [ruby-dev:42345] [Ruby 1.9-Feature#3917]. However, performance and features are not enough. RDoc is also not available. * test/ruby/test_backtrace.rb: add a test for above. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35792 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm_eval.c')
-rw-r--r--vm_eval.c30
1 files changed, 21 insertions, 9 deletions
diff --git a/vm_eval.c b/vm_eval.c
index cd83d42847..0160b66af6 100644
--- a/vm_eval.c
+++ b/vm_eval.c
@@ -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