From 079bcaa570a51c55ece8e09bf533f95d33288fbe Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Tue, 14 Aug 2012 23:44:43 -0700 Subject: [PATCH] bignum.cpp: Fix calls to reallot_array() -- bignums can get new addresses if they are not in the nursery or are somehow larger. Fix a couple more correctness issues. --- vm/bignum.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/vm/bignum.cpp b/vm/bignum.cpp index 3928490a43..6a988a37bc 100755 --- a/vm/bignum.cpp +++ b/vm/bignum.cpp @@ -1296,6 +1296,7 @@ bignum * factor_vm::allot_bignum_zeroed(bignum_length_type length, int negative_ return (result); } +/* can allocate if not in nursery or size is larger */ #define BIGNUM_REDUCE_LENGTH(source, length) \ source = reallot_array(source,length + 1) @@ -1306,6 +1307,7 @@ bignum *factor_vm::bignum_shorten_length(bignum * bignum, bignum_length_type len BIGNUM_ASSERT ((length >= 0) || (length <= current_length)); if (length < current_length) { + GC_BIGNUM(bignum); BIGNUM_REDUCE_LENGTH (bignum, length); BIGNUM_SET_NEGATIVE_P (bignum, (length != 0) && (BIGNUM_NEGATIVE_P (bignum))); } @@ -1323,6 +1325,7 @@ bignum *factor_vm::bignum_trim(bignum * bignum) scan += 1; if (scan < end) { + GC_BIGNUM(bignum); bignum_length_type length = (scan - start); BIGNUM_REDUCE_LENGTH (bignum, length); BIGNUM_SET_NEGATIVE_P (bignum, (length != 0) && (BIGNUM_NEGATIVE_P (bignum))); @@ -1349,6 +1352,7 @@ bignum *factor_vm::bignum_maybe_new_sign(bignum * x, int negative_p) return (x); else { + GC_BIGNUM(x); bignum * result = (allot_bignum ((BIGNUM_LENGTH (x)), negative_p)); bignum_destructive_copy (x, result);