From 7dfad8a293212c0e9bd2cc2eacb8f1b79916d83f Mon Sep 17 00:00:00 2001 From: Alex Shinn Date: Wed, 23 Jan 2013 22:07:33 +0900 Subject: [PATCH] Don't gc release until after normalizing ratios. Fixes issue #171. --- bignum.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/bignum.c b/bignum.c index 91a53ef0..71524faf 100644 --- a/bignum.c +++ b/bignum.c @@ -562,8 +562,9 @@ sexp sexp_ratio_add (sexp ctx, sexp a, sexp b) { num = sexp_add(ctx, num, den); den = sexp_mul(ctx, sexp_ratio_denominator(a), sexp_ratio_denominator(b)); res = sexp_make_ratio(ctx, num, den); + res = sexp_ratio_normalize(ctx, res, SEXP_FALSE); sexp_gc_release3(ctx); - return sexp_ratio_normalize(ctx, res, SEXP_FALSE); + return res; } sexp sexp_ratio_mul (sexp ctx, sexp a, sexp b) { @@ -572,8 +573,9 @@ sexp sexp_ratio_mul (sexp ctx, sexp a, sexp b) { num = sexp_mul(ctx, sexp_ratio_numerator(a), sexp_ratio_numerator(b)); den = sexp_mul(ctx, sexp_ratio_denominator(a), sexp_ratio_denominator(b)); res = sexp_make_ratio(ctx, num, den); + res = sexp_ratio_normalize(ctx, res, SEXP_FALSE); sexp_gc_release3(ctx); - return sexp_ratio_normalize(ctx, res, SEXP_FALSE); + return res; } sexp sexp_ratio_div (sexp ctx, sexp a, sexp b) { @@ -582,8 +584,9 @@ sexp sexp_ratio_div (sexp ctx, sexp a, sexp b) { num = sexp_mul(ctx, sexp_ratio_numerator(a), sexp_ratio_denominator(b)); den = sexp_mul(ctx, sexp_ratio_denominator(a), sexp_ratio_numerator(b)); res = sexp_make_ratio(ctx, num, den); + res = sexp_ratio_normalize(ctx, res, SEXP_FALSE); sexp_gc_release3(ctx); - return sexp_ratio_normalize(ctx, res, SEXP_FALSE); + return res; } sexp sexp_ratio_compare (sexp ctx, sexp a, sexp b) {