mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Extract int_range_sum from enum_sum
* enum.c (enum_sum, int_range_sum): Extract int_range_sum from enum_sum. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55040 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
7f860741b9
commit
eb9c9964b0
2 changed files with 27 additions and 17 deletions
|
@ -1,3 +1,8 @@
|
|||
Wed May 18 09:14:00 2016 Kenta Murata <mrkn@mrkn.jp>
|
||||
|
||||
* enum.c (enum_sum, int_range_sum): Extract int_range_sum from
|
||||
enum_sum.
|
||||
|
||||
Wed May 18 03:16:06 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* re.c (match_values_at): fix regression at r55036.
|
||||
|
@ -15,7 +20,7 @@ Wed May 18 01:57:43 2016 NARUSE, Yui <naruse@ruby-lang.org>
|
|||
|
||||
* re.c (namev_to_backref_number): separeted.
|
||||
|
||||
Tue May 18 00:05:00 2016 Kenta Murata <mrkn@mrkn.jp>
|
||||
Wed May 18 00:05:00 2016 Kenta Murata <mrkn@mrkn.jp>
|
||||
|
||||
* enum.c (enum_sum): Optimize for a range from int to int.
|
||||
|
||||
|
|
37
enum.c
37
enum.c
|
@ -3666,6 +3666,26 @@ enum_sum_iter_i(RB_BLOCK_CALL_FUNC_ARGLIST(i, args))
|
|||
return Qnil;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
int_range_sum(VALUE beg, VALUE end, int excl, VALUE init)
|
||||
{
|
||||
if (excl) {
|
||||
if (FIXNUM_P(end))
|
||||
end = LONG2FIX(FIX2LONG(end) - 1);
|
||||
else
|
||||
end = rb_big_minus(end, LONG2FIX(1));
|
||||
}
|
||||
|
||||
if (rb_int_ge(end, beg)) {
|
||||
VALUE a;
|
||||
a = rb_int_plus(rb_int_minus(end, beg), LONG2FIX(1));
|
||||
a = rb_int_mul(a, rb_int_plus(end, beg));
|
||||
a = rb_int_idiv(a, LONG2FIX(2));
|
||||
return rb_int_plus(init, a);
|
||||
}
|
||||
|
||||
return init;
|
||||
}
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
|
@ -3719,22 +3739,7 @@ enum_sum(int argc, VALUE* argv, VALUE obj)
|
|||
if (!memo.block_given && !memo.float_value &&
|
||||
(FIXNUM_P(beg) || RB_TYPE_P(beg, T_BIGNUM)) &&
|
||||
(FIXNUM_P(end) || RB_TYPE_P(end, T_BIGNUM))) {
|
||||
if (excl) {
|
||||
if (FIXNUM_P(end))
|
||||
end = LONG2FIX(FIX2LONG(end) - 1);
|
||||
else
|
||||
end = rb_big_minus(end, LONG2FIX(1));
|
||||
}
|
||||
if (rb_int_ge(end, beg)) {
|
||||
VALUE a;
|
||||
a = rb_int_plus(rb_int_minus(end, beg), LONG2FIX(1));
|
||||
a = rb_int_mul(a, rb_int_plus(end, beg));
|
||||
a = rb_int_idiv(a, LONG2FIX(2));
|
||||
return rb_int_plus(memo.v, a);
|
||||
}
|
||||
else {
|
||||
return memo.v;
|
||||
}
|
||||
return int_range_sum(beg, end, excl, memo.v);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue