From c2ec97b804c416d1c67fce0cdddbbaf64a4867eb Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 23 Feb 2024 19:56:12 -0800 Subject: [PATCH] terminal/new: hashmap k/v offsets were off the wrong base --- src/terminal/new/hash_map.zig | 7 ++++--- src/terminal/new/size.zig | 9 +++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/terminal/new/hash_map.zig b/src/terminal/new/hash_map.zig index a6433260b..c9c650784 100644 --- a/src/terminal/new/hash_map.zig +++ b/src/terminal/new/hash_map.zig @@ -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; diff --git a/src/terminal/new/size.zig b/src/terminal/new/size.zig index b74316c8a..fead2b469 100644 --- a/src/terminal/new/size.zig +++ b/src/terminal/new/size.zig @@ -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