| author | |
| committer | |
| log | 94dd28b7f7bdbbebe652d3e7a791bc86591ed9c8 |
| tree | 49c9e9f8c69b800c998b1d7b99fc71f7463d2903 |
| parent | 3fb86841cc65437c65a6d599117833e260ea797c |
9 files changed, 39 insertions(+), 91 deletions(-)
lib/compiler/resinator/cvtres.zig+2-9| ... | @@ -665,19 +665,16 @@ const ResourceTree = struct { | ... | @@ -665,19 +665,16 @@ const ResourceTree = struct { |
| 665 | pub fn writeCoff( | 665 | pub fn writeCoff( |
| 666 | self: *const ResourceTree, | 666 | self: *const ResourceTree, |
| 667 | allocator: Allocator, | 667 | allocator: Allocator, |
| 668 | writer: anytype, | 668 | w: anytype, |
| 669 | resources_in_data_order: []const Resource, | 669 | resources_in_data_order: []const Resource, |
| 670 | lengths: Lengths, | 670 | lengths: Lengths, |
| 671 | coff_string_table: *StringTable, | 671 | coff_string_table: *StringTable, |
| 672 | ) ![]const std.coff.Symbol { | 672 | ) ![]const std.coff.Symbol { |
| 673 | if (self.type_to_name_map.count() == 0) { | 673 | if (self.type_to_name_map.count() == 0) { |
| 674 | try writer.writeByteNTimes(0, 16); | 674 | try w.writeByteNTimes(0, 16); |
| 675 | return &.{}; | 675 | return &.{}; |
| 676 | } | 676 | } |
| 677 | 677 | ||
| 678 | var counting_writer = std.io.countingWriter(writer); | ||
| 679 | const w = counting_writer.writer(); | ||
| 680 | |||
| 681 | var level2_list: std.ArrayListUnmanaged(*const NameToLanguageMap) = .empty; | 678 | var level2_list: std.ArrayListUnmanaged(*const NameToLanguageMap) = .empty; |
| 682 | defer level2_list.deinit(allocator); | 679 | defer level2_list.deinit(allocator); |
| 683 | 680 | ||
| ... | @@ -735,7 +732,6 @@ const ResourceTree = struct { | ... | @@ -735,7 +732,6 @@ const ResourceTree = struct { |
| 735 | try level2_list.append(allocator, name_to_lang_map); | 732 | try level2_list.append(allocator, name_to_lang_map); |
| 736 | } | 733 | } |
| 737 | } | 734 | } |
| 738 | std.debug.assert(counting_writer.bytes_written == level2_start); | ||
| 739 | 735 | ||
| 740 | const level3_start = level2_start + lengths.level2; | 736 | const level3_start = level2_start + lengths.level2; |
| 741 | var level3_address = level3_start; | 737 | var level3_address = level3_start; |
| ... | @@ -771,7 +767,6 @@ const ResourceTree = struct { | ... | @@ -771,7 +767,6 @@ const ResourceTree = struct { |
| 771 | try level3_list.append(allocator, lang_to_resources_map); | 767 | try level3_list.append(allocator, lang_to_resources_map); |
| 772 | } | 768 | } |
| 773 | } | 769 | } |
| 774 | std.debug.assert(counting_writer.bytes_written == level3_start); | ||
| 775 | 770 | ||
| 776 | var reloc_addresses = try allocator.alloc(u32, resources_in_data_order.len); | 771 | var reloc_addresses = try allocator.alloc(u32, resources_in_data_order.len); |
| 777 | defer allocator.free(reloc_addresses); | 772 | defer allocator.free(reloc_addresses); |
| ... | @@ -813,7 +808,6 @@ const ResourceTree = struct { | ... | @@ -813,7 +808,6 @@ const ResourceTree = struct { |
| 813 | try resources_list.append(allocator, reloc_resource); | 808 | try resources_list.append(allocator, reloc_resource); |
| 814 | } | 809 | } |
| 815 | } | 810 | } |
| 816 | std.debug.assert(counting_writer.bytes_written == data_entries_start); | ||
| 817 | 811 | ||
| 818 | for (resources_list.items, 0..) |reloc_resource, i| { | 812 | for (resources_list.items, 0..) |reloc_resource, i| { |
| 819 | // TODO: This logic works but is convoluted, would be good to clean this up | 813 | // TODO: This logic works but is convoluted, would be good to clean this up |
| ... | @@ -827,7 +821,6 @@ const ResourceTree = struct { | ... | @@ -827,7 +821,6 @@ const ResourceTree = struct { |
| 827 | }; | 821 | }; |
| 828 | try w.writeStructEndian(data_entry, .little); | 822 | try w.writeStructEndian(data_entry, .little); |
| 829 | } | 823 | } |
| 830 | std.debug.assert(counting_writer.bytes_written == strings_start); | ||
| 831 | 824 | ||
| 832 | for (self.rsrc_string_table.keys()) |v| { | 825 | for (self.rsrc_string_table.keys()) |v| { |
| 833 | const str = v.name; | 826 | const str = v.name; |
lib/std/Io.zig-5| ... | @@ -432,10 +432,6 @@ pub const FixedBufferStream = @import("Io/fixed_buffer_stream.zig").FixedBufferS | ... | @@ -432,10 +432,6 @@ pub const FixedBufferStream = @import("Io/fixed_buffer_stream.zig").FixedBufferS |
| 432 | /// Deprecated in favor of `Reader`. | 432 | /// Deprecated in favor of `Reader`. |
| 433 | pub const fixedBufferStream = @import("Io/fixed_buffer_stream.zig").fixedBufferStream; | 433 | pub const fixedBufferStream = @import("Io/fixed_buffer_stream.zig").fixedBufferStream; |
| 434 | /// Deprecated with no replacement; inefficient pattern | 434 | /// Deprecated with no replacement; inefficient pattern |
| 435 | pub const CountingWriter = @import("Io/counting_writer.zig").CountingWriter; | ||
| 436 | /// Deprecated with no replacement; inefficient pattern | ||
| 437 | pub const countingWriter = @import("Io/counting_writer.zig").countingWriter; | ||
| 438 | /// Deprecated with no replacement; inefficient pattern | ||
| 439 | pub const CountingReader = @import("Io/counting_reader.zig").CountingReader; | 435 | pub const CountingReader = @import("Io/counting_reader.zig").CountingReader; |
| 440 | /// Deprecated with no replacement; inefficient pattern | 436 | /// Deprecated with no replacement; inefficient pattern |
| 441 | pub const countingReader = @import("Io/counting_reader.zig").countingReader; | 437 | pub const countingReader = @import("Io/counting_reader.zig").countingReader; |
| ... | @@ -917,7 +913,6 @@ test { | ... | @@ -917,7 +913,6 @@ test { |
| 917 | _ = Reader; | 913 | _ = Reader; |
| 918 | _ = Writer; | 914 | _ = Writer; |
| 919 | _ = BufferedWriter; | 915 | _ = BufferedWriter; |
| 920 | _ = CountingWriter; | ||
| 921 | _ = CountingReader; | 916 | _ = CountingReader; |
| 922 | _ = FixedBufferStream; | 917 | _ = FixedBufferStream; |
| 923 | _ = tty; | 918 | _ = tty; |
lib/std/Io/counting_writer.zig deleted-39| ... | @@ -1,39 +0,0 @@ | ||
| 1 | const std = @import("../std.zig"); | ||
| 2 | const io = std.io; | ||
| 3 | const testing = std.testing; | ||
| 4 | |||
| 5 | /// A Writer that counts how many bytes has been written to it. | ||
| 6 | pub fn CountingWriter(comptime WriterType: type) type { | ||
| 7 | return struct { | ||
| 8 | bytes_written: u64, | ||
| 9 | child_stream: WriterType, | ||
| 10 | |||
| 11 | pub const Error = WriterType.Error; | ||
| 12 | pub const Writer = io.GenericWriter(*Self, Error, write); | ||
| 13 | |||
| 14 | const Self = @This(); | ||
| 15 | |||
| 16 | pub fn write(self: *Self, bytes: []const u8) Error!usize { | ||
| 17 | const amt = try self.child_stream.write(bytes); | ||
| 18 | self.bytes_written += amt; | ||
| 19 | return amt; | ||
| 20 | } | ||
| 21 | |||
| 22 | pub fn writer(self: *Self) Writer { | ||
| 23 | return .{ .context = self }; | ||
| 24 | } | ||
| 25 | }; | ||
| 26 | } | ||
| 27 | |||
| 28 | pub fn countingWriter(child_stream: anytype) CountingWriter(@TypeOf(child_stream)) { | ||
| 29 | return .{ .bytes_written = 0, .child_stream = child_stream }; | ||
| 30 | } | ||
| 31 | |||
| 32 | test CountingWriter { | ||
| 33 | var counting_stream = countingWriter(std.io.null_writer); | ||
| 34 | const stream = counting_stream.writer(); | ||
| 35 | |||
| 36 | const bytes = "yay" ** 100; | ||
| 37 | stream.writeAll(bytes) catch unreachable; | ||
| 38 | try testing.expect(counting_stream.bytes_written == bytes.len); | ||
| 39 | } | ||
lib/std/crypto/phc_encoding.zig+9-7| ... | @@ -5,6 +5,7 @@ const fmt = std.fmt; | ... | @@ -5,6 +5,7 @@ const fmt = std.fmt; |
| 5 | const io = std.io; | 5 | const io = std.io; |
| 6 | const mem = std.mem; | 6 | const mem = std.mem; |
| 7 | const meta = std.meta; | 7 | const meta = std.meta; |
| 8 | const Writer = std.Io.Writer; | ||
| 8 | 9 | ||
| 9 | const fields_delimiter = "$"; | 10 | const fields_delimiter = "$"; |
| 10 | const fields_delimiter_scalar = '$'; | 11 | const fields_delimiter_scalar = '$'; |
| ... | @@ -188,19 +189,20 @@ pub fn deserialize(comptime HashResult: type, str: []const u8) Error!HashResult | ... | @@ -188,19 +189,20 @@ pub fn deserialize(comptime HashResult: type, str: []const u8) Error!HashResult |
| 188 | /// | 189 | /// |
| 189 | /// `params` can also include any additional parameters. | 190 | /// `params` can also include any additional parameters. |
| 190 | pub fn serialize(params: anytype, str: []u8) Error![]const u8 { | 191 | pub fn serialize(params: anytype, str: []u8) Error![]const u8 { |
| 191 | var buf = io.fixedBufferStream(str); | 192 | var w: Writer = .fixed(str); |
| 192 | try serializeTo(params, buf.writer()); | 193 | serializeTo(params, &w) catch return error.NoSpaceLeft; |
| 193 | return buf.getWritten(); | 194 | return w.buffered(); |
| 194 | } | 195 | } |
| 195 | 196 | ||
| 196 | /// Compute the number of bytes required to serialize `params` | 197 | /// Compute the number of bytes required to serialize `params` |
| 197 | pub fn calcSize(params: anytype) usize { | 198 | pub fn calcSize(params: anytype) usize { |
| 198 | var buf = io.countingWriter(io.null_writer); | 199 | var trash: [128]u8 = undefined; |
| 199 | serializeTo(params, buf.writer()) catch unreachable; | 200 | var d: Writer.Discarding = .init(&trash); |
| 200 | return @as(usize, @intCast(buf.bytes_written)); | 201 | serializeTo(params, &d.writer) catch unreachable; |
| 202 | return @intCast(d.fullCount()); | ||
| 201 | } | 203 | } |
| 202 | 204 | ||
| 203 | fn serializeTo(params: anytype, out: anytype) !void { | 205 | fn serializeTo(params: anytype, out: *std.Io.Writer) !void { |
| 204 | const HashResult = @TypeOf(params); | 206 | const HashResult = @TypeOf(params); |
| 205 | 207 | ||
| 206 | if (@hasField(HashResult, version_param_name)) { | 208 | if (@hasField(HashResult, version_param_name)) { |
lib/std/crypto/scrypt.zig+4-3| ... | @@ -311,9 +311,10 @@ const crypt_format = struct { | ... | @@ -311,9 +311,10 @@ const crypt_format = struct { |
| 311 | 311 | ||
| 312 | /// Compute the number of bytes required to serialize `params` | 312 | /// Compute the number of bytes required to serialize `params` |
| 313 | pub fn calcSize(params: anytype) usize { | 313 | pub fn calcSize(params: anytype) usize { |
| 314 | var buf = io.countingWriter(io.null_writer); | 314 | var trash: [128]u8 = undefined; |
| 315 | serializeTo(params, buf.writer()) catch unreachable; | 315 | var d: std.Io.Writer.Discarding = .init(&trash); |
| 316 | return @as(usize, @intCast(buf.bytes_written)); | 316 | serializeTo(params, &d) catch unreachable; |
| 317 | return @intCast(d.fullCount()); | ||
| 317 | } | 318 | } |
| 318 | 319 | ||
| 319 | fn serializeTo(params: anytype, out: anytype) !void { | 320 | fn serializeTo(params: anytype, out: anytype) !void { |
src/arch/x86_64/encoder.zig+3-4| ... | @@ -1204,11 +1204,10 @@ const TestEncode = struct { | ... | @@ -1204,11 +1204,10 @@ const TestEncode = struct { |
| 1204 | mnemonic: Instruction.Mnemonic, | 1204 | mnemonic: Instruction.Mnemonic, |
| 1205 | ops: []const Instruction.Operand, | 1205 | ops: []const Instruction.Operand, |
| 1206 | ) !void { | 1206 | ) !void { |
| 1207 | var stream = std.io.fixedBufferStream(&enc.buffer); | 1207 | var writer: std.Io.Writer = .fixed(&enc.buffer); |
| 1208 | var count_writer = std.io.countingWriter(stream.writer()); | ||
| 1209 | const inst: Instruction = try .new(.none, mnemonic, ops); | 1208 | const inst: Instruction = try .new(.none, mnemonic, ops); |
| 1210 | try inst.encode(count_writer.writer(), .{}); | 1209 | try inst.encode(&writer, .{}); |
| 1211 | enc.index = count_writer.bytes_written; | 1210 | enc.index = writer.bufferedLen(); |
| 1212 | } | 1211 | } |
| 1213 | 1212 | ||
| 1214 | fn code(enc: TestEncode) []const u8 { | 1213 | fn code(enc: TestEncode) []const u8 { |
src/link/Elf.zig+5-4| ... | @@ -3152,10 +3152,11 @@ fn writeSyntheticSections(self: *Elf) !void { | ... | @@ -3152,10 +3152,11 @@ fn writeSyntheticSections(self: *Elf) !void { |
| 3152 | 3152 | ||
| 3153 | if (self.section_indexes.gnu_hash) |shndx| { | 3153 | if (self.section_indexes.gnu_hash) |shndx| { |
| 3154 | const shdr = slice.items(.shdr)[shndx]; | 3154 | const shdr = slice.items(.shdr)[shndx]; |
| 3155 | var buffer = try std.ArrayList(u8).initCapacity(gpa, self.gnu_hash.size()); | 3155 | var aw: std.Io.Writer.Allocating = .init(gpa); |
| 3156 | defer buffer.deinit(); | 3156 | try aw.ensureUnusedCapacity(self.gnu_hash.size()); |
| 3157 | try self.gnu_hash.write(self, buffer.writer()); | 3157 | defer aw.deinit(); |
| 3158 | try self.pwriteAll(buffer.items, shdr.sh_offset); | 3158 | try self.gnu_hash.write(self, &aw.writer); |
| 3159 | try self.pwriteAll(aw.getWritten(), shdr.sh_offset); | ||
| 3159 | } | 3160 | } |
| 3160 | 3161 | ||
| 3161 | if (self.section_indexes.versym) |shndx| { | 3162 | if (self.section_indexes.versym) |shndx| { |
src/link/Elf/synthetic_sections.zig+8-13| ... | @@ -1237,17 +1237,14 @@ pub const GnuHashSection = struct { | ... | @@ -1237,17 +1237,14 @@ pub const GnuHashSection = struct { |
| 1237 | return header_size + hash.num_bloom * 8 + hash.num_buckets * 4 + hash.num_exports * 4; | 1237 | return header_size + hash.num_bloom * 8 + hash.num_buckets * 4 + hash.num_exports * 4; |
| 1238 | } | 1238 | } |
| 1239 | 1239 | ||
| 1240 | pub fn write(hash: GnuHashSection, elf_file: *Elf, writer: anytype) !void { | 1240 | pub fn write(hash: GnuHashSection, elf_file: *Elf, writer: *std.Io.Writer) !void { |
| 1241 | const exports = getExports(elf_file); | 1241 | const exports = getExports(elf_file); |
| 1242 | const export_off = elf_file.dynsym.count() - hash.num_exports; | 1242 | const export_off = elf_file.dynsym.count() - hash.num_exports; |
| 1243 | 1243 | ||
| 1244 | var counting = std.io.countingWriter(writer); | 1244 | try writer.writeInt(u32, hash.num_buckets, .little); |
| 1245 | const cwriter = counting.writer(); | 1245 | try writer.writeInt(u32, export_off, .little); |
| 1246 | 1246 | try writer.writeInt(u32, hash.num_bloom, .little); | |
| 1247 | try cwriter.writeInt(u32, hash.num_buckets, .little); | 1247 | try writer.writeInt(u32, bloom_shift, .little); |
| 1248 | try cwriter.writeInt(u32, export_off, .little); | ||
| 1249 | try cwriter.writeInt(u32, hash.num_bloom, .little); | ||
| 1250 | try cwriter.writeInt(u32, bloom_shift, .little); | ||
| 1251 | 1248 | ||
| 1252 | const comp = elf_file.base.comp; | 1249 | const comp = elf_file.base.comp; |
| 1253 | const gpa = comp.gpa; | 1250 | const gpa = comp.gpa; |
| ... | @@ -1271,7 +1268,7 @@ pub const GnuHashSection = struct { | ... | @@ -1271,7 +1268,7 @@ pub const GnuHashSection = struct { |
| 1271 | bloom[idx] |= @as(u64, 1) << @as(u6, @intCast((h >> bloom_shift) % 64)); | 1268 | bloom[idx] |= @as(u64, 1) << @as(u6, @intCast((h >> bloom_shift) % 64)); |
| 1272 | } | 1269 | } |
| 1273 | 1270 | ||
| 1274 | try cwriter.writeAll(mem.sliceAsBytes(bloom)); | 1271 | try writer.writeAll(mem.sliceAsBytes(bloom)); |
| 1275 | 1272 | ||
| 1276 | // Fill in the hash bucket indices | 1273 | // Fill in the hash bucket indices |
| 1277 | const buckets = try gpa.alloc(u32, hash.num_buckets); | 1274 | const buckets = try gpa.alloc(u32, hash.num_buckets); |
| ... | @@ -1284,7 +1281,7 @@ pub const GnuHashSection = struct { | ... | @@ -1284,7 +1281,7 @@ pub const GnuHashSection = struct { |
| 1284 | } | 1281 | } |
| 1285 | } | 1282 | } |
| 1286 | 1283 | ||
| 1287 | try cwriter.writeAll(mem.sliceAsBytes(buckets)); | 1284 | try writer.writeAll(mem.sliceAsBytes(buckets)); |
| 1288 | 1285 | ||
| 1289 | // Finally, write the hash table | 1286 | // Finally, write the hash table |
| 1290 | const table = try gpa.alloc(u32, hash.num_exports); | 1287 | const table = try gpa.alloc(u32, hash.num_exports); |
| ... | @@ -1300,9 +1297,7 @@ pub const GnuHashSection = struct { | ... | @@ -1300,9 +1297,7 @@ pub const GnuHashSection = struct { |
| 1300 | } | 1297 | } |
| 1301 | } | 1298 | } |
| 1302 | 1299 | ||
| 1303 | try cwriter.writeAll(mem.sliceAsBytes(table)); | 1300 | try writer.writeAll(mem.sliceAsBytes(table)); |
| 1304 | |||
| 1305 | assert(counting.bytes_written == hash.size()); | ||
| 1306 | } | 1301 | } |
| 1307 | 1302 | ||
| 1308 | pub fn hasher(name: [:0]const u8) u32 { | 1303 | pub fn hasher(name: [:0]const u8) u32 { |
src/link/MachO/dyld_info/Trie.zig+8-7| ... | @@ -186,17 +186,18 @@ const FinalizeNodeResult = struct { | ... | @@ -186,17 +186,18 @@ const FinalizeNodeResult = struct { |
| 186 | 186 | ||
| 187 | /// Updates offset of this node in the output byte stream. | 187 | /// Updates offset of this node in the output byte stream. |
| 188 | fn finalizeNode(self: *Trie, node_index: Node.Index, offset_in_trie: u32) !FinalizeNodeResult { | 188 | fn finalizeNode(self: *Trie, node_index: Node.Index, offset_in_trie: u32) !FinalizeNodeResult { |
| 189 | var stream = std.io.countingWriter(std.io.null_writer); | 189 | var trash_buffer: [64]u8 = undefined; |
| 190 | const writer = stream.writer(); | 190 | var stream: std.Io.Writer.Discarding = .init(&trash_buffer); |
| 191 | const writer = &stream.writer; | ||
| 191 | const slice = self.nodes.slice(); | 192 | const slice = self.nodes.slice(); |
| 192 | 193 | ||
| 193 | var node_size: u32 = 0; | 194 | var node_size: u32 = 0; |
| 194 | if (slice.items(.is_terminal)[node_index]) { | 195 | if (slice.items(.is_terminal)[node_index]) { |
| 195 | const export_flags = slice.items(.export_flags)[node_index]; | 196 | const export_flags = slice.items(.export_flags)[node_index]; |
| 196 | const vmaddr_offset = slice.items(.vmaddr_offset)[node_index]; | 197 | const vmaddr_offset = slice.items(.vmaddr_offset)[node_index]; |
| 197 | try leb.writeUleb128(writer, export_flags); | 198 | try writer.writeUleb128(export_flags); |
| 198 | try leb.writeUleb128(writer, vmaddr_offset); | 199 | try writer.writeUleb128(vmaddr_offset); |
| 199 | try leb.writeUleb128(writer, stream.bytes_written); | 200 | try writer.writeUleb128(stream.fullCount()); |
| 200 | } else { | 201 | } else { |
| 201 | node_size += 1; // 0x0 for non-terminal nodes | 202 | node_size += 1; // 0x0 for non-terminal nodes |
| 202 | } | 203 | } |
| ... | @@ -206,13 +207,13 @@ fn finalizeNode(self: *Trie, node_index: Node.Index, offset_in_trie: u32) !Final | ... | @@ -206,13 +207,13 @@ fn finalizeNode(self: *Trie, node_index: Node.Index, offset_in_trie: u32) !Final |
| 206 | const edge = &self.edges.items[edge_index]; | 207 | const edge = &self.edges.items[edge_index]; |
| 207 | const next_node_offset = slice.items(.trie_offset)[edge.node]; | 208 | const next_node_offset = slice.items(.trie_offset)[edge.node]; |
| 208 | node_size += @intCast(edge.label.len + 1); | 209 | node_size += @intCast(edge.label.len + 1); |
| 209 | try leb.writeUleb128(writer, next_node_offset); | 210 | try writer.writeUleb128(next_node_offset); |
| 210 | } | 211 | } |
| 211 | 212 | ||
| 212 | const trie_offset = slice.items(.trie_offset)[node_index]; | 213 | const trie_offset = slice.items(.trie_offset)[node_index]; |
| 213 | const updated = offset_in_trie != trie_offset; | 214 | const updated = offset_in_trie != trie_offset; |
| 214 | slice.items(.trie_offset)[node_index] = offset_in_trie; | 215 | slice.items(.trie_offset)[node_index] = offset_in_trie; |
| 215 | node_size += @intCast(stream.bytes_written); | 216 | node_size += @intCast(stream.fullCount()); |
| 216 | 217 | ||
| 217 | return .{ .node_size = node_size, .updated = updated }; | 218 | return .{ .node_size = node_size, .updated = updated }; |
| 218 | } | 219 | } |