From b59a158a1870000ef1db5acd52afa1b40e2c4fe6 Mon Sep 17 00:00:00 2001 From: akr Date: Fri, 15 Apr 2016 16:26:38 +0000 Subject: * array.c (rb_ary_sum): Don't yield same element twice. Found by nagachika. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54609 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- array.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'array.c') diff --git a/array.c b/array.c index 5fe5800954..f0a212de08 100644 --- a/array.c +++ b/array.c @@ -5736,12 +5736,14 @@ rb_ary_sum(int argc, VALUE *argv, VALUE ary) f = NUM2DBL(v); c = 0.0; + goto has_float_value; for (; i < RARRAY_LEN(ary); i++) { double x, y, t; e = RARRAY_AREF(ary, i); if (block_given) e = rb_yield(e); if (RB_FLOAT_TYPE_P(e)) + has_float_value: x = RFLOAT_VALUE(e); else if (FIXNUM_P(e)) x = FIX2LONG(e); @@ -5763,10 +5765,12 @@ rb_ary_sum(int argc, VALUE *argv, VALUE ary) v = DBL2NUM(f); } + goto has_some_value; for (; i < RARRAY_LEN(ary); i++) { e = RARRAY_AREF(ary, i); if (block_given) e = rb_yield(e); + has_some_value: v = rb_funcall(v, idPLUS, 1, e); } return v; -- cgit v1.2.3