diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | enumerator.c | 6 | ||||
-rw-r--r-- | test/ruby/test_lazy_enumerator.rb | 5 |
3 files changed, 16 insertions, 0 deletions
@@ -1,3 +1,8 @@ +Thu Jan 24 16:47:26 2013 Marc-Andre Lafortune <ruby-core@marc-andre.ca> + + * enumerator.c (lazy_zip): raise error for bad arguments + [Bug #7706] + Thu Jan 24 16:05:08 2013 Marc-Andre Lafortune <ruby-core@marc-andre.ca> * enumerator.c: Optimize Lazy#zip when passed only arrays diff --git a/enumerator.c b/enumerator.c index 62dbf57070..71f473a854 100644 --- a/enumerator.c +++ b/enumerator.c @@ -1663,6 +1663,12 @@ lazy_zip(int argc, VALUE *argv, VALUE obj) for (i = 0; i < argc; i++) { v = rb_check_array_type(argv[i]); if (NIL_P(v)) { + for (; i < argc; i++) { + if (!rb_respond_to(argv[i], id_each)) { + rb_raise(rb_eTypeError, "wrong argument type %s (must respond to :each)", + rb_obj_classname(argv[i])); + } + } ary = rb_ary_new4(argc, argv); func = lazy_zip_func; break; diff --git a/test/ruby/test_lazy_enumerator.rb b/test/ruby/test_lazy_enumerator.rb index 3d05d333fb..65f0446b52 100644 --- a/test/ruby/test_lazy_enumerator.rb +++ b/test/ruby/test_lazy_enumerator.rb @@ -213,6 +213,11 @@ class TestLazyEnumerator < Test::Unit::TestCase assert_equal(1, a.current) end + def test_zip_bad_arg + a = Step.new(1..3) + assert_raise(TypeError){ a.lazy.zip(42) } + end + def test_zip_with_block # zip should be eager when a block is given a = Step.new(1..3) |