Remove some overhead from methods defined in Ruby in Complex.
MODIFY
mrbgems/mruby-complex/mrblib/complex.rb
mrbgems/mruby-complex/mrblib/complex.rb
class Complex < Numeric
- def initialize(real, imaginary)
- real = real.to_f unless real.is_a? Numeric
- imaginary = imaginary.to_f unless imaginary.is_a? Numeric
- @real = real
- @imaginary = imaginary
- end
-
def self.polar(abs, arg = 0)
Complex(abs * Math.cos(arg), abs * Math.sin(arg))
end
- def self.rectangular(real, imaginary = 0)
- _new(real, imaginary)
- end
-
def inspect
"(#{to_s})"
end
@@ -23,43 +12,43 @@ class Complex < Numeric
end
def +@
- Complex._new(real, imaginary)
+ Complex(real, imaginary)
end
def -@
- Complex._new(-real, -imaginary)
+ Complex(-real, -imaginary)
end
def +(rhs)
if rhs.is_a? Complex
- Complex._new(real + rhs.real, imaginary + rhs.imaginary)
+ Complex(real + rhs.real, imaginary + rhs.imaginary)
elsif rhs.is_a? Numeric
- Complex._new(real + rhs, imaginary)
+ Complex(real + rhs, imaginary)
end
end
def -(rhs)
if rhs.is_a? Complex
- Complex._new(real - rhs.real, imaginary - rhs.imaginary)
+ Complex(real - rhs.real, imaginary - rhs.imaginary)
elsif rhs.is_a? Numeric
- Complex._new(real - rhs, imaginary)
+ Complex(real - rhs, imaginary)
end
end
def *(rhs)
if rhs.is_a? Complex
- Complex._new(real * rhs.real - imaginary * rhs.imaginary, real * rhs.imaginary + rhs.real * imaginary)
+ Complex(real * rhs.real - imaginary * rhs.imaginary, real * rhs.imaginary + rhs.real * imaginary)
elsif rhs.is_a? Numeric
- Complex._new(real * rhs, imaginary * rhs)
+ Complex(real * rhs, imaginary * rhs)
end
end
def /(rhs)
if rhs.is_a? Complex
div = rhs.real * rhs.real + rhs.imaginary * rhs.imaginary
- Complex._new((real * rhs.real + imaginary * rhs.imaginary) / div, (rhs.real * imaginary - real * rhs.imaginary) / div)
+ Complex((real * rhs.real + imaginary * rhs.imaginary) / div, (rhs.real * imaginary - real * rhs.imaginary) / div)
elsif rhs.is_a? Numeric
- Complex._new(real / rhs, imaginary / rhs)
+ Complex(real / rhs, imaginary / rhs)
end
end
alias_method :quo, :/
@@ -117,12 +106,6 @@ class Complex < Numeric
alias_method :imag, :imaginary
end
-module Kernel
- def Complex(real, imaginary = 0)
- Complex.rectangular(real, imaginary)
- end
-end
-
[Fixnum, Float].each do |cls|
[:+, :-, :*, :/, :==].each do |op|
cls.instance_exec do

MODIFY
mrbgems/mruby-complex/src/complex.c
mrbgems/mruby-complex/src/complex.c
@@ -76,11 +76,11 @@ complex_imaginary(mrb_state *mrb, mrb_value self)
}
static mrb_value
-complex_s_new(mrb_state *mrb, mrb_value self)
+complex_s_rect(mrb_state *mrb, mrb_value self)
{
- mrb_float real, imaginary;
+ mrb_float real, imaginary = 0.0;
- mrb_get_args(mrb, "ff", &real, &imaginary);
+ mrb_get_args(mrb, "f|f", &real, &imaginary);
return complex_new(mrb, real, imaginary);
}
@@ -125,7 +125,8 @@ void mrb_mruby_complex_gem_init(mrb_state *mrb)
comp = mrb_define_class(mrb, "Complex", mrb_class_get(mrb, "Numeric"));
//MRB_SET_INSTANCE_TT(comp, MRB_TT_ISTRUCT);
mrb_undef_class_method(mrb, comp, "new");
- mrb_define_class_method(mrb, comp, "_new", complex_s_new, MRB_ARGS_REQ(2));
+ mrb_define_class_method(mrb, comp, "rectangular", complex_s_rect, MRB_ARGS_REQ(1)|MRB_ARGS_OPT(1));
+ mrb_define_method(mrb, mrb->kernel_module, "Complex", complex_s_rect, MRB_ARGS_REQ(1)|MRB_ARGS_OPT(1));
mrb_define_method(mrb, comp, "real", complex_real, MRB_ARGS_NONE());
mrb_define_method(mrb, comp, "imaginary", complex_imaginary, MRB_ARGS_NONE());
#ifndef MRB_WITHOUT_FLOAT

Remove some overhead from methods defined in Ruby in Complex.