summaryrefslogtreecommitdiff
path: root/rational.c
diff options
context:
space:
mode:
authortadf <tadf@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-09-21 01:30:25 +0000
committertadf <tadf@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-09-21 01:30:25 +0000
commit72565402d9d0662a2fbef2e30f76b7a6621eefef (patch)
treef4a7af81718c24690caeeb7e87571c2d83f494eb /rational.c
parent280cbe0b1fb807ee0de9ea3e862d556763e08811 (diff)
* 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
Diffstat (limited to 'rational.c')
-rw-r--r--rational.c33
1 files changed, 15 insertions, 18 deletions
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);
}
{