summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-complex/src/complex.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2021-03-24 11:04:58 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2021-03-24 11:04:58 +0900
commitfa3ac351ff86efe517180afa6159679887656ced (patch)
tree4aa9460c19cc2c057b18bdfabe4891b05edfcb68 /mrbgems/mruby-complex/src/complex.c
parentafb3c00e8c7e9f32a96f1241c2408633550329f3 (diff)
downloadmruby-fa3ac351ff86efe517180afa6159679887656ced.tar.gz
mruby-fa3ac351ff86efe517180afa6159679887656ced.zip
complex.c: override float division to support `Complex`.
Diffstat (limited to 'mrbgems/mruby-complex/src/complex.c')
-rw-r--r--mrbgems/mruby-complex/src/complex.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/mrbgems/mruby-complex/src/complex.c b/mrbgems/mruby-complex/src/complex.c
index f0269f165..b4217d4d6 100644
--- a/mrbgems/mruby-complex/src/complex.c
+++ b/mrbgems/mruby-complex/src/complex.c
@@ -348,6 +348,24 @@ int_quo(mrb_state *mrb, mrb_value x)
}
#endif
+static mrb_value
+flo_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 = div_flo(a, mrb_float(y));
+ return mrb_float_value(mrb, a);
+ default:
+ a = div_flo(a, mrb_to_flo(mrb, y));
+ return mrb_float_value(mrb, a);
+ }
+}
+
void mrb_mruby_complex_gem_init(mrb_state *mrb)
{
struct RClass *comp;
@@ -376,6 +394,8 @@ void mrb_mruby_complex_gem_init(mrb_state *mrb)
mrb_define_method(mrb, mrb->integer_class, "/", int_div, MRB_ARGS_REQ(1)); /* overrride */
mrb_define_method(mrb, mrb->integer_class, "quo", int_quo, MRB_ARGS_REQ(1)); /* overrride */
#endif
+ mrb_define_method(mrb, mrb->float_class, "/", flo_div, MRB_ARGS_REQ(1)); /* overrride */
+ mrb_define_method(mrb, mrb->float_class, "quo", flo_div, MRB_ARGS_REQ(1)); /* overrride */
}
void