summaryrefslogtreecommitdiff
path: root/rational.c
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2021-01-23 11:04:45 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2021-01-23 11:13:21 +0900
commit9efd590a13d1e8b8a141c46eabb48c2a1c286d2b (patch)
tree4a9ed5f85c3857f2af4a96426844548c056a6b1b /rational.c
parent9de68a52213873da84a5341fd3db15e5c8b6cb9a (diff)
downloadruby-9efd590a13d1e8b8a141c46eabb48c2a1c286d2b.tar.gz
Rationalize floats in coerce [Bug #17572]
Diffstat (limited to 'rational.c')
-rw-r--r--rational.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/rational.c b/rational.c
index 8548b3bd43..c7437df86f 100644
--- a/rational.c
+++ b/rational.c
@@ -51,6 +51,7 @@ static ID id_abs, id_integer_p,
#define f_to_s rb_obj_as_string
static VALUE nurat_to_f(VALUE self);
+static VALUE float_to_r(VALUE self);
inline static VALUE
f_add(VALUE x, VALUE y)
@@ -1172,11 +1173,17 @@ nurat_coerce(VALUE self, VALUE other)
return rb_assoc_new(other, self);
}
else if (RB_TYPE_P(other, T_COMPLEX)) {
- if (k_exact_zero_p(RCOMPLEX(other)->imag))
- return rb_assoc_new(f_rational_new_bang1
- (CLASS_OF(self), RCOMPLEX(other)->real), self);
- else
+ if (!k_exact_zero_p(RCOMPLEX(other)->imag))
return rb_assoc_new(other, rb_Complex(self, INT2FIX(0)));
+ other = RCOMPLEX(other)->real;
+ if (RB_FLOAT_TYPE_P(other)) {
+ other = float_to_r(other);
+ RBASIC_SET_CLASS(other, CLASS_OF(self));
+ }
+ else {
+ other = f_rational_new_bang1(CLASS_OF(self), other);
+ }
+ return rb_assoc_new(other, self);
}
rb_raise(rb_eTypeError, "%s can't be coerced into %s",
@@ -2060,7 +2067,6 @@ integer_denominator(VALUE self)
return INT2FIX(1);
}
-static VALUE float_to_r(VALUE self);
/*
* call-seq:
* flo.numerator -> integer