From 0a607bc8f8101190e0684df2e4cea08cc562a5b0 Mon Sep 17 00:00:00 2001 From: mrkn Date: Thu, 17 Mar 2016 17:15:33 +0000 Subject: * numeric.c (int_even_p): treat Fixnum and Bignum values directly. I forgot include this commit in the previous one. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54165 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 +++++- numeric.c | 10 +++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index eb7a8df914..41422225a8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Fri Mar 18 02:15:00 2016 Kenta Murata + + * numeric.c (int_even_p): treat Fixnum and Bignum values directly. + Fri Mar 18 02:07:00 2016 Kenta Murata * bignum.c (Bignum#even?, Bignum#odd?): remove definitions @@ -7,7 +11,7 @@ Fri Mar 18 02:07:00 2016 Kenta Murata definitions because they are unified with Numeric#zero?, Integer#even?, and Integer#odd?. - * numeric.c (num_zero_p, int_even_p, int_odd_p): treat Fixnum and + * numeric.c (num_zero_p, int_odd_p): treat Fixnum and Bignum values directly. * test/ruby/test_integer.rb (test_odd_p_even_p): remove meaningless diff --git a/numeric.c b/numeric.c index 02ccda09dd..59f27a575e 100644 --- a/numeric.c +++ b/numeric.c @@ -2702,7 +2702,15 @@ int_odd_p(VALUE num) static VALUE int_even_p(VALUE num) { - if (rb_funcall(num, '%', 1, INT2FIX(2)) == INT2FIX(0)) { + if (FIXNUM_P(num)) { + if ((num & 2) == 0) { + return Qtrue; + } + } + else if (RB_TYPE_P(num, T_BIGNUM)) { + return rb_big_even_p(num); + } + else if (rb_funcall(num, '%', 1, INT2FIX(2)) == INT2FIX(0)) { return Qtrue; } return Qfalse; -- cgit v1.2.3