mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* enum.c (enum_all): now works without block.
* enum.c (enum_any): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3344 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
ed8fb0876d
commit
a973f9698f
3 changed files with 35 additions and 4 deletions
32
enum.c
32
enum.c
|
@ -287,7 +287,7 @@ enum_sort_by(obj)
|
|||
}
|
||||
|
||||
static VALUE
|
||||
all_i(i, memo)
|
||||
all_iter_i(i, memo)
|
||||
VALUE i;
|
||||
NODE *memo;
|
||||
{
|
||||
|
@ -298,6 +298,18 @@ all_i(i, memo)
|
|||
return Qnil;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
all_i(i, memo)
|
||||
VALUE i;
|
||||
NODE *memo;
|
||||
{
|
||||
if (!RTEST(i)) {
|
||||
memo->u1.value = Qfalse;
|
||||
rb_iter_break();
|
||||
}
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
enum_all(obj)
|
||||
VALUE obj;
|
||||
|
@ -306,18 +318,30 @@ enum_all(obj)
|
|||
NODE *memo = rb_node_newnode(NODE_MEMO, Qnil, 0, 0);
|
||||
|
||||
memo->u1.value = Qtrue;
|
||||
rb_iterate(rb_each, obj, all_i, (VALUE)memo);
|
||||
rb_iterate(rb_each, obj, rb_block_given_p() ? all_iter_i : all_i, (VALUE)memo);
|
||||
result = memo->u1.value;
|
||||
rb_gc_force_recycle((VALUE)memo);
|
||||
return result;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
any_iter_i(i, memo)
|
||||
VALUE i;
|
||||
NODE *memo;
|
||||
{
|
||||
if (RTEST(rb_yield(i))) {
|
||||
memo->u1.value = Qtrue;
|
||||
rb_iter_break();
|
||||
}
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
any_i(i, memo)
|
||||
VALUE i;
|
||||
NODE *memo;
|
||||
{
|
||||
if (RTEST(rb_yield(i))) {
|
||||
if (RTEST(i)) {
|
||||
memo->u1.value = Qtrue;
|
||||
rb_iter_break();
|
||||
}
|
||||
|
@ -332,7 +356,7 @@ enum_any(obj)
|
|||
NODE *memo = rb_node_newnode(NODE_MEMO, Qnil, 0, 0);
|
||||
|
||||
memo->u1.value = Qfalse;
|
||||
rb_iterate(rb_each, obj, any_i, (VALUE)memo);
|
||||
rb_iterate(rb_each, obj, rb_block_given_p() ? any_iter_i : any_i, (VALUE)memo);
|
||||
result = memo->u1.value;
|
||||
rb_gc_force_recycle((VALUE)memo);
|
||||
return result;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue