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

ruby-changes:25900

From: ko1 <ko1@a...>
Date: Thu, 29 Nov 2012 09:26:42 +0900 (JST)
Subject: [ruby-changes:25900] ko1:r37957 (trunk): * vm_backtrace.c (vm_backtrace_to_ary): support range argument

ko1	2012-11-29 09:12:49 +0900 (Thu, 29 Nov 2012)

  New Revision: 37957

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

  Log:
    * vm_backtrace.c (vm_backtrace_to_ary): support range argument
      like Array#[].
      [ruby-core:50092] [ruby-trunk - Feature #7434]
      Test and document is not available. Please help us.

  Modified files:
    trunk/ChangeLog
    trunk/vm_backtrace.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 37956)
+++ ChangeLog	(revision 37957)
@@ -1,3 +1,10 @@
+Thu Nov 29 09:10:17 2012  Koichi Sasada  <ko1@a...>
+
+	* vm_backtrace.c (vm_backtrace_to_ary): support range argument
+	  like Array#[].
+	  [ruby-core:50092] [ruby-trunk - Feature #7434]
+	  Test and document is not available. Please help us.
+
 Thu Nov 29 06:46:33 2012  KOSAKI Motohiro  <kosaki.motohiro@g...>
 
 	* thread.c (thread_start_func_2): small cleanups.
Index: vm_backtrace.c
===================================================================
--- vm_backtrace.c	(revision 37956)
+++ vm_backtrace.c	(revision 37957)
@@ -699,33 +699,60 @@
 {
     VALUE level, vn;
     int lev, n;
+    VALUE btval = backtrace_object(th);
+    rb_backtrace_t *bt;
+    GetCoreDataFromValue(btval, rb_backtrace_t, bt);
 
     rb_scan_args(argc, argv, "02", &level, &vn);
 
-    lev = NIL_P(level) ? lev_default : NUM2INT(level);
-
-    if (NIL_P(vn)) {
-	n = 0;
-    }
-    else {
-	n = NUM2INT(vn);
-	if (n == 0) {
-	    return rb_ary_new();
+    switch (argc) {
+      case 0:
+	lev = lev_default + lev_plus;
+	n = bt->backtrace_size - lev;
+	break;
+      case 1:
+	{
+	    long beg, len;
+	    switch (rb_range_beg_len(level, &beg, &len, bt->backtrace_size - lev_plus, 0)) {
+	      case Qfalse:
+		lev = NUM2LONG(level);
+		if (lev < 0) {
+		    rb_raise(rb_eArgError, "negative level (%d)", lev);
+		}
+		lev += lev_plus;
+		n = bt->backtrace_size - lev;
+		break;
+	      case Qnil:
+		return Qnil;
+	      default:
+		lev = beg + lev_plus;
+		n = len;
+		break;
+	    }
+	    break;
 	}
+      case 2:
+	lev = NUM2LONG(level);
+	if (lev < 0) {
+	    rb_raise(rb_eArgError, "negative level (%d)", lev);
+	}
+	lev += lev_plus;
+	n = NUM2LONG(vn);
+	break;
+      default:
+	lev = n = 0; /* to avoid warning */
+	break;
     }
 
-    if (lev < 0) {
-	rb_raise(rb_eArgError, "negative level (%d)", lev);
+    if (n == 0) {
+	return rb_ary_new();
     }
-    if (n < 0) {
-	rb_raise(rb_eArgError, "negative n (%d)", n);
-    }
 
     if (to_str) {
-	return vm_backtrace_str_ary(th, lev+lev_plus, n);
+	return backtrace_to_str_ary(btval, lev, n);
     }
     else {
-	return vm_backtrace_location_ary(th, lev+lev_plus, n);
+	return backtrace_to_location_ary(btval, lev, n);
     }
 }
 

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

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