~ chicken-core (chicken-5) 9f4578b9145d325922d6f0d155db86536e4afe6b
commit 9f4578b9145d325922d6f0d155db86536e4afe6b
Author: Peter Bex <peter@more-magic.net>
AuthorDate: Sun Jun 4 12:42:28 2017 +0200
Commit: Peter Bex <peter@more-magic.net>
CommitDate: Sun Jun 4 12:42:28 2017 +0200
Fix "UL" left shift constants which are too small on 64-bit machines
Shifting left a value for more than the width of the value's type is
undefined, even if the result is written into a wider type. This
resulted in a hang on 64-bit Windows (and possibly other platforms
with the same compiler) because "1UL" is a 32-bit quantity there.
diff --git a/runtime.c b/runtime.c
index 9e969b79..5b0fa049 100644
--- a/runtime.c
+++ b/runtime.c
@@ -3183,7 +3183,7 @@ C_regparm C_word C_fcall C_mutate_scratch_slot(C_word *slot, C_word val)
void C_save_and_reclaim(void *trampoline, int n, C_word *av)
{
- C_word new_size = nmax(1UL << C_ilen(n), DEFAULT_TEMPORARY_STACK_SIZE);
+ C_word new_size = nmax((C_word)1 << C_ilen(n), DEFAULT_TEMPORARY_STACK_SIZE);
assert(av > C_temporary_stack_bottom || av < C_temporary_stack_limit);
assert(C_temporary_stack == C_temporary_stack_bottom);
@@ -9866,9 +9866,9 @@ bignum_destructive_divide_normalized(C_word big_u, C_word big_v, C_word big_q)
rhat = hat % vn_1;
/* Two whiles is faster than one big check with an OR. Thanks, Gauche! */
- while(qhat >= (1UL << C_BIGNUM_HALF_DIGIT_LENGTH)) { qhat--; rhat += vn_1; }
+ while(qhat >= ((C_word)1 << C_BIGNUM_HALF_DIGIT_LENGTH)) { qhat--; rhat += vn_1; }
while(qhat * vn_2 > C_BIGNUM_DIGIT_COMBINE(rhat, C_uhword_ref(u, j+n-2))
- && rhat < (1UL << C_BIGNUM_HALF_DIGIT_LENGTH)) {
+ && rhat < ((C_word)1 << C_BIGNUM_HALF_DIGIT_LENGTH)) {
qhat--;
rhat += vn_1;
}
Trap