terminal/new: hashmap k/v offsets were off the wrong base

This commit is contained in:
Mitchell Hashimoto
2024-02-23 19:56:12 -08:00
parent d87a1c694e
commit c2ec97b804
2 changed files with 13 additions and 3 deletions

View File

@ -291,15 +291,16 @@ fn HashMapUnmanaged(
assert(@intFromPtr(buf.start()) % base_align == 0);
// Get all our main pointers
const metadata_ptr: [*]Metadata = @ptrCast(buf.start() + @sizeOf(Header));
const metadata_buf = buf.rebase(@sizeOf(Header));
const metadata_ptr: [*]Metadata = @ptrCast(metadata_buf.start());
// Build our map
var map: Self = .{ .metadata = metadata_ptr };
const hdr = map.header();
hdr.capacity = layout.capacity;
hdr.size = 0;
if (@sizeOf([*]K) != 0) hdr.keys = buf.member(K, layout.keys_start);
if (@sizeOf([*]V) != 0) hdr.values = buf.member(V, layout.vals_start);
if (@sizeOf([*]K) != 0) hdr.keys = metadata_buf.member(K, layout.keys_start);
if (@sizeOf([*]V) != 0) hdr.values = metadata_buf.member(V, layout.vals_start);
map.initMetadatas();
return map;

View File

@ -105,6 +105,15 @@ pub const OffsetBuf = struct {
.offset = self.offset + offset,
};
}
/// Rebase the offset to have a zero offset by rebasing onto start.
/// This is similar to `add` but all of the offsets are merged into base.
pub fn rebase(self: OffsetBuf, offset: usize) OffsetBuf {
return .{
.base = self.start() + offset,
.offset = 0,
};
}
};
/// Get the offset for a given type from some base pointer to the