authorgravatar for mail@isaacfreund.comIsaac Freund <mail@isaacfreund.com> 2023-01-24 11:37:30+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-01-24 15:39:52-05:00
log9eeae556cc77b408c8704c9bd43960f949e0ec10
treebaccdbf880f842cd8934d718c7894997f03283c8
parent4e80253e207258f01620b15e44866bc46708e6b1

std: remove meta.assumeSentinel

All but 3 callsites of this function in the standard library and compiler were unnecessary and were removed in faf2fd18. In this commit, the remaining 3 callsites are removed. One of them turned out to also be unnecessary and has been replaced by slicing directly with the length.. The 2 remaining callsites were in the very pointer-math heavy std/os/linux/vdso.zig code which should perhaps be refactored to better utilize slices. These 2 callsites are replaced with a plain @ptrCast([*:0]u8, ptr) though could likely use std.mem.sliceTo() if the surrounding code was refactored.

3 files changed, 4 insertions(+), 38 deletions(-)

lib/std/fs.zig+1-1
......@@ -3028,7 +3028,7 @@ pub fn selfExePath(out_buffer: []u8) SelfExePathError![]u8 {
30283028/// The result is UTF16LE-encoded.
30293029pub fn selfExePathW() [:0]const u16 {
30303030 const image_path_name = &os.windows.peb().ProcessParameters.ImagePathName;
3031 return mem.sliceTo(std.meta.assumeSentinel(image_path_name.Buffer, 0), 0);
3031 return image_path_name.Buffer[0 .. image_path_name.Length / 2 :0];
30323032}
30333033
30343034/// `selfExeDirPath` except allocates the result on the heap.
lib/std/meta.zig+1-35
......@@ -332,41 +332,7 @@ pub fn Sentinel(comptime T: type, comptime sentinel_val: Elem(T)) type {
332332 @compileError("Unable to derive a sentinel pointer type from " ++ @typeName(T));
333333}
334334
335/// Takes a Slice or Many Pointer and returns it with the Type modified to have the given sentinel value.
336/// This function assumes the caller has verified the memory contains the sentinel value.
337pub fn assumeSentinel(p: anytype, comptime sentinel_val: Elem(@TypeOf(p))) Sentinel(@TypeOf(p), sentinel_val) {
338 const T = @TypeOf(p);
339 const ReturnType = Sentinel(T, sentinel_val);
340 switch (@typeInfo(T)) {
341 .Pointer => |info| switch (info.size) {
342 .Slice, .Many, .One => return @ptrCast(ReturnType, p),
343 .C => {},
344 },
345 .Optional => |info| switch (@typeInfo(info.child)) {
346 .Pointer => |ptr_info| switch (ptr_info.size) {
347 .Many => return @ptrCast(ReturnType, p),
348 else => {},
349 },
350 else => {},
351 },
352 else => {},
353 }
354 @compileError("Unable to derive a sentinel pointer type from " ++ @typeName(T));
355}
356
357test "std.meta.assumeSentinel" {
358 try testing.expect([*:0]u8 == @TypeOf(assumeSentinel(@as([*]u8, undefined), 0)));
359 try testing.expect([:0]u8 == @TypeOf(assumeSentinel(@as([]u8, undefined), 0)));
360 try testing.expect([*:0]const u8 == @TypeOf(assumeSentinel(@as([*]const u8, undefined), 0)));
361 try testing.expect([:0]const u8 == @TypeOf(assumeSentinel(@as([]const u8, undefined), 0)));
362 try testing.expect([*:0]u16 == @TypeOf(assumeSentinel(@as([*]u16, undefined), 0)));
363 try testing.expect([:0]const u16 == @TypeOf(assumeSentinel(@as([]const u16, undefined), 0)));
364 try testing.expect([*:3]u8 == @TypeOf(assumeSentinel(@as([*:1]u8, undefined), 3)));
365 try testing.expect([:null]?[*]u8 == @TypeOf(assumeSentinel(@as([]?[*]u8, undefined), null)));
366 try testing.expect([*:null]?[*]u8 == @TypeOf(assumeSentinel(@as([*]?[*]u8, undefined), null)));
367 try testing.expect(*[10:0]u8 == @TypeOf(assumeSentinel(@as(*[10]u8, undefined), 0)));
368 try testing.expect(?[*:0]u8 == @TypeOf(assumeSentinel(@as(?[*]u8, undefined), 0)));
369}
335const assumeSentinel = @compileError("This function has been removed, consider using std.mem.sliceTo() or if needed a @ptrCast()");
370336
371337pub fn containerLayout(comptime T: type) Type.ContainerLayout {
372338 return switch (@typeInfo(T)) {
lib/std/os/linux/vdso.zig+2-2
......@@ -68,7 +68,7 @@ pub fn lookup(vername: []const u8, name: []const u8) usize {
6868 if (0 == (@as(u32, 1) << @intCast(u5, syms[i].st_info & 0xf) & OK_TYPES)) continue;
6969 if (0 == (@as(u32, 1) << @intCast(u5, syms[i].st_info >> 4) & OK_BINDS)) continue;
7070 if (0 == syms[i].st_shndx) continue;
71 const sym_name = std.meta.assumeSentinel(strings + syms[i].st_name, 0);
71 const sym_name = @ptrCast([*:0]u8, strings + syms[i].st_name);
7272 if (!mem.eql(u8, name, mem.sliceTo(sym_name, 0))) continue;
7373 if (maybe_versym) |versym| {
7474 if (!checkver(maybe_verdef.?, versym[i], vername, strings))
......@@ -91,6 +91,6 @@ fn checkver(def_arg: *elf.Verdef, vsym_arg: i32, vername: []const u8, strings: [
9191 def = @intToPtr(*elf.Verdef, @ptrToInt(def) + def.vd_next);
9292 }
9393 const aux = @intToPtr(*elf.Verdaux, @ptrToInt(def) + def.vd_aux);
94 const vda_name = std.meta.assumeSentinel(strings + aux.vda_name, 0);
94 const vda_name = @ptrCast([*:0]u8, strings + aux.vda_name);
9595 return mem.eql(u8, vername, mem.sliceTo(vda_name, 0));
9696}