From de709146e46d7c793d644c094696f8df2833076d Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sun, 23 Apr 2023 15:26:57 -0700 Subject: [PATCH] add behavior test for `@memset` on slices and avoid new language feature in std.ArrayList for now, until x86_64 self-hosted backend can implement it. --- lib/std/array_list.zig | 16 +++++++++++-- test/behavior/basic.zig | 50 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 2 deletions(-) diff --git a/lib/std/array_list.zig b/lib/std/array_list.zig index 1791482bc4db..54bed28285bb 100644 --- a/lib/std/array_list.zig +++ b/lib/std/array_list.zig @@ -121,7 +121,13 @@ pub fn ArrayListAligned(comptime T: type, comptime alignment: ?u29) type { const new_memory = try allocator.alignedAlloc(T, alignment, self.items.len); mem.copy(T, new_memory, self.items); - @memset(self.items, undefined); + + // TODO: write like this instead: + //@memset(self.items, undefined); + // first we need to implement memset with element ABI size > 1 in + // the x86_64 selfhosted backend. + @memset(@ptrCast([*]u8, self.items.ptr)[0..self.items.len * @sizeOf(T)], undefined); + self.clearAndFree(); return new_memory; } @@ -597,7 +603,13 @@ pub fn ArrayListAlignedUnmanaged(comptime T: type, comptime alignment: ?u29) typ const new_memory = try allocator.alignedAlloc(T, alignment, self.items.len); mem.copy(T, new_memory, self.items); - @memset(self.items, undefined); + + // TODO: write like this instead: + //@memset(self.items, undefined); + // first we need to implement memset with element ABI size > 1 in + // the x86_64 selfhosted backend. + @memset(@ptrCast([*]u8, self.items.ptr)[0..self.items.len * @sizeOf(T)], undefined); + self.clearAndFree(allocator); return new_memory; } diff --git a/test/behavior/basic.zig b/test/behavior/basic.zig index a1ea2c340f4f..a59397d0b5eb 100644 --- a/test/behavior/basic.zig +++ b/test/behavior/basic.zig @@ -357,6 +357,14 @@ test "@memset on array pointers" { if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_wasm) { + // TODO: implement memset when element ABI size > 1 + return error.SkipZigTest; + } + if (builtin.zig_backend == .stage2_x86_64) { + // TODO: implement memset when element ABI size > 1 + return error.SkipZigTest; + } try testMemsetArray(); try comptime testMemsetArray(); @@ -381,6 +389,48 @@ fn testMemsetArray() !void { } } +test "@memset on slices" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_wasm) { + // TODO: implement memset when element ABI size > 1 + // TODO: implement memset on slices + return error.SkipZigTest; + } + if (builtin.zig_backend == .stage2_x86_64) { + // TODO: implement memset when element ABI size > 1 + // TODO: implement memset on slices + return error.SkipZigTest; + } + + try testMemsetSlice(); + try comptime testMemsetSlice(); +} + +fn testMemsetSlice() !void { + { + // memset slice to non-undefined, ABI size == 1 + var array: [20]u8 = undefined; + var len = array.len; + var slice = array[0..len]; + @memset(slice, 'A'); + try expect(slice[0] == 'A'); + try expect(slice[11] == 'A'); + try expect(slice[19] == 'A'); + } + { + // memset slice to non-undefined, ABI size > 1 + var array: [20]u32 = undefined; + var len = array.len; + var slice = array[0..len]; + @memset(slice, 1234); + try expect(slice[0] == 1234); + try expect(slice[11] == 1234); + try expect(slice[19] == 1234); + } +} + test "memcpy and memset intrinsics" { if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;