summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--complex.c14
-rw-r--r--internal.h1
-rw-r--r--rational.c6
3 files changed, 16 insertions, 5 deletions
diff --git a/complex.c b/complex.c
index bcdc486595..74d91b044f 100644
--- a/complex.c
+++ b/complex.c
@@ -191,7 +191,17 @@ f_arg(VALUE x)
return rb_funcall(x, id_arg, 0);
}
-fun1(denominator)
+inline static VALUE
+f_denominator(VALUE x)
+{
+ if (RB_TYPE_P(x, T_RATIONAL)) {
+ return RRATIONAL(x)->den;
+ }
+ if (RB_FLOAT_TYPE_P(x)) {
+ return rb_float_denominator(x);
+ }
+ return INT2FIX(1);
+}
inline static VALUE
f_negate(VALUE x)
@@ -1252,7 +1262,7 @@ nucomp_numerator(VALUE self)
get_dat1(self);
- cd = f_denominator(self);
+ cd = nucomp_denominator(self);
return f_complex_new2(CLASS_OF(self),
f_mul(f_numerator(dat->real),
f_div(cd, f_denominator(dat->real))),
diff --git a/internal.h b/internal.h
index fb184e290c..bd82231d37 100644
--- a/internal.h
+++ b/internal.h
@@ -2029,6 +2029,7 @@ VALUE rb_rational_abs(VALUE self);
VALUE rb_rational_cmp(VALUE self, VALUE other);
VALUE rb_rational_pow(VALUE self, VALUE other);
VALUE rb_numeric_quo(VALUE x, VALUE y);
+VALUE rb_float_denominator(VALUE x);
/* re.c */
VALUE rb_reg_compile(VALUE str, int options, const char *sourcefile, int sourceline);
diff --git a/rational.c b/rational.c
index e137ac23e7..7607628cb0 100644
--- a/rational.c
+++ b/rational.c
@@ -2080,8 +2080,8 @@ float_numerator(VALUE self)
*
* See also Float#numerator.
*/
-static VALUE
-float_denominator(VALUE self)
+VALUE
+rb_float_denominator(VALUE self)
{
double d = RFLOAT_VALUE(self);
VALUE r;
@@ -2778,7 +2778,7 @@ Init_Rational(void)
rb_define_method(rb_cInteger, "denominator", integer_denominator, 0);
rb_define_method(rb_cFloat, "numerator", float_numerator, 0);
- rb_define_method(rb_cFloat, "denominator", float_denominator, 0);
+ rb_define_method(rb_cFloat, "denominator", rb_float_denominator, 0);
rb_define_method(rb_cNilClass, "to_r", nilclass_to_r, 0);
rb_define_method(rb_cNilClass, "rationalize", nilclass_rationalize, -1);