diff --git a/opt/bignum.c b/opt/bignum.c index fb211725..d80fb6cb 100644 --- a/opt/bignum.c +++ b/opt/bignum.c @@ -434,8 +434,10 @@ sexp sexp_bignum_quotient (sexp ctx, sexp a, sexp b) { } sexp sexp_bignum_remainder (sexp ctx, sexp a, sexp b) { - sexp rem; + sexp_gc_var1(rem); + sexp_gc_preserve1(ctx, rem); sexp_bignum_quot_rem(ctx, &rem, a, b); /* discard quotient */ + sexp_gc_release1(ctx); return rem; } @@ -605,9 +607,9 @@ sexp sexp_mul (sexp ctx, sexp a, sexp b) { sexp sexp_div (sexp ctx, sexp a, sexp b) { int at=sexp_number_type(a), bt=sexp_number_type(b); double f; - sexp r=SEXP_VOID, rem; - sexp_gc_var1(tmp); - sexp_gc_preserve1(ctx, tmp); + sexp r=SEXP_VOID; + sexp_gc_var2(tmp, rem); + sexp_gc_preserve2(ctx, tmp, rem); switch ((at << 2) + bt) { case SEXP_NUM_NOT_NOT: case SEXP_NUM_NOT_FIX: case SEXP_NUM_NOT_FLO: case SEXP_NUM_NOT_BIG: @@ -651,7 +653,7 @@ sexp sexp_div (sexp ctx, sexp a, sexp b) { r = sexp_make_flonum(ctx, sexp_bignum_to_double(a) / sexp_flonum_value(b)); break; } - sexp_gc_release1(ctx); + sexp_gc_release2(ctx); return r; } diff --git a/sexp.c b/sexp.c index 2a3ff0f6..b6eab627 100644 --- a/sexp.c +++ b/sexp.c @@ -79,7 +79,7 @@ static struct sexp_struct _sexp_type_specs[] = { _DEF_TYPE(SEXP_STRING, 0, 0, 0, 0, 0, sexp_sizeof(string)+1, sexp_offsetof(string, length), 1, "string", NULL), _DEF_TYPE(SEXP_VECTOR, sexp_offsetof(vector, data), 0, 0, sexp_offsetof(vector, length), 1, sexp_sizeof(vector), sexp_offsetof(vector, length), sizeof(sexp), "vector", NULL), _DEF_TYPE(SEXP_FLONUM, 0, 0, 0, 0, 0, sexp_sizeof(flonum), 0, 0, "flonum", NULL), - _DEF_TYPE(SEXP_BIGNUM, 0, 0, 0, 0, 0, sexp_sizeof(bignum), sexp_offsetof(bignum, length), sizeof(sexp), "bignum", NULL), + _DEF_TYPE(SEXP_BIGNUM, 0, 0, 0, 0, 0, sexp_sizeof(bignum), sexp_offsetof(bignum, length), sizeof(sexp_uint_t), "bignum", NULL), _DEF_TYPE(SEXP_CPOINTER, sexp_offsetof(cpointer, parent), 1, 0, 0, 0, sexp_sizeof(cpointer), sexp_offsetof(cpointer, length), 1, "cpointer", NULL), _DEF_TYPE(SEXP_IPORT, sexp_offsetof(port, name), 2, 2, 0, 0, sexp_sizeof(port), 0, 0, "input-port", SEXP_FINALIZE_PORT), _DEF_TYPE(SEXP_OPORT, sexp_offsetof(port, name), 2, 2, 0, 0, sexp_sizeof(port), 0, 0, "output-port", SEXP_FINALIZE_PORT),