Skip to content

Commit

Permalink
add behavior test for @memset on slices
Browse files Browse the repository at this point in the history
and avoid new language feature in std.ArrayList for now, until x86_64
self-hosted backend can implement it.
  • Loading branch information
andrewrk committed Apr 23, 2023
1 parent 0b4d061 commit de70914
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 2 deletions.
16 changes: 14 additions & 2 deletions lib/std/array_list.zig
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
}
Expand Down
50 changes: 50 additions & 0 deletions test/behavior/basic.zig
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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;
Expand Down

0 comments on commit de70914

Please sign in to comment.