From b368c9f1e89254a0cc6d2043b6063acba4d027b5 Mon Sep 17 00:00:00 2001 From: Simon Kornblith Date: Mon, 23 Jun 2014 13:19:32 -0400 Subject: [PATCH] Throw BoundsError on insert! beyond end of existing BitVector as well Ref #7373 Also fix return value of insert! to be the BitVector so it matches the behavior for Vectors --- base/bitarray.jl | 38 +++++++++++++++++--------------------- test/bitarray.jl | 6 ++++-- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/base/bitarray.jl b/base/bitarray.jl index e3a523dc9ff33..62464a1c7f949 100644 --- a/base/bitarray.jl +++ b/base/bitarray.jl @@ -592,34 +592,30 @@ function shift!(B::BitVector) end function insert!(B::BitVector, i::Integer, item) - i < 1 && throw(BoundsError()) - item = convert(Bool, item) - n = length(B) - if i > n - x = falses(i - n) - append!(B, x) - else - Bc = B.chunks + 1 <= i <= n+1 || throw(BoundsError()) + item = convert(Bool, item) - k, j = get_chunks_id(i) + Bc = B.chunks - l = @_mod64 length(B) - if l == 0 - ccall(:jl_array_grow_end, Void, (Any, Uint), Bc, 1) - Bc[end] = uint64(0) - end - B.len += 1 + k, j = get_chunks_id(i) - for t = length(Bc) : -1 : k + 1 - Bc[t] = (Bc[t] << 1) | (Bc[t - 1] >>> 63) - end + l = @_mod64 length(B) + if l == 0 + ccall(:jl_array_grow_end, Void, (Any, Uint), Bc, 1) + Bc[end] = uint64(0) + end + B.len += 1 - msk_aft = (_msk64 << j) - msk_bef = ~msk_aft - Bc[k] = (msk_bef & Bc[k]) | ((msk_aft & Bc[k]) << 1) + for t = length(Bc) : -1 : k + 1 + Bc[t] = (Bc[t] << 1) | (Bc[t - 1] >>> 63) end + + msk_aft = (_msk64 << j) + msk_bef = ~msk_aft + Bc[k] = (msk_bef & Bc[k]) | ((msk_aft & Bc[k]) << 1) B[i] = item + B end function _deleteat!(B::BitVector, i::Integer) diff --git a/test/bitarray.jl b/test/bitarray.jl index 78fb9c2b388c4..00f804de0481d 100644 --- a/test/bitarray.jl +++ b/test/bitarray.jl @@ -382,11 +382,13 @@ end @test length(b1) == 0 b1 = BitArray(0) +@test_throws BoundsError insert!(b1, 2, false) +@test_throws BoundsError insert!(b1, 0, false) i1 = bitunpack(b1) for m = 1 : v1 j = rand(1:m) x = randbool() - insert!(b1, j, x) + @test insert!(b1, j, x) === b1 insert!(i1, j, x) @test isequal(bitunpack(b1), i1) end @@ -395,7 +397,7 @@ b1 = randbool(v1) i1 = bitunpack(b1) for j in [63, 64, 65, 127, 128, 129, 191, 192, 193] x = rand(0:1) - insert!(b1, j, x) + @test insert!(b1, j, x) === b1 insert!(i1, j, x) @test isequal(bitunpack(b1), i1) end