aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--enum.c37
2 files changed, 27 insertions, 17 deletions
diff --git a/ChangeLog b/ChangeLog
index b422f0ed0c..39ac789454 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
diff --git a/enum.c b/enum.c
index 54e1364de7..67cc301f02 100644
--- a/enum.c
+++ b/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);
}
}