~ chicken-core (chicken-5) 33cea4e5fb2a44a25d868b90665859dee700f5b7
commit 33cea4e5fb2a44a25d868b90665859dee700f5b7
Author: Peter Bex <peter@more-magic.net>
AuthorDate: Mon Jan 25 20:45:22 2016 +0100
Commit: Peter Bex <peter@more-magic.net>
CommitDate: Mon Jan 25 20:45:22 2016 +0100
Fix number->string "overlap" radix handling.
For power of two radices which had a bit length that's not an exact
multiple of the word size, this would sometimes result in leading zeroes
or assertion failures (direct port of the corresponding fix in the
CHICKEN 4 numbers egg).
diff --git a/runtime.c b/runtime.c
index c09f6c9e..bbd24524 100644
--- a/runtime.c
+++ b/runtime.c
@@ -11545,8 +11545,9 @@ static void bignum_to_str_2(C_word c, C_word *av)
radix_digit = big_digit;
big_digit = *scan++;
radix_digit |= ((unsigned int)big_digit << big_digit_len) & radix_mask;
+ *index-- = characters[radix_digit];
big_digit >>= (radix_shift - big_digit_len);
- big_digit_len = C_BIGNUM_DIGIT_LENGTH - big_digit_len;
+ big_digit_len = C_BIGNUM_DIGIT_LENGTH - (radix_shift - big_digit_len);
}
while(big_digit_len >= radix_shift && index >= buf) {
diff --git a/tests/numbers-test.scm b/tests/numbers-test.scm
index fb556295..dcee51fe 100644
--- a/tests/numbers-test.scm
+++ b/tests/numbers-test.scm
@@ -972,6 +972,12 @@
(test-equal "edge case printing"
(number->string (expt 2 256) 16)
"10000000000000000000000000000000000000000000000000000000000000000")
+ (test-equal "non-exact multiple of 64 length edge case printing"
+ "4000000000000000000000" (number->string (expt 2 65) 8))
+ (test-equal "another non-exact multiple of 64 length edge case printing"
+ "200000000000000000000000" (number->string (expt 2 70) 8))
+ (test-equal "edge case length calculation"
+ "10000000000000000000000000000000000000000000000000000000000000000000000" (number->string (expt 2 210) 8))
(test-equal "positive hexdigit invariance"
(number->string
(string->number "123456789abcdef123456789abcdef123456789abcdef" 16)
Trap