From 2834bc90f8c451e5b0783501c661eb330ff24855 Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Mon, 16 Jun 2014 20:52:51 -0700 Subject: [PATCH] bignum.cpp: Fix regression in bignum conversion. Fixes #1072. --- vm/bignum.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/vm/bignum.cpp b/vm/bignum.cpp index d352fa1f98..8d33d312d8 100644 --- a/vm/bignum.cpp +++ b/vm/bignum.cpp @@ -344,13 +344,18 @@ bignum* factor_vm::bignum_remainder(bignum* numerator, bignum* denominator) { *scan = (accumulator & BIGNUM_DIGIT_MASK); \ return (result); \ } else { \ - BIGNUM_ASSERT(BIGNUM_DIGITS_FOR(type) == 2); \ - bignum* result = allot_bignum(2, negative_p); \ - bignum_digit_type* scan = (BIGNUM_START_PTR(result)); \ - (*scan++) = (accumulator & BIGNUM_DIGIT_MASK); \ - accumulator >>= BIGNUM_DIGIT_LENGTH; \ - *scan = (accumulator & BIGNUM_DIGIT_MASK); \ - BIGNUM_ASSERT((accumulator >> BIGNUM_DIGIT_LENGTH) == 0); \ + bignum_digit_type result_digits[BIGNUM_DIGITS_FOR(type)]; \ + bignum_digit_type* end_digits = result_digits; \ + do { \ + (*end_digits++) = (accumulator & BIGNUM_DIGIT_MASK); \ + accumulator >>= BIGNUM_DIGIT_LENGTH; \ + } while (accumulator != 0); \ + bignum* result = \ + (allot_bignum((end_digits - result_digits), negative_p)); \ + bignum_digit_type* scan_digits = result_digits; \ + bignum_digit_type* scan_result = (BIGNUM_START_PTR(result)); \ + while (scan_digits < end_digits) \ + (*scan_result++) = (*scan_digits++); \ return (result); \ } \ } \