summaryrefslogtreecommitdiff
path: root/enumerator.c
diff options
context:
space:
mode:
authorshugo <shugo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-03-16 02:22:20 +0000
committershugo <shugo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-03-16 02:22:20 +0000
commit29f73009ca934cfa7b51d1de4d22933ab56dc602 (patch)
tree4aa491f74ddf6aa4ff8827e7c076c9a3fa8d0ed9 /enumerator.c
parenta1f4163dd330d2cddbde0fa3407713e2338a2e7b (diff)
* enumerator.c (lazy_take): don't enumerate an extra value.
[ruby-dev:45370] [Bug #6152] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35050 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
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);
}