Skip to content

Commit 6c74085

Browse files
committed
fix value bit corruption
New benchmarks test node::redeem::benches::decode_fixed_program ... bench: 47,575.83 ns/iter (+/- 1,888.92) test value::benches::bench_value_create_512_256 ... bench: 62,040.00 ns/iter (+/- 684.18) test value::benches::bench_value_create_512_256_compact ... bench: 3,091.83 ns/iter (+/- 19.26) test value::benches::bench_value_create_512_256_padded ... bench: 3,034.38 ns/iter (+/- 17.38) test value::benches::bench_value_create_64k ... bench: 671,748.75 ns/iter (+/- 4,494.75) test value::benches::bench_value_create_64k_compact ... bench: 32,111.70 ns/iter (+/- 5,517.22) test value::benches::bench_value_create_64k_padded ... bench: 32,177.62 ns/iter (+/- 7,199.71) test value::benches::bench_value_create_deep_some ... bench: 401,901.88 ns/iter (+/- 4,945.75) test value::benches::bench_value_create_deep_some_compact ... bench: 145,748.00 ns/iter (+/- 833.20) test value::benches::bench_value_create_deep_some_padded ... bench: 1,205.44 ns/iter (+/- 5.89) test value::benches::bench_value_create_u2048 ... bench: 482,537.50 ns/iter (+/- 8,726.38) test value::benches::bench_value_create_u2048_compact ... bench: 2,169.61 ns/iter (+/- 7.86) test value::benches::bench_value_create_u2048_padded ... bench: 2,075.53 ns/iter (+/- 16.34) test value::benches::bench_value_create_u64 ... bench: 32.03 ns/iter (+/- 0.91) test value::benches::bench_value_create_u64_compact ... bench: 162.57 ns/iter (+/- 1.75) test value::benches::bench_value_create_u64_padded ... bench: 113.74 ns/iter (+/- 0.67) test value::benches::bench_value_display_512_256 ... bench: 74,847.14 ns/iter (+/- 1,099.57) test value::benches::bench_value_display_64k ... bench: 709,160.00 ns/iter (+/- 12,038.00) test value::benches::bench_value_display_deep_some ... bench: 43,401.18 ns/iter (+/- 559.59) test value::benches::bench_value_display_u2024 ... bench: 44,913.00 ns/iter (+/- 477.15) test value::benches::bench_value_display_u64 ... bench: 357.24 ns/iter (+/- 7.69)
1 parent a7d67c7 commit 6c74085

File tree

1 file changed

+10
-5
lines changed

1 file changed

+10
-5
lines changed

src/value.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -276,14 +276,19 @@ fn right_shift_1(inner: &Arc<[u8]>, bit_offset: usize, new_bit: bool) -> (Arc<[u
276276
// If the current bit offset is nonzero this is super easy: we just
277277
// lower the bit offset and call that a fix.
278278
if bit_offset > 0 {
279-
if new_bit {
280-
let new_bit_offset = bit_offset - 1;
279+
let new_bit_offset = bit_offset - 1;
280+
let mask = 1u8 << (7 - new_bit_offset % 8);
281+
let current_bit = inner[new_bit_offset / 8] & mask != 0;
282+
if current_bit == new_bit {
283+
(Arc::clone(inner), new_bit_offset)
284+
} else if new_bit {
281285
let mut bx: Box<[u8]> = inner.as_ref().into();
282-
bx[new_bit_offset / 8] |= 1 << (7 - new_bit_offset % 8);
286+
bx[new_bit_offset / 8] |= mask;
283287
(bx.into(), new_bit_offset)
284288
} else {
285-
// ...and if we are inserting a 0 we don't even need to allocate a new [u8]
286-
(Arc::clone(inner), bit_offset - 1)
289+
let mut bx: Box<[u8]> = inner.as_ref().into();
290+
bx[new_bit_offset / 8] &= !mask;
291+
(bx.into(), new_bit_offset)
287292
}
288293
} else {
289294
// If the current bit offset is 0, we just shift everything right by 8

0 commit comments

Comments
 (0)