aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorshugo <shugo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-03-15 09:25:03 +0000
committershugo <shugo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-03-15 09:25:03 +0000
commit032861ade7bdbe2c7e939b9b2995ed2ad1a1cdc6 (patch)
treec0987238bc8ffa9318d11ec41880bd29f1bfe30d
parentff1f6107f98261774739a6824fa80b1eba7b58ef (diff)
downloadruby-032861ade7bdbe2c7e939b9b2995ed2ad1a1cdc6.tar.gz
* enumerator.c (lazy_zip, lazy_cycle): Enumerator::Lazy#{zip,cycle}
should be eager when a block is given, to be consistent with Enumerable#{zip,cycle}. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35041 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog6
-rw-r--r--enumerator.c31
-rw-r--r--test/ruby/test_lazy_enumerator.rb18
3 files changed, 28 insertions, 27 deletions
diff --git a/ChangeLog b/ChangeLog
index e34ebaca78..5231b8c026 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Thu Mar 15 18:19:53 2012 Shugo Maeda <shugo@ruby-lang.org>
+
+ * enumerator.c (lazy_zip, lazy_cycle): Enumerator::Lazy#{zip,cycle}
+ should be eager when a block is given, to be consistent with
+ Enumerable#{zip,cycle}.
+
Thu Mar 15 17:45:27 2012 Shugo Maeda <shugo@ruby-lang.org>
* enumerator.c (InitVM_Enumerator): renamed Enumerable::Lazy to
diff --git a/enumerator.c b/enumerator.c
index 5f0cecb23a..ea4d4fcbe4 100644
--- a/enumerator.c
+++ b/enumerator.c
@@ -1374,24 +1374,6 @@ lazy_grep(VALUE obj, VALUE pattern)
}
static VALUE
-lazy_zip_func_i(VALUE val, VALUE arg, int argc, VALUE *argv)
-{
- VALUE yielder, ary, v, result;
- long i;
-
- yielder = argv[0];
- ary = rb_ary_new2(RARRAY_LEN(arg) + 1);
- rb_ary_push(ary, argv[1]);
- for (i = 0; i < RARRAY_LEN(arg); i++) {
- v = rb_funcall(RARRAY_PTR(arg)[i], id_next, 0);
- rb_ary_push(ary, v);
- }
- result = rb_yield(ary);
- rb_funcall(yielder, id_yield, 1, result);
- return Qnil;
-}
-
-static VALUE
lazy_zip_func(VALUE val, VALUE arg, int argc, VALUE *argv)
{
VALUE yielder, ary, v;
@@ -1414,14 +1396,15 @@ lazy_zip(int argc, VALUE *argv, VALUE obj)
VALUE ary;
int i;
+ if (rb_block_given_p()) {
+ return rb_call_super(argc, argv);
+ }
ary = rb_ary_new2(argc);
for (i = 0; i < argc; i++) {
rb_ary_push(ary, rb_funcall(argv[i], id_lazy, 0));
}
- return rb_block_call(rb_cLazy, id_new, 1, &obj,
- rb_block_given_p() ? lazy_zip_func_i : lazy_zip_func,
- ary);
+ return rb_block_call(rb_cLazy, id_new, 1, &obj, lazy_zip_func, ary);
}
static VALUE
@@ -1528,6 +1511,9 @@ lazy_cycle(int argc, VALUE *argv, VALUE obj)
VALUE args;
int len = rb_long2int((long)argc + 2);
+ if (rb_block_given_p()) {
+ return rb_call_super(argc, argv);
+ }
args = rb_ary_tmp_new(len);
rb_ary_push(args, obj);
rb_ary_push(args, sym_cycle);
@@ -1535,8 +1521,7 @@ lazy_cycle(int argc, VALUE *argv, VALUE obj)
rb_ary_cat(args, argv, argc);
}
return rb_block_call(rb_cLazy, id_new, len, RARRAY_PTR(args),
- rb_block_given_p() ? lazy_map_func : lazy_cycle_func,
- args /* prevent from GC */);
+ lazy_cycle_func, args /* prevent from GC */);
}
static VALUE
diff --git a/test/ruby/test_lazy_enumerator.rb b/test/ruby/test_lazy_enumerator.rb
index 7450875fc0..f6fc870fb6 100644
--- a/test/ruby/test_lazy_enumerator.rb
+++ b/test/ruby/test_lazy_enumerator.rb
@@ -139,9 +139,12 @@ class TestLazyEnumerator < Test::Unit::TestCase
end
def test_zip_with_block
+ # zip should be eager when a block is given
a = Step.new(1..3)
- assert_equal(["a", 1], a.lazy.zip("a".."c") {|x, y| [y, x]}.first)
- assert_equal(1, a.current)
+ ary = []
+ assert_equal(nil, a.lazy.zip("a".."c") {|x, y| ary << [x, y]})
+ assert_equal(a.zip("a".."c"), ary)
+ assert_equal(3, a.current)
end
def test_take
@@ -190,8 +193,15 @@ class TestLazyEnumerator < Test::Unit::TestCase
assert_equal(3, a.current)
assert_equal("1", a.lazy.cycle(2).map(&:to_s).first)
assert_equal(1, a.current)
- assert_equal("1", a.lazy.cycle(2, &:to_s).first)
- assert_equal(1, a.current)
+ end
+
+ def test_cycle_with_block
+ # cycle should be eager when a block is given
+ a = Step.new(1..3)
+ ary = []
+ assert_equal(nil, a.lazy.cycle(2) {|i| ary << i})
+ assert_equal(a.cycle(2).to_a, ary)
+ assert_equal(3, a.current)
end
def test_force