aboutsummaryrefslogtreecommitdiffstats
path: root/enumerator.c
diff options
context:
space:
mode:
Diffstat (limited to 'enumerator.c')
-rw-r--r--enumerator.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/enumerator.c b/enumerator.c
index c473260479..0edf2177fa 100644
--- a/enumerator.c
+++ b/enumerator.c
@@ -1449,10 +1449,13 @@ lazy_take_func(VALUE val, VALUE args, int argc, VALUE *argv)
{
NODE *memo = RNODE(args);
- if (memo->u3.cnt == 0) return Qundef;
rb_funcall2(argv[0], id_yield, argc - 1, argv + 1);
- memo->u3.cnt--;
- return Qnil;
+ if (--memo->u3.cnt == 0) {
+ return Qundef;
+ }
+ else {
+ return Qnil;
+ }
}
static VALUE
@@ -1460,12 +1463,20 @@ lazy_take(VALUE obj, VALUE n)
{
NODE *memo;
long len = NUM2LONG(n);
+ int argc = 1;
+ VALUE argv[3];
if (len < 0) {
rb_raise(rb_eArgError, "attempt to take negative size");
}
+ argv[0] = obj;
+ if (len == 0) {
+ argv[1] = sym_cycle;
+ argv[2] = INT2NUM(0);
+ argc = 3;
+ }
memo = NEW_MEMO(0, 0, len);
- return rb_block_call(rb_cLazy, id_new, 1, &obj, lazy_take_func,
+ return rb_block_call(rb_cLazy, id_new, argc, argv, lazy_take_func,
(VALUE) memo);
}