Skip to content

Commit dc61281

Browse files
committed
std.Io: delete CountingReader
1 parent 43fbc37 commit dc61281

File tree

7 files changed

+77
-174
lines changed

7 files changed

+77
-174
lines changed

lib/std/Build/Step/CheckObject.zig

Lines changed: 16 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1224,32 +1224,30 @@ const MachODumper = struct {
12241224
}
12251225

12261226
fn parseRebaseInfo(ctx: ObjectContext, data: []const u8, rebases: *std.array_list.Managed(u64)) !void {
1227-
var stream = std.io.fixedBufferStream(data);
1228-
var creader = std.io.countingReader(stream.reader());
1229-
const reader = creader.reader();
1227+
var reader: std.Io.Reader = .fixed(data);
12301228

12311229
var seg_id: ?u8 = null;
12321230
var offset: u64 = 0;
12331231
while (true) {
1234-
const byte = reader.readByte() catch break;
1232+
const byte = reader.takeByte() catch break;
12351233
const opc = byte & macho.REBASE_OPCODE_MASK;
12361234
const imm = byte & macho.REBASE_IMMEDIATE_MASK;
12371235
switch (opc) {
12381236
macho.REBASE_OPCODE_DONE => break,
12391237
macho.REBASE_OPCODE_SET_TYPE_IMM => {},
12401238
macho.REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB => {
12411239
seg_id = imm;
1242-
offset = try std.leb.readUleb128(u64, reader);
1240+
offset = try reader.takeLeb128(u64);
12431241
},
12441242
macho.REBASE_OPCODE_ADD_ADDR_IMM_SCALED => {
12451243
offset += imm * @sizeOf(u64);
12461244
},
12471245
macho.REBASE_OPCODE_ADD_ADDR_ULEB => {
1248-
const addend = try std.leb.readUleb128(u64, reader);
1246+
const addend = try reader.takeLeb128(u64);
12491247
offset += addend;
12501248
},
12511249
macho.REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB => {
1252-
const addend = try std.leb.readUleb128(u64, reader);
1250+
const addend = try reader.takeLeb128(u64);
12531251
const seg = ctx.segments.items[seg_id.?];
12541252
const addr = seg.vmaddr + offset;
12551253
try rebases.append(addr);
@@ -1266,11 +1264,11 @@ const MachODumper = struct {
12661264
ntimes = imm;
12671265
},
12681266
macho.REBASE_OPCODE_DO_REBASE_ULEB_TIMES => {
1269-
ntimes = try std.leb.readUleb128(u64, reader);
1267+
ntimes = try reader.takeLeb128(u64);
12701268
},
12711269
macho.REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB => {
1272-
ntimes = try std.leb.readUleb128(u64, reader);
1273-
skip = try std.leb.readUleb128(u64, reader);
1270+
ntimes = try reader.takeLeb128(u64);
1271+
skip = try reader.takeLeb128(u64);
12741272
},
12751273
else => unreachable,
12761274
}
@@ -1431,7 +1429,7 @@ const MachODumper = struct {
14311429
defer arena.deinit();
14321430

14331431
var exports = std.array_list.Managed(Export).init(arena.allocator());
1434-
var it = TrieIterator{ .data = data };
1432+
var it: TrieIterator = .{ .stream = .fixed(data) };
14351433
try parseTrieNode(arena.allocator(), &it, "", &exports);
14361434

14371435
mem.sort(Export, exports.items, {}, Export.lessThan);
@@ -1462,42 +1460,18 @@ const MachODumper = struct {
14621460
}
14631461

14641462
const TrieIterator = struct {
1465-
data: []const u8,
1466-
pos: usize = 0,
1467-
1468-
fn getStream(it: *TrieIterator) std.io.FixedBufferStream([]const u8) {
1469-
return std.io.fixedBufferStream(it.data[it.pos..]);
1470-
}
1463+
stream: std.Io.Reader,
14711464

14721465
fn readUleb128(it: *TrieIterator) !u64 {
1473-
var stream = it.getStream();
1474-
var creader = std.io.countingReader(stream.reader());
1475-
const reader = creader.reader();
1476-
const value = try std.leb.readUleb128(u64, reader);
1477-
it.pos += creader.bytes_read;
1478-
return value;
1466+
return it.stream.takeLeb128(u64);
14791467
}
14801468

14811469
fn readString(it: *TrieIterator) ![:0]const u8 {
1482-
var stream = it.getStream();
1483-
const reader = stream.reader();
1484-
1485-
var count: usize = 0;
1486-
while (true) : (count += 1) {
1487-
const byte = try reader.readByte();
1488-
if (byte == 0) break;
1489-
}
1490-
1491-
const str = @as([*:0]const u8, @ptrCast(it.data.ptr + it.pos))[0..count :0];
1492-
it.pos += count + 1;
1493-
return str;
1470+
return it.stream.takeSentinel(0);
14941471
}
14951472

14961473
fn readByte(it: *TrieIterator) !u8 {
1497-
var stream = it.getStream();
1498-
const value = try stream.reader().readByte();
1499-
it.pos += 1;
1500-
return value;
1474+
return it.stream.takeByte();
15011475
}
15021476
};
15031477

@@ -1594,10 +1568,10 @@ const MachODumper = struct {
15941568
const label = try it.readString();
15951569
const off = try it.readUleb128();
15961570
const prefix_label = try std.fmt.allocPrint(arena, "{s}{s}", .{ prefix, label });
1597-
const curr = it.pos;
1598-
it.pos = off;
1571+
const curr = it.stream.seek;
1572+
it.stream.seek = off;
15991573
try parseTrieNode(arena, it, prefix_label, exports);
1600-
it.pos = curr;
1574+
it.stream.seek = curr;
16011575
}
16021576
}
16031577

lib/std/Io.zig

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -277,10 +277,6 @@ pub const AnyReader = @import("Io/DeprecatedReader.zig");
277277
pub const FixedBufferStream = @import("Io/fixed_buffer_stream.zig").FixedBufferStream;
278278
/// Deprecated in favor of `Reader`.
279279
pub const fixedBufferStream = @import("Io/fixed_buffer_stream.zig").fixedBufferStream;
280-
/// Deprecated with no replacement; inefficient pattern
281-
pub const CountingReader = @import("Io/counting_reader.zig").CountingReader;
282-
/// Deprecated with no replacement; inefficient pattern
283-
pub const countingReader = @import("Io/counting_reader.zig").countingReader;
284280

285281
pub const tty = @import("Io/tty.zig");
286282

@@ -750,7 +746,6 @@ pub fn PollFiles(comptime StreamEnum: type) type {
750746
test {
751747
_ = Reader;
752748
_ = Writer;
753-
_ = CountingReader;
754749
_ = FixedBufferStream;
755750
_ = tty;
756751
_ = @import("Io/test.zig");

lib/std/Io/counting_reader.zig

Lines changed: 0 additions & 43 deletions
This file was deleted.

src/arch/x86_64/Disassembler.zig

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,16 @@ const Rex = encoder.Rex;
1717

1818
pub const Error = error{
1919
EndOfStream,
20+
/// After the TODO below is solved this will make sense.
21+
ReadFailed,
2022
LegacyPrefixAfterRex,
2123
UnknownOpcode,
2224
Overflow,
2325
Todo,
2426
};
2527

28+
// TODO these fields should be replaced by std.Io.Reader
29+
2630
code: []const u8,
2731
pos: usize = 0,
2832

@@ -388,20 +392,20 @@ fn parseGpRegister(low_enc: u3, is_extended: bool, rex: Rex, bit_size: u64) Regi
388392
}
389393

390394
fn parseImm(dis: *Disassembler, kind: Encoding.Op) !Immediate {
391-
var stream = std.io.fixedBufferStream(dis.code[dis.pos..]);
392-
var creader = std.io.countingReader(stream.reader());
393-
const reader = creader.reader();
395+
var reader: std.Io.Reader = .fixed(dis.code);
396+
reader.seek = dis.pos;
397+
defer dis.pos = reader.seek;
398+
394399
const imm = switch (kind) {
395-
.imm8s, .rel8 => Immediate.s(try reader.readInt(i8, .little)),
396-
.imm16s, .rel16 => Immediate.s(try reader.readInt(i16, .little)),
397-
.imm32s, .rel32 => Immediate.s(try reader.readInt(i32, .little)),
398-
.imm8 => Immediate.u(try reader.readInt(u8, .little)),
399-
.imm16 => Immediate.u(try reader.readInt(u16, .little)),
400-
.imm32 => Immediate.u(try reader.readInt(u32, .little)),
401-
.imm64 => Immediate.u(try reader.readInt(u64, .little)),
400+
.imm8s, .rel8 => Immediate.s(try reader.takeInt(i8, .little)),
401+
.imm16s, .rel16 => Immediate.s(try reader.takeInt(i16, .little)),
402+
.imm32s, .rel32 => Immediate.s(try reader.takeInt(i32, .little)),
403+
.imm8 => Immediate.u(try reader.takeInt(u8, .little)),
404+
.imm16 => Immediate.u(try reader.takeInt(u16, .little)),
405+
.imm32 => Immediate.u(try reader.takeInt(u32, .little)),
406+
.imm64 => Immediate.u(try reader.takeInt(u64, .little)),
402407
else => unreachable,
403408
};
404-
dis.pos += std.math.cast(usize, creader.bytes_read) orelse return error.Overflow;
405409
return imm;
406410
}
407411

@@ -483,25 +487,25 @@ fn parseSibByte(dis: *Disassembler) !Sib {
483487
}
484488

485489
fn parseDisplacement(dis: *Disassembler, modrm: ModRm, sib: ?Sib) !i32 {
486-
var stream = std.io.fixedBufferStream(dis.code[dis.pos..]);
487-
var creader = std.io.countingReader(stream.reader());
488-
const reader = creader.reader();
490+
var reader: std.Io.Reader = .fixed(dis.code);
491+
reader.seek = dis.pos;
492+
defer dis.pos = reader.seek;
493+
489494
const disp = disp: {
490495
if (sib) |info| {
491496
if (info.base == 0b101 and modrm.mod == 0) {
492-
break :disp try reader.readInt(i32, .little);
497+
break :disp try reader.takeInt(i32, .little);
493498
}
494499
}
495500
if (modrm.rip()) {
496-
break :disp try reader.readInt(i32, .little);
501+
break :disp try reader.takeInt(i32, .little);
497502
}
498503
break :disp switch (modrm.mod) {
499504
0b00 => 0,
500-
0b01 => try reader.readInt(i8, .little),
501-
0b10 => try reader.readInt(i32, .little),
505+
0b01 => try reader.takeInt(i8, .little),
506+
0b10 => try reader.takeInt(i32, .little),
502507
0b11 => unreachable,
503508
};
504509
};
505-
dis.pos += std.math.cast(usize, creader.bytes_read) orelse return error.Overflow;
506510
return disp;
507511
}

src/link/MachO/Dwarf.zig

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -273,19 +273,19 @@ pub const InfoReader = struct {
273273
}
274274

275275
pub fn readUleb128(p: *InfoReader, comptime Type: type) !Type {
276-
var stream = std.io.fixedBufferStream(p.bytes()[p.pos..]);
277-
var creader = std.io.countingReader(stream.reader());
278-
const value: Type = try leb.readUleb128(Type, creader.reader());
279-
p.pos += math.cast(usize, creader.bytes_read) orelse return error.Overflow;
280-
return value;
276+
var reader: std.Io.Reader = .fixed(p.bytes());
277+
reader.seek = p.pos;
278+
defer p.pos = reader.seek;
279+
280+
return reader.takeLeb128(Type);
281281
}
282282

283283
pub fn readIleb128(p: *InfoReader, comptime Type: type) !Type {
284-
var stream = std.io.fixedBufferStream(p.bytes()[p.pos..]);
285-
var creader = std.io.countingReader(stream.reader());
286-
const value: Type = try leb.readIleb128(Type, creader.reader());
287-
p.pos += math.cast(usize, creader.bytes_read) orelse return error.Overflow;
288-
return value;
284+
var reader: std.Io.Reader = .fixed(p.bytes());
285+
reader.seek = p.pos;
286+
defer p.pos = reader.seek;
287+
288+
return reader.takeLeb128(Type);
289289
}
290290

291291
pub fn seekTo(p: *InfoReader, off: u64) !void {
@@ -340,11 +340,11 @@ pub const AbbrevReader = struct {
340340
}
341341

342342
pub fn readUleb128(p: *AbbrevReader, comptime Type: type) !Type {
343-
var stream = std.io.fixedBufferStream(p.bytes()[p.pos..]);
344-
var creader = std.io.countingReader(stream.reader());
345-
const value: Type = try leb.readUleb128(Type, creader.reader());
346-
p.pos += math.cast(usize, creader.bytes_read) orelse return error.Overflow;
347-
return value;
343+
var reader: std.Io.Reader = .fixed(p.bytes());
344+
reader.seek = p.pos;
345+
defer p.pos = reader.seek;
346+
347+
return reader.takeLeb128(Type);
348348
}
349349

350350
pub fn seekTo(p: *AbbrevReader, off: u64) !void {

src/link/MachO/Dylib.zig

Lines changed: 8 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -159,42 +159,18 @@ fn parseBinary(self: *Dylib, macho_file: *MachO) !void {
159159
}
160160

161161
const TrieIterator = struct {
162-
data: []const u8,
163-
pos: usize = 0,
164-
165-
fn getStream(it: *TrieIterator) std.io.FixedBufferStream([]const u8) {
166-
return std.io.fixedBufferStream(it.data[it.pos..]);
167-
}
162+
stream: std.Io.Reader,
168163

169164
fn readUleb128(it: *TrieIterator) !u64 {
170-
var stream = it.getStream();
171-
var creader = std.io.countingReader(stream.reader());
172-
const reader = creader.reader();
173-
const value = try std.leb.readUleb128(u64, reader);
174-
it.pos += math.cast(usize, creader.bytes_read) orelse return error.Overflow;
175-
return value;
165+
return it.stream.takeLeb128(u64);
176166
}
177167

178168
fn readString(it: *TrieIterator) ![:0]const u8 {
179-
var stream = it.getStream();
180-
const reader = stream.reader();
181-
182-
var count: usize = 0;
183-
while (true) : (count += 1) {
184-
const byte = try reader.readByte();
185-
if (byte == 0) break;
186-
}
187-
188-
const str = @as([*:0]const u8, @ptrCast(it.data.ptr + it.pos))[0..count :0];
189-
it.pos += count + 1;
190-
return str;
169+
return it.stream.takeSentinel(0);
191170
}
192171

193172
fn readByte(it: *TrieIterator) !u8 {
194-
var stream = it.getStream();
195-
const value = try stream.reader().readByte();
196-
it.pos += 1;
197-
return value;
173+
return it.stream.takeByte();
198174
}
199175
};
200176

@@ -243,10 +219,10 @@ fn parseTrieNode(
243219
const label = try it.readString();
244220
const off = try it.readUleb128();
245221
const prefix_label = try std.fmt.allocPrint(arena, "{s}{s}", .{ prefix, label });
246-
const curr = it.pos;
247-
it.pos = math.cast(usize, off) orelse return error.Overflow;
222+
const curr = it.stream.seek;
223+
it.stream.seek = math.cast(usize, off) orelse return error.Overflow;
248224
try self.parseTrieNode(it, allocator, arena, prefix_label);
249-
it.pos = curr;
225+
it.stream.seek = curr;
250226
}
251227
}
252228

@@ -257,7 +233,7 @@ fn parseTrie(self: *Dylib, data: []const u8, macho_file: *MachO) !void {
257233
var arena = std.heap.ArenaAllocator.init(gpa);
258234
defer arena.deinit();
259235

260-
var it: TrieIterator = .{ .data = data };
236+
var it: TrieIterator = .{ .stream = .fixed(data) };
261237
try self.parseTrieNode(&it, gpa, arena.allocator(), "");
262238
}
263239

0 commit comments

Comments
 (0)