зеркало из https://github.com/github/ruby.git
complex.c: check type
* 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:
Родитель
b479a2d439
Коммит
b31ba1056e
10
complex.c
10
complex.c
|
@ -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
|
||||||
|
|
Загрузка…
Ссылка в новой задаче