diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-03-07 11:54:07 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-03-07 11:54:07 +0000 |
commit | b31ba1056ee4647f188b997dcb47450bfe1cb25e (patch) | |
tree | 88550df5f6b1e740ed63b379c710e2b40675b5a5 /complex.c | |
parent | b479a2d43953ef8e1b498a3f1c0dac3e32269c69 (diff) | |
download | ruby-b31ba1056ee4647f188b997dcb47450bfe1cb25e.tar.gz |
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
Diffstat (limited to 'complex.c')
-rw-r--r-- | complex.c | 10 |
1 files changed, 7 insertions, 3 deletions
@@ -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, |