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/