summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-complex
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2021-03-27 12:38:16 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2021-03-27 12:38:16 +0900
commitc2f929ad0f9c4b98cd4b8027052cbb3af599f19b (patch)
tree2225ffe8b435d6e451d06801bcd3ec47995c8b50 /mrbgems/mruby-complex
parent01a8edea3530f0073f0d046c68853bfa17c058b5 (diff)
downloadmruby-c2f929ad0f9c4b98cd4b8027052cbb3af599f19b.tar.gz
mruby-c2f929ad0f9c4b98cd4b8027052cbb3af599f19b.zip
Move default `Integer#/` from `rational.c` to `complex.c`.
Diffstat (limited to 'mrbgems/mruby-complex')
-rw-r--r--mrbgems/mruby-complex/mrbgem.rake1
-rw-r--r--mrbgems/mruby-complex/src/complex.c33
2 files changed, 20 insertions, 14 deletions
diff --git a/mrbgems/mruby-complex/mrbgem.rake b/mrbgems/mruby-complex/mrbgem.rake
index 5e88c2337..cd81ecd02 100644
--- a/mrbgems/mruby-complex/mrbgem.rake
+++ b/mrbgems/mruby-complex/mrbgem.rake
@@ -4,5 +4,4 @@ MRuby::Gem::Specification.new('mruby-complex') do |spec|
spec.summary = 'Complex class'
spec.build.defines << "MRB_USE_COMPLEX"
spec.add_dependency 'mruby-math', core: 'mruby-math'
- spec.add_test_dependency('mruby-rational')
end
diff --git a/mrbgems/mruby-complex/src/complex.c b/mrbgems/mruby-complex/src/complex.c
index 086ada7ad..c5f4d7faf 100644
--- a/mrbgems/mruby-complex/src/complex.c
+++ b/mrbgems/mruby-complex/src/complex.c
@@ -332,15 +332,16 @@ complex_div(mrb_state *mrb, mrb_value self)
return complex_new(mrb, F(ldexp)(zr.s, zr.x), F(ldexp)(zi.s, zi.x));
}
-#ifndef MRB_USE_RATIONAL
mrb_int mrb_num_div_int(mrb_state *mrb, mrb_int x, mrb_int y);
+mrb_value mrb_rational_new(mrb_state *mrb, mrb_int n, mrb_int d);
+mrb_value mrb_rational_div(mrb_state *mrb, mrb_value x);
/* 15.2.8.3.4 */
/*
* redefine Integer#/
*/
static mrb_value
-int_div(mrb_state *mrb, mrb_value x)
+cpx_int_div(mrb_state *mrb, mrb_value x)
{
mrb_value y = mrb_get_arg1(mrb);
mrb_int a = mrb_integer(x);
@@ -350,9 +351,13 @@ int_div(mrb_state *mrb, mrb_value x)
return mrb_int_value(mrb, div);
}
switch (mrb_type(y)) {
+#ifdef MRB_USE_RATIONAL
+ case MRB_TT_RATIONAL:
+ return mrb_rational_div(mrb, mrb_rational_new(mrb, a, 1));
+#endif
case MRB_TT_COMPLEX:
x = complex_new(mrb, (mrb_float)a, 0);
- return mrb_funcall_id(mrb, x, MRB_OPSYM(div), 1, y);
+ return complex_div(mrb, x);
default:
return mrb_float_value(mrb, div_flo((mrb_float)a, mrb_to_flo(mrb, y)));
}
@@ -364,23 +369,27 @@ int_div(mrb_state *mrb, mrb_value x)
*/
static mrb_value
-int_quo(mrb_state *mrb, mrb_value x)
+cpx_int_quo(mrb_state *mrb, mrb_value x)
{
mrb_value y = mrb_get_arg1(mrb);
mrb_int a = mrb_integer(x);
switch (mrb_type(y)) {
+#ifdef MRB_USE_RATIONAL
+ case MRB_TT_RATIONAL:
+ x = mrb_rational_new(mrb, a, 1);
+ return mrb_funcall_id(mrb, x, MRB_OPSYM(div), 1, y);
+#endif
case MRB_TT_COMPLEX:
x = complex_new(mrb, (mrb_float)a, 0);
- return mrb_funcall_id(mrb, x, MRB_OPSYM(div), 1, y);
+ return complex_div(mrb, x);
default:
return mrb_float_value(mrb, div_flo((mrb_float)a, mrb_to_flo(mrb, y)));
}
}
-#endif
static mrb_value
-flo_div(mrb_state *mrb, mrb_value x)
+cpx_flo_div(mrb_state *mrb, mrb_value x)
{
mrb_float a = mrb_float(x);
mrb_value y = mrb_get_arg1(mrb);
@@ -423,12 +432,10 @@ 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));
-#ifndef MRB_USE_RATIONAL
- 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 */
+ mrb_define_method(mrb, mrb->integer_class, "/", cpx_int_div, MRB_ARGS_REQ(1)); /* overrride */
+ mrb_define_method(mrb, mrb->integer_class, "quo", cpx_int_quo, MRB_ARGS_REQ(1)); /* overrride */
+ mrb_define_method(mrb, mrb->float_class, "/", cpx_flo_div, MRB_ARGS_REQ(1)); /* overrride */
+ mrb_define_method(mrb, mrb->float_class, "quo", cpx_flo_div, MRB_ARGS_REQ(1)); /* overrride */
}
void