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).
pull/8840/head
Mitchell Hashimoto 2025-09-21 20:47:58 -07:00
parent dfda3ac280
commit 9c92c3bb81
No known key found for this signature in database
GPG Key ID: 523D5DC389D273BC
1 changed files with 10 additions and 3 deletions

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