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>