Skip to content

Commit

Permalink
array.c (rb_ary_zip): take only as many as needed from an Enumerator (#…
Browse files Browse the repository at this point in the history
…4389)

[Bug #17814]
  • Loading branch information
mame committed Apr 21, 2021
1 parent d427e3c commit fb04c69
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 2 deletions.
4 changes: 2 additions & 2 deletions array.c
Expand Up @@ -4311,10 +4311,9 @@ static VALUE
take_i(RB_BLOCK_CALL_FUNC_ARGLIST(val, cbarg))
{
VALUE *args = (VALUE *)cbarg;
if (args[1] == 0) rb_iter_break();
else args[1]--;
if (argc > 1) val = rb_ary_new4(argc, argv);
rb_ary_push(args[0], val);
if (--args[1] == 0) rb_iter_break();
return Qnil;
}

Expand All @@ -4324,6 +4323,7 @@ take_items(VALUE obj, long n)
VALUE result = rb_check_array_type(obj);
VALUE args[2];

if (n == 0) return result;
if (!NIL_P(result)) return rb_ary_subseq(result, 0, n);
result = rb_ary_new2(n);
args[0] = result; args[1] = (VALUE)n;
Expand Down
11 changes: 11 additions & 0 deletions test/ruby/test_array.rb
Expand Up @@ -2735,6 +2735,17 @@ def r.respond_to?(*)
assert_equal [[42, 1]], [42].zip(r), bug8153
end

def test_zip_with_enumerator
bug17814 = "ruby-core:103513"

step = 0.step
e = Enumerator.produce { step.next }
a = %w(a b c)
assert_equal([["a", 0], ["b", 1], ["c", 2]], a.zip(e))
assert_equal([["a", 3], ["b", 4], ["c", 5]], a.zip(e))
assert_equal([["a", 6], ["b", 7], ["c", 8]], a.zip(e))
end

def test_transpose
assert_equal([[1, :a], [2, :b], [3, :c]],
[[1, 2, 3], [:a, :b, :c]].transpose)
Expand Down

0 comments on commit fb04c69

Please sign in to comment.