diff --git a/bitarray/_bitarray.c b/bitarray/_bitarray.c index 0add832b1..eaaf0d52e 100644 --- a/bitarray/_bitarray.c +++ b/bitarray/_bitarray.c @@ -253,25 +253,34 @@ copy_n(bitarrayobject *self, idx_t a, assert(0 <= n && n <= self->nbits && n <= other->nbits); assert(0 <= a && a <= self->nbits - n); assert(0 <= b && b <= other->nbits - n); + if (n == 0){ + return; + } - /* XXX if (self->endian == other->endian && a % 8 == 0 && b % 8 == 0 && n >= 8) { - Py_ssize_t bytes; - idx_t bits; + const Py_ssize_t bytes = (Py_ssize_t) n / 8; + const idx_t bits = bytes * 8; + + if (a <= b){ + memmove(self->ob_item + a / 8, other->ob_item + b / 8, bytes); + } + + if (n != bits) { + copy_n(self, bits + a, other, bits + b, n - bits); + } + + if (a > b){ + memmove(self->ob_item + a / 8, other->ob_item + b / 8, bytes); + } - bytes = n / 8; - bits = 8 * bytes; - copy_n(self, bits + a, other, bits + b, n - bits); - memmove(self->ob_item + a / 8, other->ob_item + b / 8, bytes); return; } - */ /* the different type of looping is only relevant when other and self are the same object, i.e. when copying a piece of an bitarrayobject onto itself */ - if (a < b) { + if (a <= b) { for (i = 0; i < n; i++) /* loop forward (delete) */ setbit(self, i + a, GETBIT(other, i + b)); } diff --git a/test/test_bitarray.py b/test/test_bitarray.py index 4b60e3d6d..27e6ca33f 100644 --- a/test/test_bitarray.py +++ b/test/test_bitarray.py @@ -506,7 +506,7 @@ def test_setitem4(self): for a in self.randombitarrays(): la = len(a) if la == 0: continue - for dum in range(3): + for dum in range(50): step = self.rndsliceidx(la) if step == 0: step = None s = slice(self.rndsliceidx(la), @@ -580,7 +580,7 @@ def test_delitem2(self): for a in self.randombitarrays(): la = len(a) if la == 0: continue - for dum in range(10): + for dum in range(50): step = self.rndsliceidx(la) if step == 0: step = None s = slice(self.rndsliceidx(la),