summaryrefslogtreecommitdiff
path: root/enum.c
diff options
context:
space:
mode:
Diffstat (limited to 'enum.c')
-rw-r--r--enum.c29
1 files changed, 13 insertions, 16 deletions
diff --git a/enum.c b/enum.c
index dc7e2112a4..2825855d53 100644
--- a/enum.c
+++ b/enum.c
@@ -33,11 +33,11 @@ grep_i(i, arg)
}
static VALUE
-grep_iter_i(i, pat)
- VALUE i, pat;
+grep_iter_i(i, arg)
+ VALUE i, *arg;
{
- if (RTEST(rb_funcall(pat, id_eqq, 1, i))) {
- rb_yield(i);
+ if (RTEST(rb_funcall(arg[0], id_eqq, 1, i))) {
+ rb_ary_push(arg[1], rb_yield(i));
}
return Qnil;
}
@@ -46,19 +46,16 @@ static VALUE
enum_grep(obj, pat)
VALUE obj, pat;
{
+ VALUE tmp, arg[2];
+
+ arg[0] = pat; arg[1] = tmp = rb_ary_new();
if (rb_iterator_p()) {
- rb_iterate(rb_each, obj, grep_iter_i, pat);
- return obj;
+ rb_iterate(rb_each, obj, grep_iter_i, (VALUE)arg);
}
else {
- VALUE tmp, arg[2];
-
- arg[0] = pat; arg[1] = tmp = rb_ary_new();
rb_iterate(rb_each, obj, grep_i, (VALUE)arg);
-
- if (RARRAY(tmp)->len == 0) return Qnil;
- return tmp;
}
+ return tmp;
}
struct find_arg {
@@ -201,7 +198,7 @@ min_i(i, min)
*min = i;
else {
cmp = rb_funcall(i, id_cmp, 1, *min);
- if (FIX2LONG(cmp) < 0)
+ if (NUM2LONG(cmp) < 0)
*min = i;
}
return Qnil;
@@ -217,7 +214,7 @@ min_ii(i, min)
*min = i;
else {
cmp = rb_yield(rb_assoc_new(i, *min));
- if (FIX2LONG(cmp) < 0)
+ if (NUM2LONG(cmp) < 0)
*min = i;
}
return Qnil;
@@ -243,7 +240,7 @@ max_i(i, max)
*max = i;
else {
cmp = rb_funcall(i, id_cmp, 1, *max);
- if (FIX2LONG(cmp) > 0)
+ if (NUM2LONG(cmp) > 0)
*max = i;
}
return Qnil;
@@ -259,7 +256,7 @@ max_ii(i, max)
*max = i;
else {
cmp = rb_yield(rb_assoc_new(i, *max));
- if (FIX2LONG(cmp) > 0)
+ if (NUM2LONG(cmp) > 0)
*max = i;
}
return Qnil;