* enum.c (enum_min_by, enum_max_by): return nil if no iteration.
fixed: [ruby-dev:26245] * eval.c (rb_need_block): ensure a block is given. * eval.c (backtrace): skip successive frames sharing same node. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8590 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
db128e1b31
commit
17920c7a9e
@ -1,3 +1,12 @@
|
|||||||
|
Wed Jun 8 08:33:10 2005 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* enum.c (enum_min_by, enum_max_by): return nil if no iteration.
|
||||||
|
fixed: [ruby-dev:26245]
|
||||||
|
|
||||||
|
* eval.c (rb_need_block): ensure a block is given.
|
||||||
|
|
||||||
|
* eval.c (backtrace): skip successive frames sharing same node.
|
||||||
|
|
||||||
Wed Jun 8 01:27:06 2005 Yukihiro Matsumoto <matz@ruby-lang.org>
|
Wed Jun 8 01:27:06 2005 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
* bignum.c (bignorm): fixed a bug in normalizing negative numbers
|
* bignum.c (bignorm): fixed a bug in normalizing negative numbers
|
||||||
|
210
enum.c
210
enum.c
@ -80,11 +80,10 @@ enum_grep(obj, pat)
|
|||||||
static VALUE
|
static VALUE
|
||||||
find_i(i, memo)
|
find_i(i, memo)
|
||||||
VALUE i;
|
VALUE i;
|
||||||
NODE *memo;
|
VALUE *memo;
|
||||||
{
|
{
|
||||||
if (RTEST(rb_yield(i))) {
|
if (RTEST(rb_yield(i))) {
|
||||||
memo->u2.value = Qtrue;
|
*memo = i;
|
||||||
memo->u1.value = i;
|
|
||||||
rb_iter_break();
|
rb_iter_break();
|
||||||
}
|
}
|
||||||
return Qnil;
|
return Qnil;
|
||||||
@ -111,13 +110,13 @@ enum_find(argc, argv, obj)
|
|||||||
VALUE* argv;
|
VALUE* argv;
|
||||||
VALUE obj;
|
VALUE obj;
|
||||||
{
|
{
|
||||||
NODE *memo = rb_node_newnode(NODE_MEMO, Qnil, Qfalse, 0);
|
VALUE memo = Qundef;
|
||||||
VALUE if_none;
|
VALUE if_none;
|
||||||
|
|
||||||
rb_scan_args(argc, argv, "01", &if_none);
|
rb_scan_args(argc, argv, "01", &if_none);
|
||||||
rb_iterate(rb_each, obj, find_i, (VALUE)memo);
|
rb_iterate(rb_each, obj, find_i, (VALUE)&memo);
|
||||||
if (memo->u2.value) {
|
if (memo != Qundef) {
|
||||||
return memo->u1.value;
|
return memo;
|
||||||
}
|
}
|
||||||
if (!NIL_P(if_none)) {
|
if (!NIL_P(if_none)) {
|
||||||
return rb_funcall(if_none, rb_intern("call"), 0, 0);
|
return rb_funcall(if_none, rb_intern("call"), 0, 0);
|
||||||
@ -257,14 +256,13 @@ enum_to_a(obj)
|
|||||||
static VALUE
|
static VALUE
|
||||||
inject_i(i, memo)
|
inject_i(i, memo)
|
||||||
VALUE i;
|
VALUE i;
|
||||||
NODE *memo;
|
VALUE *memo;
|
||||||
{
|
{
|
||||||
if (memo->u2.value) {
|
if (*memo == Qundef) {
|
||||||
memo->u2.value = Qfalse;
|
*memo = i;
|
||||||
memo->u1.value = i;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
memo->u1.value = rb_yield_values(2, memo->u1.value, i);
|
*memo = rb_yield_values(2, *memo, i);
|
||||||
}
|
}
|
||||||
return Qnil;
|
return Qnil;
|
||||||
}
|
}
|
||||||
@ -305,18 +303,11 @@ enum_inject(argc, argv, obj)
|
|||||||
int argc;
|
int argc;
|
||||||
VALUE *argv, obj;
|
VALUE *argv, obj;
|
||||||
{
|
{
|
||||||
NODE *memo;
|
VALUE memo = Qundef;
|
||||||
VALUE n;
|
|
||||||
|
|
||||||
if (rb_scan_args(argc, argv, "01", &n) == 1) {
|
rb_scan_args(argc, argv, "01", &memo);
|
||||||
memo = rb_node_newnode(NODE_MEMO, n, Qfalse, 0);
|
rb_iterate(rb_each, obj, inject_i, (VALUE)&memo);
|
||||||
}
|
return memo;
|
||||||
else {
|
|
||||||
memo = rb_node_newnode(NODE_MEMO, Qnil, Qtrue, 0);
|
|
||||||
}
|
|
||||||
rb_iterate(rb_each, obj, inject_i, (VALUE)memo);
|
|
||||||
n = memo->u1.value;
|
|
||||||
return n;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
@ -507,10 +498,10 @@ enum_sort_by(obj)
|
|||||||
static VALUE
|
static VALUE
|
||||||
all_iter_i(i, memo)
|
all_iter_i(i, memo)
|
||||||
VALUE i;
|
VALUE i;
|
||||||
NODE *memo;
|
VALUE *memo;
|
||||||
{
|
{
|
||||||
if (!RTEST(rb_yield(i))) {
|
if (!RTEST(rb_yield(i))) {
|
||||||
memo->u1.value = Qfalse;
|
*memo = Qfalse;
|
||||||
rb_iter_break();
|
rb_iter_break();
|
||||||
}
|
}
|
||||||
return Qnil;
|
return Qnil;
|
||||||
@ -519,10 +510,10 @@ all_iter_i(i, memo)
|
|||||||
static VALUE
|
static VALUE
|
||||||
all_i(i, memo)
|
all_i(i, memo)
|
||||||
VALUE i;
|
VALUE i;
|
||||||
NODE *memo;
|
VALUE *memo;
|
||||||
{
|
{
|
||||||
if (!RTEST(i)) {
|
if (!RTEST(i)) {
|
||||||
memo->u1.value = Qfalse;
|
*memo = Qfalse;
|
||||||
rb_iter_break();
|
rb_iter_break();
|
||||||
}
|
}
|
||||||
return Qnil;
|
return Qnil;
|
||||||
@ -549,22 +540,19 @@ static VALUE
|
|||||||
enum_all(obj)
|
enum_all(obj)
|
||||||
VALUE obj;
|
VALUE obj;
|
||||||
{
|
{
|
||||||
VALUE result;
|
VALUE result = Qtrue;
|
||||||
NODE *memo = rb_node_newnode(NODE_MEMO, Qnil, 0, 0);
|
|
||||||
|
|
||||||
memo->u1.value = Qtrue;
|
rb_iterate(rb_each, obj, rb_block_given_p() ? all_iter_i : all_i, (VALUE)&result);
|
||||||
rb_iterate(rb_each, obj, rb_block_given_p() ? all_iter_i : all_i, (VALUE)memo);
|
|
||||||
result = memo->u1.value;
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
any_iter_i(i, memo)
|
any_iter_i(i, memo)
|
||||||
VALUE i;
|
VALUE i;
|
||||||
NODE *memo;
|
VALUE *memo;
|
||||||
{
|
{
|
||||||
if (RTEST(rb_yield(i))) {
|
if (RTEST(rb_yield(i))) {
|
||||||
memo->u1.value = Qtrue;
|
*memo = Qtrue;
|
||||||
rb_iter_break();
|
rb_iter_break();
|
||||||
}
|
}
|
||||||
return Qnil;
|
return Qnil;
|
||||||
@ -573,10 +561,10 @@ any_iter_i(i, memo)
|
|||||||
static VALUE
|
static VALUE
|
||||||
any_i(i, memo)
|
any_i(i, memo)
|
||||||
VALUE i;
|
VALUE i;
|
||||||
NODE *memo;
|
VALUE *memo;
|
||||||
{
|
{
|
||||||
if (RTEST(i)) {
|
if (RTEST(i)) {
|
||||||
memo->u1.value = Qtrue;
|
*memo = Qtrue;
|
||||||
rb_iter_break();
|
rb_iter_break();
|
||||||
}
|
}
|
||||||
return Qnil;
|
return Qnil;
|
||||||
@ -604,29 +592,26 @@ static VALUE
|
|||||||
enum_any(obj)
|
enum_any(obj)
|
||||||
VALUE obj;
|
VALUE obj;
|
||||||
{
|
{
|
||||||
VALUE result;
|
VALUE result = Qfalse;
|
||||||
NODE *memo = rb_node_newnode(NODE_MEMO, Qnil, 0, 0);
|
|
||||||
|
|
||||||
memo->u1.value = Qfalse;
|
rb_iterate(rb_each, obj, rb_block_given_p() ? any_iter_i : any_i, (VALUE)&result);
|
||||||
rb_iterate(rb_each, obj, rb_block_given_p() ? any_iter_i : any_i, (VALUE)memo);
|
|
||||||
result = memo->u1.value;
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
min_i(i, memo)
|
min_i(i, memo)
|
||||||
VALUE i;
|
VALUE i;
|
||||||
NODE *memo;
|
VALUE *memo;
|
||||||
{
|
{
|
||||||
VALUE cmp;
|
VALUE cmp;
|
||||||
|
|
||||||
if (NIL_P(memo->u1.value)) {
|
if (NIL_P(*memo)) {
|
||||||
memo->u1.value = i;
|
*memo = i;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
cmp = rb_funcall(i, id_cmp, 1, memo->u1.value);
|
cmp = rb_funcall(i, id_cmp, 1, *memo);
|
||||||
if (rb_cmpint(cmp, i, memo->u1.value) < 0) {
|
if (rb_cmpint(cmp, i, *memo) < 0) {
|
||||||
memo->u1.value = i;
|
*memo = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return Qnil;
|
return Qnil;
|
||||||
@ -635,17 +620,17 @@ min_i(i, memo)
|
|||||||
static VALUE
|
static VALUE
|
||||||
min_ii(i, memo)
|
min_ii(i, memo)
|
||||||
VALUE i;
|
VALUE i;
|
||||||
NODE *memo;
|
VALUE *memo;
|
||||||
{
|
{
|
||||||
VALUE cmp;
|
VALUE cmp;
|
||||||
|
|
||||||
if (NIL_P(memo->u1.value)) {
|
if (NIL_P(*memo)) {
|
||||||
memo->u1.value = i;
|
*memo = i;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
cmp = rb_yield_values(2, i, memo->u1.value);
|
cmp = rb_yield_values(2, i, *memo);
|
||||||
if (rb_cmpint(cmp, i, memo->u1.value) < 0) {
|
if (rb_cmpint(cmp, i, *memo) < 0) {
|
||||||
memo->u1.value = i;
|
*memo = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return Qnil;
|
return Qnil;
|
||||||
@ -670,28 +655,26 @@ static VALUE
|
|||||||
enum_min(obj)
|
enum_min(obj)
|
||||||
VALUE obj;
|
VALUE obj;
|
||||||
{
|
{
|
||||||
VALUE result;
|
VALUE result = Qnil;
|
||||||
NODE *memo = rb_node_newnode(NODE_MEMO, Qnil, 0, 0);
|
|
||||||
|
|
||||||
rb_iterate(rb_each, obj, rb_block_given_p() ? min_ii : min_i, (VALUE)memo);
|
rb_iterate(rb_each, obj, rb_block_given_p() ? min_ii : min_i, (VALUE)&result);
|
||||||
result = memo->u1.value;
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
max_i(i, memo)
|
max_i(i, memo)
|
||||||
VALUE i;
|
VALUE i;
|
||||||
NODE *memo;
|
VALUE *memo;
|
||||||
{
|
{
|
||||||
VALUE cmp;
|
VALUE cmp;
|
||||||
|
|
||||||
if (NIL_P(memo->u1.value)) {
|
if (NIL_P(*memo)) {
|
||||||
memo->u1.value = i;
|
*memo = i;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
cmp = rb_funcall(i, id_cmp, 1, memo->u1.value);
|
cmp = rb_funcall(i, id_cmp, 1, *memo);
|
||||||
if (rb_cmpint(cmp, i, memo->u1.value) > 0) {
|
if (rb_cmpint(cmp, i, *memo) > 0) {
|
||||||
memo->u1.value = i;
|
*memo = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return Qnil;
|
return Qnil;
|
||||||
@ -700,17 +683,17 @@ max_i(i, memo)
|
|||||||
static VALUE
|
static VALUE
|
||||||
max_ii(i, memo)
|
max_ii(i, memo)
|
||||||
VALUE i;
|
VALUE i;
|
||||||
NODE *memo;
|
VALUE *memo;
|
||||||
{
|
{
|
||||||
VALUE cmp;
|
VALUE cmp;
|
||||||
|
|
||||||
if (NIL_P(memo->u1.value)) {
|
if (NIL_P(*memo)) {
|
||||||
memo->u1.value = i;
|
*memo = i;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
cmp = rb_yield_values(2, i, memo->u1.value);
|
cmp = rb_yield_values(2, i, *memo);
|
||||||
if (rb_cmpint(cmp, i, memo->u1.value) > 0) {
|
if (rb_cmpint(cmp, i, *memo) > 0) {
|
||||||
memo->u1.value = i;
|
*memo = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return Qnil;
|
return Qnil;
|
||||||
@ -734,29 +717,27 @@ static VALUE
|
|||||||
enum_max(obj)
|
enum_max(obj)
|
||||||
VALUE obj;
|
VALUE obj;
|
||||||
{
|
{
|
||||||
VALUE result;
|
VALUE result = Qnil;
|
||||||
NODE *memo = rb_node_newnode(NODE_MEMO, Qnil, 0, 0);
|
|
||||||
|
|
||||||
rb_iterate(rb_each, obj, rb_block_given_p() ? max_ii : max_i, (VALUE)memo);
|
rb_iterate(rb_each, obj, rb_block_given_p() ? max_ii : max_i, (VALUE)&result);
|
||||||
result = memo->u1.value;
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
min_by_i(i, memo)
|
min_by_i(i, memo)
|
||||||
VALUE i;
|
VALUE i;
|
||||||
NODE *memo;
|
VALUE *memo;
|
||||||
{
|
{
|
||||||
VALUE v;
|
VALUE v;
|
||||||
|
|
||||||
v = rb_yield(i);
|
v = rb_yield(i);
|
||||||
if (NIL_P(memo->u1.value)) {
|
if (NIL_P(memo[0])) {
|
||||||
memo->u1.value = v;
|
memo[0] = v;
|
||||||
memo->u2.value = i;
|
memo[1] = i;
|
||||||
}
|
}
|
||||||
else if (rb_cmpint(rb_funcall(v, id_cmp, 1, memo->u1.value), v, memo->u1.value) < 0) {
|
else if (rb_cmpint(rb_funcall(v, id_cmp, 1, memo[0]), v, memo[0]) < 0) {
|
||||||
memo->u1.value = v;
|
memo[0] = v;
|
||||||
memo->u2.value = i;
|
memo[1] = i;
|
||||||
}
|
}
|
||||||
return Qnil;
|
return Qnil;
|
||||||
}
|
}
|
||||||
@ -776,29 +757,29 @@ static VALUE
|
|||||||
enum_min_by(obj)
|
enum_min_by(obj)
|
||||||
VALUE obj;
|
VALUE obj;
|
||||||
{
|
{
|
||||||
VALUE result;
|
VALUE memo[2];
|
||||||
NODE *memo = rb_node_newnode(NODE_MEMO, Qnil, 0, 0);
|
|
||||||
|
|
||||||
|
rb_need_block();
|
||||||
|
memo[0] = memo[1] = Qnil;
|
||||||
rb_iterate(rb_each, obj, min_by_i, (VALUE)memo);
|
rb_iterate(rb_each, obj, min_by_i, (VALUE)memo);
|
||||||
result = memo->u2.value;
|
return memo[1];
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
max_by_i(i, memo)
|
max_by_i(i, memo)
|
||||||
VALUE i;
|
VALUE i;
|
||||||
NODE *memo;
|
VALUE *memo;
|
||||||
{
|
{
|
||||||
VALUE v;
|
VALUE v;
|
||||||
|
|
||||||
v = rb_yield(i);
|
v = rb_yield(i);
|
||||||
if (NIL_P(memo->u1.value)) {
|
if (NIL_P(memo[0])) {
|
||||||
memo->u1.value = v;
|
memo[0] = v;
|
||||||
memo->u2.value = i;
|
memo[1] = i;
|
||||||
}
|
}
|
||||||
else if (rb_cmpint(rb_funcall(v, id_cmp, 1, memo->u1.value), v, memo->u1.value) > 0) {
|
else if (rb_cmpint(rb_funcall(v, id_cmp, 1, memo[0]), v, memo[0]) > 0) {
|
||||||
memo->u1.value = v;
|
memo[0] = v;
|
||||||
memo->u2.value = i;
|
memo[1] = i;
|
||||||
}
|
}
|
||||||
return Qnil;
|
return Qnil;
|
||||||
}
|
}
|
||||||
@ -818,21 +799,21 @@ static VALUE
|
|||||||
enum_max_by(obj)
|
enum_max_by(obj)
|
||||||
VALUE obj;
|
VALUE obj;
|
||||||
{
|
{
|
||||||
VALUE result;
|
VALUE memo[2];
|
||||||
NODE *memo = rb_node_newnode(NODE_MEMO, Qnil, 0, 0);
|
|
||||||
|
|
||||||
|
rb_need_block();
|
||||||
|
memo[0] = memo[1] = Qnil;
|
||||||
rb_iterate(rb_each, obj, max_by_i, (VALUE)memo);
|
rb_iterate(rb_each, obj, max_by_i, (VALUE)memo);
|
||||||
result = memo->u2.value;
|
return memo[1];
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
member_i(item, memo)
|
member_i(item, memo)
|
||||||
VALUE item;
|
VALUE item;
|
||||||
NODE *memo;
|
VALUE *memo;
|
||||||
{
|
{
|
||||||
if (rb_equal(item, memo->u1.value)) {
|
if (rb_equal(item, memo[0])) {
|
||||||
memo->u2.value = Qtrue;
|
memo[1] = Qtrue;
|
||||||
rb_iter_break();
|
rb_iter_break();
|
||||||
}
|
}
|
||||||
return Qnil;
|
return Qnil;
|
||||||
@ -855,21 +836,21 @@ static VALUE
|
|||||||
enum_member(obj, val)
|
enum_member(obj, val)
|
||||||
VALUE obj, val;
|
VALUE obj, val;
|
||||||
{
|
{
|
||||||
VALUE result;
|
VALUE memo[2];
|
||||||
NODE *memo = rb_node_newnode(NODE_MEMO, val, Qfalse, 0);
|
|
||||||
|
|
||||||
|
memo[0] = val;
|
||||||
|
memo[1] = Qfalse;
|
||||||
rb_iterate(rb_each, obj, member_i, (VALUE)memo);
|
rb_iterate(rb_each, obj, member_i, (VALUE)memo);
|
||||||
result = memo->u2.value;
|
return memo[1];
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
each_with_index_i(val, memo)
|
each_with_index_i(val, memo)
|
||||||
VALUE val;
|
VALUE val;
|
||||||
NODE *memo;
|
VALUE *memo;
|
||||||
{
|
{
|
||||||
rb_yield_values(2, val, INT2FIX(memo->u3.cnt));
|
rb_yield_values(2, val, INT2FIX(*memo));
|
||||||
memo->u3.cnt++;
|
++*memo;
|
||||||
return Qnil;
|
return Qnil;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -892,20 +873,21 @@ static VALUE
|
|||||||
enum_each_with_index(obj)
|
enum_each_with_index(obj)
|
||||||
VALUE obj;
|
VALUE obj;
|
||||||
{
|
{
|
||||||
NODE *memo = rb_node_newnode(NODE_MEMO, 0, 0, 0);
|
VALUE memo = 0;
|
||||||
|
|
||||||
rb_iterate(rb_each, obj, each_with_index_i, (VALUE)memo);
|
rb_need_block();
|
||||||
|
rb_iterate(rb_each, obj, each_with_index_i, (VALUE)&memo);
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
zip_i(val, memo)
|
zip_i(val, memo)
|
||||||
VALUE val;
|
VALUE val;
|
||||||
NODE *memo;
|
VALUE *memo;
|
||||||
{
|
{
|
||||||
VALUE result = memo->u1.value;
|
VALUE result = memo[0];
|
||||||
VALUE args = memo->u2.value;
|
VALUE args = memo[1];
|
||||||
int idx = memo->u3.cnt++;
|
int idx = memo[2]++;
|
||||||
VALUE tmp;
|
VALUE tmp;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -954,13 +936,15 @@ enum_zip(argc, argv, obj)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
VALUE result;
|
VALUE result;
|
||||||
NODE *memo;
|
VALUE memo[3];
|
||||||
|
|
||||||
for (i=0; i<argc; i++) {
|
for (i=0; i<argc; i++) {
|
||||||
argv[i] = rb_convert_type(argv[i], T_ARRAY, "Array", "to_a");
|
argv[i] = rb_convert_type(argv[i], T_ARRAY, "Array", "to_a");
|
||||||
}
|
}
|
||||||
result = rb_block_given_p() ? Qnil : rb_ary_new();
|
result = rb_block_given_p() ? Qnil : rb_ary_new();
|
||||||
memo = rb_node_newnode(NODE_MEMO, result, rb_ary_new4(argc, argv), 0);
|
memo[0] = result;
|
||||||
|
memo[1] = rb_ary_new4(argc, argv);
|
||||||
|
memo[2] = 0;
|
||||||
rb_iterate(rb_each, obj, zip_i, (VALUE)memo);
|
rb_iterate(rb_each, obj, zip_i, (VALUE)memo);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
16
eval.c
16
eval.c
@ -4719,6 +4719,14 @@ break_jump(retval)
|
|||||||
static VALUE bmcall _((VALUE, VALUE));
|
static VALUE bmcall _((VALUE, VALUE));
|
||||||
static int method_arity _((VALUE));
|
static int method_arity _((VALUE));
|
||||||
|
|
||||||
|
void
|
||||||
|
rb_need_block()
|
||||||
|
{
|
||||||
|
if (!rb_block_given_p()) {
|
||||||
|
localjump_error("no block given", Qnil, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
rb_yield_0(val, self, klass, flags, avalue)
|
rb_yield_0(val, self, klass, flags, avalue)
|
||||||
VALUE val, self, klass; /* OK */
|
VALUE val, self, klass; /* OK */
|
||||||
@ -4736,9 +4744,7 @@ rb_yield_0(val, self, klass, flags, avalue)
|
|||||||
int lambda = flags & YIELD_LAMBDA_CALL;
|
int lambda = flags & YIELD_LAMBDA_CALL;
|
||||||
int state;
|
int state;
|
||||||
|
|
||||||
if (!rb_block_given_p()) {
|
rb_need_block();
|
||||||
localjump_error("no block given", Qnil, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
PUSH_VARS();
|
PUSH_VARS();
|
||||||
block = ruby_block;
|
block = ruby_block;
|
||||||
@ -6078,8 +6084,9 @@ backtrace(lev)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while (frame && (n = frame->node)) {
|
for (; frame && (n = frame->node); frame = frame->prev) {
|
||||||
if (frame->prev && frame->prev->this_func) {
|
if (frame->prev && frame->prev->this_func) {
|
||||||
|
if (frame->prev->node == n) continue;
|
||||||
snprintf(buf, BUFSIZ, "%s:%d:in `%s'",
|
snprintf(buf, BUFSIZ, "%s:%d:in `%s'",
|
||||||
n->nd_file, nd_line(n),
|
n->nd_file, nd_line(n),
|
||||||
rb_id2name(frame->prev->this_func));
|
rb_id2name(frame->prev->this_func));
|
||||||
@ -6088,7 +6095,6 @@ backtrace(lev)
|
|||||||
snprintf(buf, BUFSIZ, "%s:%d", n->nd_file, nd_line(n));
|
snprintf(buf, BUFSIZ, "%s:%d", n->nd_file, nd_line(n));
|
||||||
}
|
}
|
||||||
rb_ary_push(ary, rb_str_new2(buf));
|
rb_ary_push(ary, rb_str_new2(buf));
|
||||||
frame = frame->prev;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ary;
|
return ary;
|
||||||
|
1
ruby.h
1
ruby.h
@ -551,6 +551,7 @@ VALUE rb_yield _((VALUE));
|
|||||||
VALUE rb_yield_values __((int n, ...));
|
VALUE rb_yield_values __((int n, ...));
|
||||||
VALUE rb_yield_splat _((VALUE));
|
VALUE rb_yield_splat _((VALUE));
|
||||||
int rb_block_given_p _((void));
|
int rb_block_given_p _((void));
|
||||||
|
void rb_need_block _((void));
|
||||||
VALUE rb_iterate _((VALUE(*)(VALUE),VALUE,VALUE(*)(ANYARGS),VALUE));
|
VALUE rb_iterate _((VALUE(*)(VALUE),VALUE,VALUE(*)(ANYARGS),VALUE));
|
||||||
VALUE rb_rescue _((VALUE(*)(ANYARGS),VALUE,VALUE(*)(ANYARGS),VALUE));
|
VALUE rb_rescue _((VALUE(*)(ANYARGS),VALUE,VALUE(*)(ANYARGS),VALUE));
|
||||||
VALUE rb_rescue2 __((VALUE(*)(ANYARGS),VALUE,VALUE(*)(ANYARGS),VALUE,...));
|
VALUE rb_rescue2 __((VALUE(*)(ANYARGS),VALUE,VALUE(*)(ANYARGS),VALUE,...));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user