* 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. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37957 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
b76b6b5c98
commit
3d47e7b285
@ -1,3 +1,10 @@
|
|||||||
|
Thu Nov 29 09:10:17 2012 Koichi Sasada <ko1@atdot.net>
|
||||||
|
|
||||||
|
* 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@gmail.com>
|
Thu Nov 29 06:46:33 2012 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
|
||||||
|
|
||||||
* thread.c (thread_start_func_2): small cleanups.
|
* thread.c (thread_start_func_2): small cleanups.
|
||||||
|
@ -699,33 +699,60 @@ vm_backtrace_to_ary(rb_thread_t *th, int argc, VALUE *argv, int lev_default, int
|
|||||||
{
|
{
|
||||||
VALUE level, vn;
|
VALUE level, vn;
|
||||||
int lev, n;
|
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);
|
rb_scan_args(argc, argv, "02", &level, &vn);
|
||||||
|
|
||||||
lev = NIL_P(level) ? lev_default : NUM2INT(level);
|
switch (argc) {
|
||||||
|
case 0:
|
||||||
if (NIL_P(vn)) {
|
lev = lev_default + lev_plus;
|
||||||
n = 0;
|
n = bt->backtrace_size - lev;
|
||||||
}
|
break;
|
||||||
else {
|
case 1:
|
||||||
n = NUM2INT(vn);
|
{
|
||||||
if (n == 0) {
|
long beg, len;
|
||||||
return rb_ary_new();
|
switch (rb_range_beg_len(level, &beg, &len, bt->backtrace_size - lev_plus, 0)) {
|
||||||
}
|
case Qfalse:
|
||||||
}
|
lev = NUM2LONG(level);
|
||||||
|
|
||||||
if (lev < 0) {
|
if (lev < 0) {
|
||||||
rb_raise(rb_eArgError, "negative level (%d)", lev);
|
rb_raise(rb_eArgError, "negative level (%d)", lev);
|
||||||
}
|
}
|
||||||
if (n < 0) {
|
lev += lev_plus;
|
||||||
rb_raise(rb_eArgError, "negative n (%d)", n);
|
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 (n == 0) {
|
||||||
|
return rb_ary_new();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (to_str) {
|
if (to_str) {
|
||||||
return vm_backtrace_str_ary(th, lev+lev_plus, n);
|
return backtrace_to_str_ary(btval, lev, n);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return vm_backtrace_location_ary(th, lev+lev_plus, n);
|
return backtrace_to_location_ary(btval, lev, n);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user