summaryrefslogtreecommitdiff
path: root/enumerator.c
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-12-01 04:30:19 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-12-01 04:30:19 +0000
commit6fafbfd63e9f56350e06910bbac70bf7ff0d5df0 (patch)
tree339f523964f7af8c0c8cd90acb06d38486ec5dbf /enumerator.c
parent4afa82056c42f9f2010fbc9d17c5aa3887610e2b (diff)
* insnhelper.ci (vm_yield_with_cfunc): fix to passing argc on third
parameter of IFUNC. [ruby-dev:32329] * enumerator.c: fix to pass exact number of argument. * eval.c (rb_yield_values2): added. * include/ruby/ruby.h: ditto. * bootstraptest/test_knownbug.rb: move a fixed test. * bootstraptest/test_block.rb: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@14062 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'enumerator.c')
-rw-r--r--enumerator.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/enumerator.c b/enumerator.c
index 487ce51bb9..ffa892adea 100644
--- a/enumerator.c
+++ b/enumerator.c
@@ -36,7 +36,7 @@ proc_call(VALUE proc, VALUE args)
}
struct enumerator;
-typedef VALUE enum_iter(VALUE, struct enumerator *);
+typedef VALUE enum_iter(VALUE, struct enumerator *, VALUE);
struct enumerator {
VALUE method;
@@ -77,7 +77,7 @@ enumerator_ptr(VALUE obj)
}
static VALUE
-enumerator_iter_i(VALUE i, struct enumerator *e)
+enumerator_iter_i(VALUE i, struct enumerator *e, VALUE argc)
{
return rb_yield(proc_call(e->proc, i));
}
@@ -225,6 +225,17 @@ enumerator_allocate(VALUE klass)
}
static VALUE
+enumerator_each_i(VALUE v, VALUE enum_obj, VALUE argc)
+{
+ if (argc == 1) {
+ return rb_yield(v);
+ }
+ else {
+ return rb_yield_values2(argc, RARRAY_PTR(v));
+ }
+}
+
+static VALUE
enumerator_init(VALUE enum_obj, VALUE obj, VALUE meth, int argc, VALUE *argv)
{
struct enumerator *ptr = enumerator_ptr(enum_obj);
@@ -235,7 +246,7 @@ enumerator_init(VALUE enum_obj, VALUE obj, VALUE meth, int argc, VALUE *argv)
ptr->iter = enumerator_iter_i;
}
else {
- ptr->iter = (enum_iter *)rb_yield;
+ ptr->iter = (enum_iter *)enumerator_each_i;
}
if (argc) ptr->args = rb_ary_new4(argc, argv);
ptr->fib = 0;