ruby-changes:47920
From: nobu <ko1@a...>
Date: Wed, 27 Sep 2017 11:55:07 +0900 (JST)
Subject: [ruby-changes:47920] nobu:r60041 (trunk): complex.c: no overflow
nobu 2017-09-27 11:55:03 +0900 (Wed, 27 Sep 2017) New Revision: 60041 https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=60041 Log: complex.c: no overflow * complex.c (rb_complex_infinite_p): get rid of overflow and unnecessary multiplication. Modified files: trunk/complex.c trunk/numeric.c trunk/test/ruby/test_complex.rb Index: numeric.c =================================================================== --- numeric.c (revision 60040) +++ numeric.c (revision 60041) @@ -1743,8 +1743,8 @@ flo_is_nan_p(VALUE num) https://github.com/ruby/ruby/blob/trunk/numeric.c#L1743 * (+1.0/0.0).infinite? #=> 1 */ -static VALUE -flo_is_infinite_p(VALUE num) +VALUE +rb_flo_is_infinite_p(VALUE num) { double value = RFLOAT_VALUE(num); @@ -5591,7 +5591,7 @@ Init_Numeric(void) https://github.com/ruby/ruby/blob/trunk/numeric.c#L5591 rb_define_method(rb_cFloat, "truncate", flo_truncate, -1); rb_define_method(rb_cFloat, "nan?", flo_is_nan_p, 0); - rb_define_method(rb_cFloat, "infinite?", flo_is_infinite_p, 0); + rb_define_method(rb_cFloat, "infinite?", rb_flo_is_infinite_p, 0); rb_define_method(rb_cFloat, "finite?", rb_flo_is_finite_p, 0); rb_define_method(rb_cFloat, "next_float", flo_next_float, 0); rb_define_method(rb_cFloat, "prev_float", flo_prev_float, 0); Index: test/ruby/test_complex.rb =================================================================== --- test/ruby/test_complex.rb (revision 60040) +++ test/ruby/test_complex.rb (revision 60041) @@ -850,6 +850,9 @@ class Complex_Test < Test::Unit::TestCas https://github.com/ruby/ruby/blob/trunk/test/ruby/test_complex.rb#L850 assert_equal(1, Complex(-1, Float::INFINITY).infinite?) assert_equal(1, Complex(1, -Float::INFINITY).infinite?) assert_equal(1, Complex(-1, -Float::INFINITY).infinite?) + assert_nil(Complex(Float::MAX, 0.0).infinite?) + assert_nil(Complex(0.0, Float::MAX).infinite?) + assert_nil(Complex(Float::MAX, Float::MAX).infinite?) end def test_supp Index: complex.c =================================================================== --- complex.c (revision 60040) +++ complex.c (revision 60041) @@ -253,6 +253,22 @@ f_finite_p(VALUE x) https://github.com/ruby/ruby/blob/trunk/complex.c#L253 return RTEST(rb_funcallv(x, id_finite_p, 0, 0)); } +VALUE rb_flo_is_infinite_p(VALUE num); +inline static VALUE +f_infinite_p(VALUE x) +{ + if (RB_INTEGER_TYPE_P(x)) { + return Qnil; + } + else if (RB_FLOAT_TYPE_P(x)) { + return rb_flo_is_infinite_p(x); + } + else if (RB_TYPE_P(x, T_RATIONAL)) { + return Qnil; + } + return rb_funcallv(x, id_infinite_p, 0, 0); +} + inline static int f_kind_of_p(VALUE x, VALUE c) { @@ -1367,21 +1383,12 @@ rb_complex_finite_p(VALUE self) https://github.com/ruby/ruby/blob/trunk/complex.c#L1383 static VALUE rb_complex_infinite_p(VALUE self) { - VALUE magnitude = nucomp_abs(self); + get_dat1(self); - if (FINITE_TYPE_P(magnitude)) { - return Qnil; - } - if (RB_FLOAT_TYPE_P(magnitude)) { - const double f = RFLOAT_VALUE(magnitude); - if (isinf(f)) { - return ONE; - } + if (NIL_P(f_infinite_p(dat->real)) && NIL_P(f_infinite_p(dat->imag))) { return Qnil; } - else { - return rb_funcall(magnitude, id_infinite_p, 0); - } + return ONE; } /* :nodoc: */ -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/