From 00afaa4b1822e9d2c096830e546e96ab4e87f25b Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Fri, 18 Apr 2025 18:23:06 -0700 Subject: [PATCH] std.io.BufferedReader: get rid of the `@constCast` but it's pushed out to various callsites --- lib/std/debug/Dwarf.zig | 2 +- lib/std/debug/Dwarf/expression.zig | 4 ++-- lib/std/debug/FixedBufferReader.zig | 2 +- lib/std/debug/SelfInfo.zig | 4 ++-- lib/std/io/BufferedReader.zig | 8 +++++--- 5 files changed, 11 insertions(+), 9 deletions(-) diff --git a/lib/std/debug/Dwarf.zig b/lib/std/debug/Dwarf.zig index 422d0e5b2e7a9b54e2eac7044be8cc76c5d144b8..4106b7d621bdea03fffb914ecf87ffec9968e76e 100644 --- a/lib/std/debug/Dwarf.zig +++ b/lib/std/debug/Dwarf.zig @@ -2236,7 +2236,7 @@ pub const ElfModule = struct { const section_bytes = try chopSlice(mapped_mem, shdr.sh_offset, shdr.sh_size); sections[section_index.?] = if ((shdr.sh_flags & elf.SHF_COMPRESSED) > 0) blk: { var section_reader: std.io.BufferedReader = undefined; - section_reader.initFixed(section_bytes); + section_reader.initFixed(@constCast(section_bytes)); const chdr = section_reader.takeStruct(elf.Chdr) catch continue; if (chdr.ch_type != .ZLIB) continue; const ch_size = chdr.ch_size; diff --git a/lib/std/debug/Dwarf/expression.zig b/lib/std/debug/Dwarf/expression.zig index 4f11830d9c460603106d203d8960e733d5f4b9cb..3bdef6f03bc8b710a906eb8814675c15ded1ab8a 100644 --- a/lib/std/debug/Dwarf/expression.zig +++ b/lib/std/debug/Dwarf/expression.zig @@ -262,7 +262,7 @@ pub fn StackMachine(comptime options: Options) type { ) Error!?Value { if (initial_value) |i| try self.stack.append(allocator, .{ .generic = i }); var reader: std.io.BufferedReader = undefined; - reader.initFixed(expression); + reader.initFixed(@constCast(expression)); while (try self.step(&reader, allocator, context)) {} if (self.stack.items.len == 0) return null; return self.stack.items[self.stack.items.len - 1]; @@ -721,7 +721,7 @@ pub fn StackMachine(comptime options: Options) type { if (context.thread_context == null) return error.IncompleteExpressionContext; var block_reader: std.io.BufferedReader = undefined; - block_reader.initFixed(block); + block_reader.initFixed(@constCast(block)); const register = (try readOperand(&block_reader, block[0], context)).?.register; const value = mem.readInt(usize, (try abi.regBytes(context.thread_context.?, register, context.reg_context))[0..@sizeOf(usize)], native_endian); try self.stack.append(allocator, .{ .generic = value }); diff --git a/lib/std/debug/FixedBufferReader.zig b/lib/std/debug/FixedBufferReader.zig index dc431ad0745a7d1b5c99e5fa3ff1d05e85aa0c29..035495ca5503eaf7334cd0a8e17449831f2e32b2 100644 --- a/lib/std/debug/FixedBufferReader.zig +++ b/lib/std/debug/FixedBufferReader.zig @@ -53,7 +53,7 @@ pub fn readIntChecked( pub fn readLeb128(fbr: *FixedBufferReader, comptime T: type) Error!T { var br: std.io.BufferedReader = undefined; - br.initFixed(fbr.buf); + br.initFixed(@constCast(fbr.buf)); br.seek = fbr.pos; const result = br.takeLeb128(T); fbr.pos = br.seek; diff --git a/lib/std/debug/SelfInfo.zig b/lib/std/debug/SelfInfo.zig index 3b44ffcd6eae822a8ca26991e859b4adf2540d92..dfc4993297c6a3d77aa704debe7ab8847d618a62 100644 --- a/lib/std/debug/SelfInfo.zig +++ b/lib/std/debug/SelfInfo.zig @@ -2026,8 +2026,8 @@ pub const VirtualMachine = struct { if (pc < fde.pc_begin or pc >= fde.pc_begin + fde.pc_range) return error.AddressOutOfRange; var readers: [2]std.io.BufferedReader = undefined; - readers[0].initFixed(cie.initial_instructions); - readers[1].initFixed(fde.instructions); + readers[0].initFixed(@constCast(cie.initial_instructions)); + readers[1].initFixed(@constCast(fde.instructions)); var prev_row: Row = self.current_row; for (&readers, [2]bool{ true, false }) |*reader, is_initial| { diff --git a/lib/std/io/BufferedReader.zig b/lib/std/io/BufferedReader.zig index e7c163b316794f49e0ced1749f5fccc72fef47af..18182526860ed864f07cb32c798ab44192e61c29 100644 --- a/lib/std/io/BufferedReader.zig +++ b/lib/std/io/BufferedReader.zig @@ -24,12 +24,14 @@ pub fn init(br: *BufferedReader, r: Reader, buffer: []u8) void { } /// Constructs `br` such that it will read from `buffer` and then end. -/// TODO either remove the const cast here or make methods of this file return a const slice -pub fn initFixed(br: *BufferedReader, buffer: []const u8) void { +/// +/// Most methods do not require mutating `buffer`. Those that do are marked, +/// and if they are avoided then `buffer` can be safely used with `@constCast`. +pub fn initFixed(br: *BufferedReader, buffer: []u8) void { br.* = .{ .seek = 0, .storage = .{ - .buffer = @constCast(buffer), + .buffer = buffer, .unbuffered_writer = .failing, }, .unbuffered_reader = .ending, -- 2.54.0