diff options
author | Jean Boussier <byroot@ruby-lang.org> | 2023-03-14 10:12:32 +0100 |
---|---|---|
committer | Jean Boussier <jean.boussier@gmail.com> | 2023-03-15 09:12:59 +0000 |
commit | ca437aeb395e77125fcd2ab9bc83bbcd3e357610 (patch) | |
tree | 4177bcd2728e77b0fd1fed4c299681456bfe5b20 /array.c | |
parent | 6462c1a042fec4017f7e3bf2c13ec6a29efd23d6 (diff) |
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.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/7519
Diffstat (limited to 'array.c')
-rw-r--r-- | array.c | 7 |
1 files changed, 7 insertions, 0 deletions
@@ -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) |