Group.members: fake sentinel at clone time
This commit is contained in:
parent
5704deb6b3
commit
d4d3729bf0
@ -7,18 +7,23 @@ const Group = @This();
|
||||
|
||||
gid: u32,
|
||||
name: [:0]const u8,
|
||||
//
|
||||
members: [:null]const ?[:0]const u8,
|
||||
// should be [:null]const ?[:0]const u8, but it crashes the compiler. See
|
||||
// https://github.com/ziglang/zig/issues/7517.
|
||||
// members[members.len] is always null for cloned groups. Once the bug
|
||||
// in the compiler is fixed, we should update the return type here.
|
||||
members: []const ?[:0]const u8,
|
||||
|
||||
pub fn clone(self: *const Group, allocator: Allocator) Allocator.Error!Group {
|
||||
var members = try allocator.allocSentinel(?[:0]const u8, self.members.len, null);
|
||||
var members = try allocator.alloc(?[:0]const u8, self.members.len + 1);
|
||||
errdefer allocator.free(members);
|
||||
members.len = self.members.len;
|
||||
members.len = self.members.len + 1;
|
||||
|
||||
for (self.members) |member, i| {
|
||||
const member_name = member.?;
|
||||
members[i] = try allocator.dupeZ(u8, member_name);
|
||||
members[i] = try allocator.dupeZ(u8, member.?);
|
||||
errdefer allocator.free(members[i]);
|
||||
}
|
||||
members[self.members.len] = null;
|
||||
members.len = self.members.len;
|
||||
|
||||
return Group{
|
||||
.gid = self.gid,
|
||||
@ -46,7 +51,7 @@ test "Group.clone" {
|
||||
var group = Group{
|
||||
.gid = 1,
|
||||
.name = "foo",
|
||||
.members = &[_:null]?[:0]const u8{ member1, "member2", null },
|
||||
.members = &[_:null]?[:0]const u8{ member1, "member2" },
|
||||
};
|
||||
|
||||
var cloned = try group.clone(testing.allocator);
|
||||
|
Loading…
Reference in New Issue
Block a user