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).
This commit is contained in:
Mitchell Hashimoto
2025-09-21 20:47:58 -07:00
parent dfda3ac280
commit 9c92c3bb81

View File

@@ -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 {
// 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);
}
}
}