From fb04c69418ceee696a114fe31279cf3a5ea16d30 Mon Sep 17 00:00:00 2001 From: Yusuke Endoh Date: Wed, 21 Apr 2021 13:02:29 +0900 Subject: array.c (rb_ary_zip): take only as many as needed from an Enumerator (#4389) [Bug #17814] --- array.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'array.c') diff --git a/array.c b/array.c index f97be64655..76f11581d2 100644 --- a/array.c +++ b/array.c @@ -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; } @@ -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; -- cgit v1.2.3