From d69ffa4d93b12ddfb0d77f146921eb5d2fd62919 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sat, 10 Aug 2019 14:30:34 +0900 Subject: [PATCH] Expanded f_quo --- complex.c | 14 +++++++++++++- internal.h | 1 + numeric.c | 6 +++--- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/complex.c b/complex.c index ed35b2b2b5..ec60c00ed6 100644 --- a/complex.c +++ b/complex.c @@ -285,7 +285,19 @@ f_eqeq_p(VALUE x, VALUE y) fun2(expt) fun2(fdiv) -fun2(quo) + +static VALUE +f_quo(VALUE x, VALUE y) +{ + if (RB_INTEGER_TYPE_P(x)) + return rb_numeric_quo(x, y); + if (RB_FLOAT_TYPE_P(x)) + return rb_float_div(x, y); + if (RB_TYPE_P(x, T_RATIONAL)) + return rb_numeric_quo(x, y); + + return rb_funcallv(x, id_quo, 1, &y); +} inline static int f_negative_p(VALUE x) diff --git a/internal.h b/internal.h index 76c10c8bf5..2ba49861fe 100644 --- a/internal.h +++ b/internal.h @@ -1763,6 +1763,7 @@ 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_float_div(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); diff --git a/numeric.c b/numeric.c index d56b2d6559..724a7f3be3 100644 --- a/numeric.c +++ b/numeric.c @@ -1122,8 +1122,8 @@ rb_flo_div_flo(VALUE x, VALUE y) * Returns a new Float which is the result of dividing +float+ by +other+. */ -static VALUE -flo_div(VALUE x, VALUE y) +VALUE +rb_float_div(VALUE x, VALUE y) { double num = RFLOAT_VALUE(x); double den; @@ -5791,7 +5791,7 @@ Init_Numeric(void) rb_define_method(rb_cFloat, "+", rb_float_plus, 1); rb_define_method(rb_cFloat, "-", flo_minus, 1); rb_define_method(rb_cFloat, "*", rb_float_mul, 1); - rb_define_method(rb_cFloat, "/", flo_div, 1); + rb_define_method(rb_cFloat, "/", rb_float_div, 1); rb_define_method(rb_cFloat, "quo", flo_quo, 1); rb_define_method(rb_cFloat, "fdiv", flo_quo, 1); rb_define_method(rb_cFloat, "%", flo_mod, 1);