зеркало из 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
|
||||
nucomp_s_canonicalize_internal(VALUE klass, VALUE real, VALUE imag)
|
||||
{
|
||||
int complex_r, complex_i;
|
||||
#ifdef CANONICALIZATION_FOR_MATHN
|
||||
if (k_exact_zero_p(imag) && canonicalization)
|
||||
return real;
|
||||
#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);
|
||||
else if (f_real_p(real)) {
|
||||
}
|
||||
else if (!complex_r) {
|
||||
get_dat1(imag);
|
||||
|
||||
return nucomp_s_new_internal(klass,
|
||||
f_sub(real, dat->imag),
|
||||
f_add(ZERO, dat->real));
|
||||
}
|
||||
else if (f_real_p(imag)) {
|
||||
else if (!complex_i) {
|
||||
get_dat1(real);
|
||||
|
||||
return nucomp_s_new_internal(klass,
|
||||
|
|
|
@ -958,4 +958,16 @@ class Complex_Test < Test::Unit::TestCase
|
|||
def test_known_bug
|
||||
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
|
||||
|
|
Загрузка…
Ссылка в новой задаче