summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--complex.c24
-rw-r--r--test/ruby/test_complex.rb2
2 files changed, 14 insertions, 12 deletions
diff --git a/complex.c b/complex.c
index 7d45b445db..07e5914d54 100644
--- a/complex.c
+++ b/complex.c
@@ -495,7 +495,11 @@ nucomp_s_new(int argc, VALUE *argv, VALUE klass)
inline static VALUE
f_complex_new2(VALUE klass, VALUE x, VALUE y)
{
- assert(!RB_TYPE_P(x, T_COMPLEX));
+ if (RB_TYPE_P(x, T_COMPLEX)) {
+ get_dat1(x);
+ x = dat->real;
+ y = f_add(dat->imag, y);
+ }
return nucomp_s_canonicalize_internal(klass, x, y);
}
@@ -609,8 +613,14 @@ m_sin(VALUE x)
static VALUE
f_complex_polar(VALUE klass, VALUE x, VALUE y)
{
- assert(!RB_TYPE_P(x, T_COMPLEX));
- assert(!RB_TYPE_P(y, T_COMPLEX));
+ if (RB_TYPE_P(x, T_COMPLEX)) {
+ get_dat1(x);
+ x = dat->real;
+ }
+ if (RB_TYPE_P(y, T_COMPLEX)) {
+ get_dat1(y);
+ y = dat->real;
+ }
if (f_zero_p(x) || f_zero_p(y)) {
return nucomp_s_new_internal(klass, x, RFLOAT_0);
}
@@ -703,14 +713,6 @@ nucomp_s_polar(int argc, VALUE *argv, VALUE klass)
nucomp_real_check(arg);
break;
}
- if (RB_TYPE_P(abs, T_COMPLEX)) {
- get_dat1(abs);
- abs = dat->real;
- }
- if (RB_TYPE_P(arg, T_COMPLEX)) {
- get_dat1(arg);
- arg = dat->real;
- }
return f_complex_polar(klass, abs, arg);
}
diff --git a/test/ruby/test_complex.rb b/test/ruby/test_complex.rb
index 13511fd4cf..17b5f64db2 100644
--- a/test/ruby/test_complex.rb
+++ b/test/ruby/test_complex.rb
@@ -567,7 +567,7 @@ class Complex_Test < Test::Unit::TestCase
assert_raise_with_message(TypeError, /C\u{1f5ff}/) { Complex(1).coerce(obj) }
end
- class ObjectX
+ class ObjectX < Numeric
def initialize(real = true, n = 1) @n = n; @real = real; end
def +(x) Rational(@n) end
alias - +