aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog15
-rw-r--r--bignum.c2
-rw-r--r--numeric.c23
-rw-r--r--test/ruby/test_integer.rb20
4 files changed, 33 insertions, 27 deletions
diff --git a/ChangeLog b/ChangeLog
index ca38586c19..eb7a8df914 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+Fri Mar 18 02:07:00 2016 Kenta Murata <mrkn@mrkn.jp>
+
+ * bignum.c (Bignum#even?, Bignum#odd?): remove definitions
+ because they are unified with Integer#even? and Integer#odd?.
+
+ * numeric.c (Fixnum#zero?, Fixnum#even?, Fixnum#odd?): remove
+ 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
+ Bignum values directly.
+
+ * test/ruby/test_integer.rb (test_odd_p_even_p): remove meaningless
+ test case.
+
Fri Mar 18 01:51:00 2016 Kenta Murata <mrkn@mrkn.jp>
* bignum.c (rb_big_even_p, rb_big_odd_p): make them public functions
diff --git a/bignum.c b/bignum.c
index 365bd3efc5..5da5813703 100644
--- a/bignum.c
+++ b/bignum.c
@@ -7091,8 +7091,6 @@ Init_Bignum(void)
rb_define_method(rb_cBignum, "magnitude", rb_big_abs, 0);
rb_define_method(rb_cBignum, "size", rb_big_size, 0);
rb_define_method(rb_cBignum, "bit_length", rb_big_bit_length, 0);
- rb_define_method(rb_cBignum, "odd?", rb_big_odd_p, 0);
- rb_define_method(rb_cBignum, "even?", rb_big_even_p, 0);
#ifdef USE_GMP
/* The version of loaded GMP. */
diff --git a/numeric.c b/numeric.c
index 2c382bb498..02ccda09dd 100644
--- a/numeric.c
+++ b/numeric.c
@@ -605,7 +605,15 @@ num_abs(VALUE num)
static VALUE
num_zero_p(VALUE num)
{
- if (rb_equal(num, INT2FIX(0))) {
+ if (FIXNUM_P(num)) {
+ if (FIX2LONG(num) == 0) {
+ return Qtrue;
+ }
+ }
+ else if (RB_TYPE_P(num, T_BIGNUM)) {
+ return rb_bigzero_p(num);
+ }
+ else if (rb_equal(num, INT2FIX(0))) {
return Qtrue;
}
return Qfalse;
@@ -2670,7 +2678,15 @@ int_int_p(VALUE num)
static VALUE
int_odd_p(VALUE num)
{
- if (rb_funcall(num, '%', 1, INT2FIX(2)) != INT2FIX(0)) {
+ if (FIXNUM_P(num)) {
+ if (num & 2) {
+ return Qtrue;
+ }
+ }
+ else if (RB_TYPE_P(num, T_BIGNUM)) {
+ return rb_big_odd_p(num);
+ }
+ else if (rb_funcall(num, '%', 1, INT2FIX(2)) != INT2FIX(0)) {
return Qtrue;
}
return Qfalse;
@@ -4268,9 +4284,6 @@ Init_Numeric(void)
rb_define_method(rb_cFixnum, "to_f", fix_to_f, 0);
rb_define_method(rb_cFixnum, "size", fix_size, 0);
rb_define_method(rb_cFixnum, "bit_length", rb_fix_bit_length, 0);
- rb_define_method(rb_cFixnum, "zero?", fix_zero_p, 0);
- rb_define_method(rb_cFixnum, "odd?", fix_odd_p, 0);
- rb_define_method(rb_cFixnum, "even?", fix_even_p, 0);
rb_define_method(rb_cFixnum, "succ", fix_succ, 0);
rb_cFloat = rb_define_class("Float", rb_cNumeric);
diff --git a/test/ruby/test_integer.rb b/test/ruby/test_integer.rb
index 64b8e1e2c1..d75926f004 100644
--- a/test/ruby/test_integer.rb
+++ b/test/ruby/test_integer.rb
@@ -105,26 +105,6 @@ class TestInteger < Test::Unit::TestCase
assert_predicate(1, :integer?)
end
- def test_odd_p_even_p
- Fixnum.class_eval do
- alias odd_bak odd?
- alias even_bak even?
- remove_method :odd?, :even?
- end
-
- assert_predicate(1, :odd?)
- assert_not_predicate(2, :odd?)
- assert_not_predicate(1, :even?)
- assert_predicate(2, :even?)
-
- ensure
- Fixnum.class_eval do
- alias odd? odd_bak
- alias even? even_bak
- remove_method :odd_bak, :even_bak
- end
- end
-
def test_succ
assert_equal(2, 1.send(:succ))