std: Get rid of hash_offet in RawTable
This offset is always zero, and we don't consistently take it into account. This is okay, because it's zero, but if it ever changes we're going to have bugs (e.g. in the `dealloc` call, where we don't take it into account). It's better to remove this for now; if we ever have a need for a nonzero offset we can add it back, and handle it properly when we do so.
This commit is contained in:
parent
d21c023964
commit
bb9e850246
@ -717,26 +717,25 @@ fn calculate_offsets(hashes_size: usize,
|
||||
(pairs_offset, end_of_pairs, oflo)
|
||||
}
|
||||
|
||||
// Returns a tuple of (minimum required malloc alignment, hash_offset,
|
||||
// Returns a tuple of (minimum required malloc alignment,
|
||||
// array_size), from the start of a mallocated array.
|
||||
fn calculate_allocation(hash_size: usize,
|
||||
hash_align: usize,
|
||||
pairs_size: usize,
|
||||
pairs_align: usize)
|
||||
-> (usize, usize, usize, bool) {
|
||||
let hash_offset = 0;
|
||||
-> (usize, usize, bool) {
|
||||
let (_, end_of_pairs, oflo) = calculate_offsets(hash_size, pairs_size, pairs_align);
|
||||
|
||||
let align = cmp::max(hash_align, pairs_align);
|
||||
|
||||
(align, hash_offset, end_of_pairs, oflo)
|
||||
(align, end_of_pairs, oflo)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_offset_calculation() {
|
||||
assert_eq!(calculate_allocation(128, 8, 16, 8), (8, 0, 144, false));
|
||||
assert_eq!(calculate_allocation(3, 1, 2, 1), (1, 0, 5, false));
|
||||
assert_eq!(calculate_allocation(6, 2, 12, 4), (4, 0, 20, false));
|
||||
assert_eq!(calculate_allocation(128, 8, 16, 8), (8, 144, false));
|
||||
assert_eq!(calculate_allocation(3, 1, 2, 1), (1, 5, false));
|
||||
assert_eq!(calculate_allocation(6, 2, 12, 4), (4, 20, false));
|
||||
assert_eq!(calculate_offsets(128, 15, 4), (128, 143, false));
|
||||
assert_eq!(calculate_offsets(3, 2, 4), (4, 6, false));
|
||||
assert_eq!(calculate_offsets(6, 12, 4), (8, 20, false));
|
||||
@ -768,10 +767,10 @@ impl<K, V> RawTable<K, V> {
|
||||
// This is great in theory, but in practice getting the alignment
|
||||
// right is a little subtle. Therefore, calculating offsets has been
|
||||
// factored out into a different function.
|
||||
let (alignment, hash_offset, size, oflo) = calculate_allocation(hashes_size,
|
||||
align_of::<HashUint>(),
|
||||
pairs_size,
|
||||
align_of::<(K, V)>());
|
||||
let (alignment, size, oflo) = calculate_allocation(hashes_size,
|
||||
align_of::<HashUint>(),
|
||||
pairs_size,
|
||||
align_of::<(K, V)>());
|
||||
assert!(!oflo, "capacity overflow");
|
||||
|
||||
// One check for overflow that covers calculation and rounding of size.
|
||||
@ -784,7 +783,7 @@ impl<K, V> RawTable<K, V> {
|
||||
let buffer = Heap.alloc(Layout::from_size_align(size, alignment).unwrap())
|
||||
.unwrap_or_else(|e| Heap.oom(e));
|
||||
|
||||
let hashes = buffer.offset(hash_offset as isize) as *mut HashUint;
|
||||
let hashes = buffer as *mut HashUint;
|
||||
|
||||
RawTable {
|
||||
capacity_mask: capacity.wrapping_sub(1),
|
||||
@ -1183,10 +1182,10 @@ unsafe impl<#[may_dangle] K, #[may_dangle] V> Drop for RawTable<K, V> {
|
||||
|
||||
let hashes_size = self.capacity() * size_of::<HashUint>();
|
||||
let pairs_size = self.capacity() * size_of::<(K, V)>();
|
||||
let (align, _, size, oflo) = calculate_allocation(hashes_size,
|
||||
align_of::<HashUint>(),
|
||||
pairs_size,
|
||||
align_of::<(K, V)>());
|
||||
let (align, size, oflo) = calculate_allocation(hashes_size,
|
||||
align_of::<HashUint>(),
|
||||
pairs_size,
|
||||
align_of::<(K, V)>());
|
||||
|
||||
debug_assert!(!oflo, "should be impossible");
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user