aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--numeric.c8
2 files changed, 10 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 25cd562c99..b14b9d6c78 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Sun Mar 20 18:53:49 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * numeric.c (fix_gt, fix_ge, fix_lt, fix_le): optimize comparisons
+ Fixnum against Bignum by rb_big_cmp in inversed order without
+ new Bignum instance.
+
Sun Mar 20 18:44:52 2016 NARUSE, Yui <naruse@ruby-lang.org>
* time.c (add): remove FIXABLE() which is in LONG2NUM().
diff --git a/numeric.c b/numeric.c
index 38e05b6292..4293374a64 100644
--- a/numeric.c
+++ b/numeric.c
@@ -3482,7 +3482,7 @@ fix_gt(VALUE x, VALUE y)
return Qfalse;
}
else if (RB_TYPE_P(y, T_BIGNUM)) {
- return FIX2INT(rb_big_cmp(rb_int2big(FIX2LONG(x)), y)) > 0 ? Qtrue : Qfalse;
+ return rb_big_cmp(y, x) == INT2FIX(-1) ? Qtrue : Qfalse;
}
else if (RB_TYPE_P(y, T_FLOAT)) {
return rb_integer_float_cmp(x, y) == INT2FIX(1) ? Qtrue : Qfalse;
@@ -3508,7 +3508,7 @@ fix_ge(VALUE x, VALUE y)
return Qfalse;
}
else if (RB_TYPE_P(y, T_BIGNUM)) {
- return FIX2INT(rb_big_cmp(rb_int2big(FIX2LONG(x)), y)) >= 0 ? Qtrue : Qfalse;
+ return rb_big_cmp(y, x) != INT2FIX(+1) ? Qtrue : Qfalse;
}
else if (RB_TYPE_P(y, T_FLOAT)) {
VALUE rel = rb_integer_float_cmp(x, y);
@@ -3534,7 +3534,7 @@ fix_lt(VALUE x, VALUE y)
return Qfalse;
}
else if (RB_TYPE_P(y, T_BIGNUM)) {
- return FIX2INT(rb_big_cmp(rb_int2big(FIX2LONG(x)), y)) < 0 ? Qtrue : Qfalse;
+ return rb_big_cmp(y, x) == INT2FIX(+1) ? Qtrue : Qfalse;
}
else if (RB_TYPE_P(y, T_FLOAT)) {
return rb_integer_float_cmp(x, y) == INT2FIX(-1) ? Qtrue : Qfalse;
@@ -3560,7 +3560,7 @@ fix_le(VALUE x, VALUE y)
return Qfalse;
}
else if (RB_TYPE_P(y, T_BIGNUM)) {
- return FIX2INT(rb_big_cmp(rb_int2big(FIX2LONG(x)), y)) <= 0 ? Qtrue : Qfalse;
+ return rb_big_cmp(y, x) != INT2FIX(-1) ? Qtrue : Qfalse;
}
else if (RB_TYPE_P(y, T_FLOAT)) {
VALUE rel = rb_integer_float_cmp(x, y);