From b101e5c585d245210597c9cfc4f3bab3967cb03e Mon Sep 17 00:00:00 2001 From: Alex Shinn Date: Wed, 11 Jul 2012 22:07:05 +0900 Subject: [PATCH] Fixing some corner cases with mixed rational/complex notation. --- sexp.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/sexp.c b/sexp.c index ac7c66bc..00534ad2 100644 --- a/sexp.c +++ b/sexp.c @@ -2394,12 +2394,15 @@ sexp sexp_read_number (sexp ctx, sexp in, int base) { res = sexp_make_fixnum(negativep ? -val : val); if (sexp_complex_real(den) == SEXP_ZERO) { res = sexp_make_ratio(ctx, res, sexp_complex_imag(den)); - sexp_complex_imag(den) = sexp_ratio_normalize(ctx, res, in); + res = sexp_ratio_normalize(ctx, res, in); + sexp_complex_imag(den) = res; } else { res = sexp_make_ratio(ctx, res, sexp_complex_real(den)); - sexp_complex_real(den) = sexp_ratio_normalize(ctx, res, in); + res = sexp_ratio_normalize(ctx, res, in); + sexp_complex_real(den) = res; } - res = den; + if (!sexp_exceptionp(res)) + res = den; } else #endif do { @@ -2407,8 +2410,9 @@ sexp sexp_read_number (sexp ctx, sexp in, int base) { res = sexp_ratio_normalize(ctx, res, in); } while (0); #else - res = sexp_make_flonum(ctx, (double)(negativep ? -val : val) - / (double)sexp_unbox_fixnum(den)); + if (!sexp_exceptionp(res)) + res = sexp_make_flonum(ctx, (double)(negativep ? -val : val) + / (double)sexp_unbox_fixnum(den)); #endif } sexp_gc_release2(ctx);