From 72565402d9d0662a2fbef2e30f76b7a6621eefef Mon Sep 17 00:00:00 2001 From: tadf Date: Sun, 21 Sep 2008 01:30:25 +0000 Subject: * complex.c (nucomp_s_canonicalize_internal): checks exactness of imag only. * rational.c (nurat_s_convert): accepts non real value (Rational(a,b) as a/b). * complex.c (nucomp_s_convert): refined. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19442 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- rational.c | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) (limited to 'rational.c') diff --git a/rational.c b/rational.c index 3ae00e8902..59c86d8899 100644 --- a/rational.c +++ b/rational.c @@ -1400,28 +1400,21 @@ string_to_r(VALUE self) static VALUE nurat_s_convert(int argc, VALUE *argv, VALUE klass) { + int c; VALUE a1, a2, backref; - rb_scan_args(argc, argv, "02", &a1, &a2); + c = rb_scan_args(argc, argv, "02", &a1, &a2); switch (TYPE(a1)) { case T_COMPLEX: - if (k_inexact_p(RCOMPLEX(a1)->imag) || !f_zero_p(RCOMPLEX(a1)->imag)) { - VALUE s = f_to_s(a1); - rb_raise(rb_eRangeError, "can't accept %s", - StringValuePtr(s)); - } - a1 = RCOMPLEX(a1)->real; + if (k_exact_p(RCOMPLEX(a1)->imag) && f_zero_p(RCOMPLEX(a1)->imag)) + a1 = RCOMPLEX(a1)->real; } switch (TYPE(a2)) { case T_COMPLEX: - if (k_inexact_p(RCOMPLEX(a2)->imag) || !f_zero_p(RCOMPLEX(a2)->imag)) { - VALUE s = f_to_s(a2); - rb_raise(rb_eRangeError, "can't accept %s", - StringValuePtr(s)); - } - a2 = RCOMPLEX(a2)->real; + if (k_exact_p(RCOMPLEX(a2)->imag) && f_zero_p(RCOMPLEX(a2)->imag)) + a2 = RCOMPLEX(a2)->real; } backref = rb_backref_get(); @@ -1455,14 +1448,18 @@ nurat_s_convert(int argc, VALUE *argv, VALUE klass) switch (TYPE(a1)) { case T_RATIONAL: - if (NIL_P(a2) || f_zero_p(a2)) + if (c == 1 || (k_exact_p(a2) && f_one_p(a2))) return a1; - return f_div(a1, a2); } - switch (TYPE(a2)) { - case T_RATIONAL: - return f_div(a1, a2); + if (c == 1) { + if (k_numeric_p(a1) && !f_integer_p(a1)) + return a1; + } + else { + if ((k_numeric_p(a1) && k_numeric_p(a2)) && + (!f_integer_p(a1) || !f_integer_p(a2))) + return f_div(a1, a2); } { -- cgit v1.2.3