diff --git a/complex.c b/complex.c index c357c99ea5..8c7f007b44 100644 --- a/complex.c +++ b/complex.c @@ -131,6 +131,17 @@ f_mul(VALUE x, VALUE y) return ZERO; if (x == ONE) return y; if (y == ONE) return x; + return rb_int_mul(x, y); + } + else if (RB_FLOAT_TYPE_P(x) && + UNLIKELY(rb_method_basic_definition_p(rb_cFloat, idMULT))) { + if (y == ONE) return x; + return rb_float_mul(x, y); + } + else if (RB_TYPE_P(x, T_RATIONAL) && + UNLIKELY(rb_method_basic_definition_p(rb_cRational, idMULT))) { + if (y == ONE) return x; + return rb_rational_mul(x, y); } else if (UNLIKELY(rb_method_basic_definition_p(CLASS_OF(x), idMULT))) { if (y == ONE) return x; diff --git a/internal.h b/internal.h index cb4c06a41e..b51037e0dc 100644 --- a/internal.h +++ b/internal.h @@ -1658,6 +1658,7 @@ VALUE rb_int_plus(VALUE x, VALUE y); VALUE rb_float_plus(VALUE x, VALUE y); VALUE rb_int_minus(VALUE x, VALUE y); VALUE rb_int_mul(VALUE x, VALUE y); +VALUE rb_float_mul(VALUE x, VALUE y); VALUE rb_int_idiv(VALUE x, VALUE y); VALUE rb_int_modulo(VALUE x, VALUE y); VALUE rb_int_round(VALUE num, int ndigits, enum ruby_num_rounding_mode mode); @@ -1949,6 +1950,7 @@ void rb_last_status_clear(void); VALUE rb_rational_canonicalize(VALUE x); VALUE rb_rational_uminus(VALUE self); VALUE rb_rational_plus(VALUE self, VALUE other); +VALUE rb_rational_mul(VALUE self, VALUE other); VALUE rb_lcm(VALUE x, VALUE y); VALUE rb_rational_reciprocal(VALUE x); VALUE rb_cstr_to_rat(const char *, int); diff --git a/numeric.c b/numeric.c index 5e329a1f3d..4d8fd0bf09 100644 --- a/numeric.c +++ b/numeric.c @@ -1066,8 +1066,8 @@ flo_minus(VALUE x, VALUE y) * Returns a new Float which is the product of +float+ and +other+. */ -static VALUE -flo_mul(VALUE x, VALUE y) +VALUE +rb_float_mul(VALUE x, VALUE y) { if (RB_TYPE_P(y, T_FIXNUM)) { return DBL2NUM(RFLOAT_VALUE(x) * (double)FIX2LONG(y)); @@ -5676,7 +5676,7 @@ Init_Numeric(void) rb_define_method(rb_cFloat, "-@", rb_float_uminus, 0); rb_define_method(rb_cFloat, "+", rb_float_plus, 1); rb_define_method(rb_cFloat, "-", flo_minus, 1); - rb_define_method(rb_cFloat, "*", flo_mul, 1); + rb_define_method(rb_cFloat, "*", rb_float_mul, 1); rb_define_method(rb_cFloat, "/", flo_div, 1); rb_define_method(rb_cFloat, "quo", flo_quo, 1); rb_define_method(rb_cFloat, "fdiv", flo_quo, 1); diff --git a/rational.c b/rational.c index 089f5d54f1..bbae5fe7d1 100644 --- a/rational.c +++ b/rational.c @@ -877,8 +877,8 @@ f_muldiv(VALUE self, VALUE anum, VALUE aden, VALUE bnum, VALUE bden, int k) * Rational(9, 8) * 4 #=> (9/2) * Rational(20, 9) * 9.8 #=> 21.77777777777778 */ -static VALUE -nurat_mul(VALUE self, VALUE other) +VALUE +rb_rational_mul(VALUE self, VALUE other) { if (RB_INTEGER_TYPE_P(other)) { { @@ -1396,7 +1396,7 @@ f_round_common(int argc, VALUE *argv, VALUE self, VALUE (*func)(VALUE)) rb_raise(rb_eTypeError, "not an integer"); b = f_expt10(n); - s = nurat_mul(self, b); + s = rb_rational_mul(self, b); if (k_float_p(s)) { if (INT_NEGATIVE_P(n)) @@ -2734,7 +2734,7 @@ Init_Rational(void) rb_define_method(rb_cRational, "-@", rb_rational_uminus, 0); rb_define_method(rb_cRational, "+", rb_rational_plus, 1); rb_define_method(rb_cRational, "-", nurat_sub, 1); - rb_define_method(rb_cRational, "*", nurat_mul, 1); + rb_define_method(rb_cRational, "*", rb_rational_mul, 1); rb_define_method(rb_cRational, "/", nurat_div, 1); rb_define_method(rb_cRational, "quo", nurat_div, 1); rb_define_method(rb_cRational, "fdiv", nurat_fdiv, 1);