summaryrefslogtreecommitdiff
path: root/array.c
diff options
context:
space:
mode:
authorJean Boussier <byroot@ruby-lang.org>2023-03-14 10:12:32 +0100
committerJean Boussier <jean.boussier@gmail.com>2023-03-15 09:12:59 +0000
commitca437aeb395e77125fcd2ab9bc83bbcd3e357610 (patch)
tree4177bcd2728e77b0fd1fed4c299681456bfe5b20 /array.c
parent6462c1a042fec4017f7e3bf2c13ec6a29efd23d6 (diff)
downloadruby-ca437aeb395e77125fcd2ab9bc83bbcd3e357610.tar.gz
rb_ary_sum: don't enter fast path if initial isn't a native numeric type.
[Bug #19530] If the initial value isn't one of the special cased types, we directly jump to the slow path.
Diffstat (limited to 'array.c')
-rw-r--r--array.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/array.c b/array.c
index 6a2f94c8b2..83d1c9ced6 100644
--- a/array.c
+++ b/array.c
@@ -8181,6 +8181,12 @@ rb_ary_sum(int argc, VALUE *argv, VALUE ary)
n = 0;
r = Qundef;
+
+ if (!FIXNUM_P(v) && !RB_BIGNUM_TYPE_P(v) && !RB_TYPE_P(v, T_RATIONAL)) {
+ i = 0;
+ goto init_is_a_value;
+ }
+
for (i = 0; i < RARRAY_LEN(ary); i++) {
e = RARRAY_AREF(ary, i);
if (block_given)
@@ -8265,6 +8271,7 @@ rb_ary_sum(int argc, VALUE *argv, VALUE ary)
}
goto has_some_value;
+ init_is_a_value:
for (; i < RARRAY_LEN(ary); i++) {
e = RARRAY_AREF(ary, i);
if (block_given)