From 1dba7fb8fdec3888c9bec72dc84b8cbc62396983 Mon Sep 17 00:00:00 2001 From: Alex Shinn Date: Wed, 30 Dec 2009 03:49:21 +0900 Subject: [PATCH] forgot to preserve some gc vars in the bignum lib --- eval.c | 6 ++++++ opt/bignum.c | 33 +++++++++++++++++++++++++-------- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/eval.c b/eval.c index de858f87..d74812a6 100644 --- a/eval.c +++ b/eval.c @@ -1663,6 +1663,7 @@ sexp sexp_vm (sexp ctx, sexp proc) { case SEXP_OP_ADD: #if SEXP_USE_BIGNUMS tmp1 = _ARG1, tmp2 = _ARG2; + sexp_context_top(ctx) = top; if (sexp_fixnump(tmp1) && sexp_fixnump(tmp2)) { j = sexp_unbox_fixnum(tmp1) + sexp_unbox_fixnum(tmp2); if ((j < SEXP_MIN_FIXNUM) || (j > SEXP_MAX_FIXNUM)) @@ -1690,6 +1691,7 @@ sexp sexp_vm (sexp ctx, sexp proc) { case SEXP_OP_SUB: #if SEXP_USE_BIGNUMS tmp1 = _ARG1, tmp2 = _ARG2; + sexp_context_top(ctx) = top; if (sexp_fixnump(tmp1) && sexp_fixnump(tmp2)) { j = sexp_unbox_fixnum(tmp1) - sexp_unbox_fixnum(tmp2); if ((j < SEXP_MIN_FIXNUM) || (j > SEXP_MAX_FIXNUM)) @@ -1717,6 +1719,7 @@ sexp sexp_vm (sexp ctx, sexp proc) { case SEXP_OP_MUL: #if SEXP_USE_BIGNUMS tmp1 = _ARG1, tmp2 = _ARG2; + sexp_context_top(ctx) = top; if (sexp_fixnump(tmp1) && sexp_fixnump(tmp2)) { prod = (sexp_lsint_t)sexp_unbox_fixnum(tmp1) * sexp_unbox_fixnum(tmp2); if ((prod < SEXP_MIN_FIXNUM) || (prod > SEXP_MAX_FIXNUM)) @@ -1742,6 +1745,7 @@ sexp sexp_vm (sexp ctx, sexp proc) { top--; break; case SEXP_OP_DIV: + sexp_context_top(ctx) = top; if (_ARG2 == SEXP_ZERO) { #if SEXP_USE_FLONUMS if (sexp_flonump(_ARG1) && sexp_flonum_value(_ARG1) == 0.0) @@ -1785,6 +1789,7 @@ sexp sexp_vm (sexp ctx, sexp proc) { } #if SEXP_USE_BIGNUMS else { + sexp_context_top(ctx) = top; _ARG2 = sexp_quotient(ctx, _ARG1, _ARG2); top--; } @@ -1802,6 +1807,7 @@ sexp sexp_vm (sexp ctx, sexp proc) { } #if SEXP_USE_BIGNUMS else { + sexp_context_top(ctx) = top; _ARG2 = sexp_remainder(ctx, _ARG1, _ARG2); top--; } diff --git a/opt/bignum.c b/opt/bignum.c index 60215de8..fb211725 100644 --- a/opt/bignum.c +++ b/opt/bignum.c @@ -173,8 +173,10 @@ sexp sexp_bignum_fxmul (sexp ctx, sexp d, sexp a, sexp_uint_t b, int offset) { sexp_uint_t len=sexp_bignum_length(a), *data, *adata=sexp_bignum_data(a), carry=0, i; sexp_luint_t n; + sexp_gc_var1(tmp); + sexp_gc_preserve1(ctx, tmp); if ((! d) || (sexp_bignum_length(d)+offset < len)) - d = sexp_make_bignum(ctx, len); + d = tmp = sexp_make_bignum(ctx, len); data = sexp_bignum_data(d); for (i=0; i