[前][次][番号順一覧][スレッド一覧]

ruby-changes:23741

From: ko1 <ko1@a...>
Date: Fri, 25 May 2012 20:03:11 +0900 (JST)
Subject: [ruby-changes:23741] ko1:r35792 (trunk): * vm_eval.c (rb_f_caller): caller() method accepts second optional

ko1	2012-05-25 20:01:01 +0900 (Fri, 25 May 2012)

  New Revision: 35792

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=35792

  Log:
    * 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.

  Modified files:
    trunk/ChangeLog
    trunk/test/ruby/test_backtrace.rb
    trunk/vm_eval.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 35791)
+++ ChangeLog	(revision 35792)
@@ -1,3 +1,17 @@
+Fri May 25 19:51:36 2012  Koichi Sasada  <ko1@a...>
+
+	* 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.
+
 Fri May 25 17:05:07 2012  Koichi Sasada  <ko1@a...>
 
 	* vm.c (oldbt_init, vm_backtrace_str_ary): arg->data should
Index: vm_eval.c
===================================================================
--- vm_eval.c	(revision 35791)
+++ vm_eval.c	(revision 35792)
@@ -1609,19 +1609,31 @@
 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
Index: test/ruby/test_backtrace.rb
===================================================================
--- test/ruby/test_backtrace.rb	(revision 35791)
+++ test/ruby/test_backtrace.rb	(revision 35792)
@@ -40,7 +40,7 @@
           rec[n-1]
         }
       else
-        max.times{|i|
+        (max*3).times{|i|
           total_size = caller(0).size
           c = caller(i)
           if c
@@ -53,5 +53,35 @@
       rec[max]
     }.resume
   end
+
+  def test_caller_lev_and_n
+    m = 10
+    rec = lambda{|n|
+      if n < 0
+        (m*6).times{|lev|
+          (m*6).times{|n|
+            t = caller(0).size
+            r = caller(lev, n)
+            r = r.size if r.respond_to? :size
+
+            # STDERR.puts [t, lev, n, r].inspect
+            if n == 0
+              assert_equal(0, r, [t, lev, n, r].inspect)
+            elsif t < lev
+              assert_equal(nil, r, [t, lev, n, r].inspect)
+            else
+              if t - lev > n
+                assert_equal(n, r, [t, lev, n, r].inspect)
+              else
+                assert_equal(t - lev, r, [t, lev, n, r].inspect)
+              end
+            end
+          }
+        }
+      else
+        rec[n-1]
+      end
+    }
+    rec[m]
+  end
 end
-

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]