From 9c92c3bb81cbd9c23d9ecee5e1f18c3a08dc1ebc Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sun, 21 Sep 2025 20:47:58 -0700 Subject: [PATCH] fastmem non-libc needs to use copyBackwards if dest > src This fixes test failures when Ghostty's core is run without libc. Ghostty in the real world (all built executables) require libc so this bug has never been hit before, but I'm working on a libc-less core and this caused real test failures (so its already tested, as well). --- src/fastmem.zig | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/fastmem.zig b/src/fastmem.zig index 687c057af..bdea44155 100644 --- a/src/fastmem.zig +++ b/src/fastmem.zig @@ -2,13 +2,20 @@ const std = @import("std"); const builtin = @import("builtin"); const assert = std.debug.assert; -/// Same as std.mem.copyForwards but prefers libc memmove if it is available -/// because it is generally much faster. +/// Same as std.mem.copyForwards/Backwards but prefers libc memmove if it is +/// available because it is generally much faster. pub inline fn move(comptime T: type, dest: []T, source: []const T) void { if (builtin.link_libc) { _ = memmove(dest.ptr, source.ptr, source.len * @sizeOf(T)); } else { - std.mem.copyForwards(T, dest, source); + // Depending on the ordering of the copy, we need to use the + // proper call here. Unfortunately this function call is + // too generic to know this at comptime. + if (@intFromPtr(dest.ptr) <= @intFromPtr(source.ptr)) { + std.mem.copyForwards(T, dest, source); + } else { + std.mem.copyBackwards(T, dest, source); + } } }