From 4f869f3367a3cf98b967bcb25184101b233dd0f1 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Fri, 18 Mar 2022 14:23:17 +0900 Subject: [PATCH] numeric.c: enhance float division to support Complex. --- mrbgems/mruby-complex/src/complex.c | 20 -------------------- src/numeric.c | 12 +++++++++--- 2 files changed, 9 insertions(+), 23 deletions(-) diff --git a/mrbgems/mruby-complex/src/complex.c b/mrbgems/mruby-complex/src/complex.c index 2cd111ded..9e89e002d 100644 --- a/mrbgems/mruby-complex/src/complex.c +++ b/mrbgems/mruby-complex/src/complex.c @@ -348,24 +348,6 @@ complex_div(mrb_state *mrb, mrb_value x) return mrb_complex_div(mrb, x, y); } -static mrb_value -complex_float_div(mrb_state *mrb, mrb_value x) -{ - mrb_float a = mrb_float(x); - mrb_value y = mrb_get_arg1(mrb); - - switch(mrb_type(y)) { - case MRB_TT_COMPLEX: - return complex_div(mrb, complex_new(mrb, a, 0)); - case MRB_TT_FLOAT: - a = mrb_div_float(a, mrb_float(y)); - return mrb_float_value(mrb, a); - default: - a = mrb_div_float(a, mrb_as_float(mrb, y)); - return mrb_float_value(mrb, a); - } -} - void mrb_mruby_complex_gem_init(mrb_state *mrb) { struct RClass *comp; @@ -392,8 +374,6 @@ void mrb_mruby_complex_gem_init(mrb_state *mrb) mrb_define_method(mrb, comp, "/", complex_div, MRB_ARGS_REQ(1)); mrb_define_method(mrb, comp, "quo", complex_div, MRB_ARGS_REQ(1)); mrb_define_method(mrb, comp, "==", complex_eq, MRB_ARGS_REQ(1)); - mrb_define_method(mrb, mrb->float_class, "/", complex_float_div, MRB_ARGS_REQ(1)); /* override */ - mrb_define_method(mrb, mrb->float_class, "quo", complex_float_div, MRB_ARGS_REQ(1)); /* override */ } void diff --git a/src/numeric.c b/src/numeric.c index d4e124c2b..b8161878b 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -286,11 +286,17 @@ flo_div(mrb_state *mrb, mrb_value x) mrb_value y = mrb_get_arg1(mrb); mrb_float a = mrb_float(x); - if (mrb_float_p(y)) { + switch(mrb_type(y)) { +#ifdef MRB_USE_COMPLEX + case MRB_TT_COMPLEX: + return mrb_complex_div(mrb, mrb_complex_new(mrb, a, 0), y); +#endif + case MRB_TT_FLOAT: a = mrb_div_float(a, mrb_float(y)); - } - else { + return mrb_float_value(mrb, a); + default: a = mrb_div_float(a, mrb_as_float(mrb, y)); + return mrb_float_value(mrb, a); } return mrb_float_value(mrb, a); }