diff --git a/vm.c b/vm.c index 16b938b3..2c219f05 100644 --- a/vm.c +++ b/vm.c @@ -1643,21 +1643,38 @@ sexp sexp_apply (sexp ctx, sexp proc, sexp args) { i = tmp1 == tmp2; #if SEXP_USE_BIGNUMS _ARG1 = sexp_make_boolean(i); + } else { #if SEXP_USE_COMPLEX - } else if (sexp_complexp(tmp1)) { - if (!sexp_complexp(tmp2)) { - _ARG1 = SEXP_FALSE; - } else { - i = (sexp_complex_real(tmp1) == sexp_complex_real(tmp2) - || (sexp_flonump(tmp1) && (sexp_flonum_value(tmp1) == (sexp_flonump(tmp2) ? sexp_flonum_value(tmp2) : sexp_unbox_fixnum(tmp2)))) - || (sexp_flonump(tmp2) && (sexp_flonum_value(tmp2) == sexp_unbox_fixnum(tmp2)))); - _ARG1 = sexp_make_boolean(i); + if (sexp_complexp(tmp1)) { + if (sexp_flonump(sexp_complex_imag(tmp1)) + && sexp_flonum_value(sexp_complex_imag(tmp1)) == 0.0) { + tmp1 = sexp_complex_real(tmp1); + } else if (sexp_complexp(tmp2)) { /* both complex */ + _ARG1 = sexp_make_boolean( + (sexp_compare(ctx, sexp_complex_real(tmp1), sexp_complex_real(tmp2)) + == SEXP_ZERO) + && (sexp_compare(ctx, sexp_complex_imag(tmp1), sexp_complex_imag(tmp2)) + == SEXP_ZERO)); + break; + } else if (sexp_numberp(tmp2)) { + _ARG1 = SEXP_FALSE; + break; + } + } + if (sexp_complexp(tmp2)) { + if (sexp_flonump(sexp_complex_imag(tmp2)) + && sexp_flonum_value(sexp_complex_imag(tmp2)) == 0.0) { + tmp2 = sexp_complex_real(tmp2); + } else if (sexp_numberp(tmp1)) { + _ARG1 = SEXP_FALSE; + break; + } } #endif - } else { + /* neither is complex */ _ARG1 = sexp_compare(ctx, tmp1, tmp2); sexp_check_exception(); - _ARG1 = sexp_make_boolean(sexp_unbox_fixnum(_ARG1) == 0); + _ARG1 = sexp_make_boolean(_ARG1 == SEXP_ZERO); } #else #if SEXP_USE_FLONUMS