From 66b410b81f8e53d3e590125a4ef23ac9b05a51c5 Mon Sep 17 00:00:00 2001 From: Samuel Tardieu <sam@rfc1149.net> Date: Fri, 26 Dec 2008 20:58:45 +0100 Subject: [PATCH] Properly set bits in large bit arrays Bit arrays were not properly manipulated by set-bits or clear-bits if they were larger than 40 bits (one cell + one byte). Moreover, the bug was likely to cause a bus error on architectures unable to access unaligned words. --- basis/bit-arrays/bit-arrays-tests.factor | 2 ++ basis/bit-arrays/bit-arrays.factor | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/basis/bit-arrays/bit-arrays-tests.factor b/basis/bit-arrays/bit-arrays-tests.factor index a5ae23dde6..24c27fa15b 100644 --- a/basis/bit-arrays/bit-arrays-tests.factor +++ b/basis/bit-arrays/bit-arrays-tests.factor @@ -76,3 +76,5 @@ IN: bit-arrays.tests t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t } bit-array>integer ] unit-test + +[ 49 ] [ 49 <bit-array> dup set-bits [ ] count ] unit-test diff --git a/basis/bit-arrays/bit-arrays.factor b/basis/bit-arrays/bit-arrays.factor index 66c786f6bb..18796fbfed 100644 --- a/basis/bit-arrays/bit-arrays.factor +++ b/basis/bit-arrays/bit-arrays.factor @@ -25,7 +25,7 @@ TUPLE: bit-array : (set-bits) ( bit-array n -- ) [ [ length bits>cells ] keep ] dip swap underlying>> - '[ [ _ _ ] dip set-alien-unsigned-4 ] each ; inline + '[ 2 shift [ _ _ ] dip set-alien-unsigned-4 ] each ; inline PRIVATE>