* complex.c (nucomp_s_canonicalize_internal): determine the type
  by the internal type, not by a method.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62688 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2018-03-07 11:54:07 +00:00
Родитель b479a2d439
Коммит b31ba1056e
2 изменённых файлов: 19 добавлений и 3 удалений

Просмотреть файл

@ -354,20 +354,24 @@ nucomp_real_check(VALUE num)
inline static VALUE inline static VALUE
nucomp_s_canonicalize_internal(VALUE klass, VALUE real, VALUE imag) nucomp_s_canonicalize_internal(VALUE klass, VALUE real, VALUE imag)
{ {
int complex_r, complex_i;
#ifdef CANONICALIZATION_FOR_MATHN #ifdef CANONICALIZATION_FOR_MATHN
if (k_exact_zero_p(imag) && canonicalization) if (k_exact_zero_p(imag) && canonicalization)
return real; return real;
#endif #endif
if (f_real_p(real) && f_real_p(imag)) complex_r = RB_TYPE_P(real, T_COMPLEX);
complex_i = RB_TYPE_P(imag, T_COMPLEX);
if (!complex_r && !complex_i) {
return nucomp_s_new_internal(klass, real, imag); return nucomp_s_new_internal(klass, real, imag);
else if (f_real_p(real)) { }
else if (!complex_r) {
get_dat1(imag); get_dat1(imag);
return nucomp_s_new_internal(klass, return nucomp_s_new_internal(klass,
f_sub(real, dat->imag), f_sub(real, dat->imag),
f_add(ZERO, dat->real)); f_add(ZERO, dat->real));
} }
else if (f_real_p(imag)) { else if (!complex_i) {
get_dat1(real); get_dat1(real);
return nucomp_s_new_internal(klass, return nucomp_s_new_internal(klass,

Просмотреть файл

@ -958,4 +958,16 @@ class Complex_Test < Test::Unit::TestCase
def test_known_bug def test_known_bug
end end
def test_canonicalize_internal
obj = Class.new(Numeric) do
attr_accessor :real
alias real? real
end.new
obj.real = true
c = Complex.rect(obj, 1);
obj.real = false
c = c.conj
assert_equal(obj, c.real)
assert_equal(-1, c.imag)
end
end end