| author | |
| committer | |
| log | b393112674d0b948832c3223d5b300f080c71151 |
| tree | 97392fff3cc17dc563f4a9cf54f5f1326e7b8d07 |
| parent | 9d163c7ac3fbc6adfa7c6fa299647d0731f96167 |
6 files changed, 39 insertions(+), 90 deletions(-)
lib/std/Progress.zig+7-9| ... | @@ -608,12 +608,10 @@ pub fn unlockStdErr() void { | ... | @@ -608,12 +608,10 @@ pub fn unlockStdErr() void { |
| 608 | } | 608 | } |
| 609 | 609 | ||
| 610 | /// Protected by `stderr_mutex`. | 610 | /// Protected by `stderr_mutex`. |
| 611 | var stderr_buffered_writer: Writer = .{ | 611 | const stderr_writer: *Writer = &stderr_file_writer.interface; |
| 612 | .unbuffered_writer = stderr_file_writer.interface(), | ||
| 613 | .buffer = &.{}, | ||
| 614 | }; | ||
| 615 | /// Protected by `stderr_mutex`. | 612 | /// Protected by `stderr_mutex`. |
| 616 | var stderr_file_writer: std.fs.File.Writer = .{ | 613 | var stderr_file_writer: std.fs.File.Writer = .{ |
| 614 | .interface = std.fs.File.Writer.init_interface(&.{}), | ||
| 617 | .file = if (is_windows) undefined else .stderr(), | 615 | .file = if (is_windows) undefined else .stderr(), |
| 618 | .mode = .streaming, | 616 | .mode = .streaming, |
| 619 | }; | 617 | }; |
| ... | @@ -628,14 +626,14 @@ pub fn lockStderrWriter(buffer: []u8) *Writer { | ... | @@ -628,14 +626,14 @@ pub fn lockStderrWriter(buffer: []u8) *Writer { |
| 628 | stderr_mutex.lock(); | 626 | stderr_mutex.lock(); |
| 629 | clearWrittenWithEscapeCodes() catch {}; | 627 | clearWrittenWithEscapeCodes() catch {}; |
| 630 | if (is_windows) stderr_file_writer.file = .stderr(); | 628 | if (is_windows) stderr_file_writer.file = .stderr(); |
| 631 | stderr_buffered_writer.flush() catch {}; | 629 | stderr_writer.flush() catch {}; |
| 632 | stderr_buffered_writer.buffer = buffer; | 630 | stderr_writer.buffer = buffer; |
| 633 | return &stderr_buffered_writer; | 631 | return &stderr_writer; |
| 634 | } | 632 | } |
| 635 | 633 | ||
| 636 | pub fn unlockStderrWriter() void { | 634 | pub fn unlockStderrWriter() void { |
| 637 | stderr_buffered_writer.flush() catch {}; | 635 | stderr_writer.flush() catch {}; |
| 638 | stderr_buffered_writer.buffer = &.{}; | 636 | stderr_writer.buffer = &.{}; |
| 639 | stderr_mutex.unlock(); | 637 | stderr_mutex.unlock(); |
| 640 | } | 638 | } |
| 641 | 639 |
lib/std/crypto/phc_encoding.zig+3-6| ... | @@ -197,12 +197,9 @@ pub fn serialize(params: anytype, str: []u8) Error![]const u8 { | ... | @@ -197,12 +197,9 @@ pub fn serialize(params: anytype, str: []u8) Error![]const u8 { |
| 197 | /// Compute the number of bytes required to serialize `params` | 197 | /// Compute the number of bytes required to serialize `params` |
| 198 | pub fn calcSize(params: anytype) usize { | 198 | pub fn calcSize(params: anytype) usize { |
| 199 | var trash: [128]u8 = undefined; | 199 | var trash: [128]u8 = undefined; |
| 200 | var bw: Writer = .{ | 200 | var w: Writer = .discarding(&trash); |
| 201 | .unbuffered_writer = .discarding, | 201 | serializeTo(params, &w) catch unreachable; |
| 202 | .buffer = &trash, | 202 | return w.count; |
| 203 | }; | ||
| 204 | serializeTo(params, &bw) catch unreachable; | ||
| 205 | return bw.count; | ||
| 206 | } | 203 | } |
| 207 | 204 | ||
| 208 | fn serializeTo(params: anytype, out: *Writer) !void { | 205 | fn serializeTo(params: anytype, out: *Writer) !void { |
lib/std/crypto/sha2.zig+7-10| ... | @@ -383,22 +383,19 @@ fn Sha2x32(comptime iv: Iv32, digest_bits: comptime_int) type { | ... | @@ -383,22 +383,19 @@ fn Sha2x32(comptime iv: Iv32, digest_bits: comptime_int) type { |
| 383 | for (&d.s, v) |*dv, vv| dv.* +%= vv; | 383 | for (&d.s, v) |*dv, vv| dv.* +%= vv; |
| 384 | } | 384 | } |
| 385 | 385 | ||
| 386 | pub fn writable(this: *@This(), buffer: []u8) Writer { | 386 | pub fn writer(this: *@This(), buffer: []u8) Writer { |
| 387 | return .{ | 387 | return .{ |
| 388 | .unbuffered_writer = .{ | 388 | .context = this, |
| 389 | .context = this, | 389 | .vtable = &.{ .drain = drain }, |
| 390 | .vtable = &.{ | ||
| 391 | .writeSplat = writeSplat, | ||
| 392 | .writeFile = Writer.unimplementedWriteFile, | ||
| 393 | }, | ||
| 394 | }, | ||
| 395 | .buffer = buffer, | 390 | .buffer = buffer, |
| 396 | }; | 391 | }; |
| 397 | } | 392 | } |
| 398 | 393 | ||
| 399 | fn writeSplat(context: ?*anyopaque, data: []const []const u8, splat: usize) Writer.Error!usize { | 394 | fn drain(w: *Writer, data: []const []const u8, splat: usize) Writer.Error!usize { |
| 400 | const this: *@This() = @ptrCast(@alignCast(context)); | 395 | const this: *@This() = @ptrCast(@alignCast(w.context)); |
| 401 | const start_total = this.total_len; | 396 | const start_total = this.total_len; |
| 397 | this.update(w.buffered()); | ||
| 398 | w.end = 0; | ||
| 402 | for (data[0 .. data.len - 1]) |slice| this.update(slice); | 399 | for (data[0 .. data.len - 1]) |slice| this.update(slice); |
| 403 | for (0..splat) |_| this.update(data[data.len - 1]); | 400 | for (0..splat) |_| this.update(data[data.len - 1]); |
| 404 | return @intCast(this.total_len - start_total); | 401 | return @intCast(this.total_len - start_total); |
lib/std/fmt.zig+3-6| ... | @@ -845,14 +845,11 @@ pub fn bufPrintZ(buf: []u8, comptime fmt: []const u8, args: anytype) BufPrintErr | ... | @@ -845,14 +845,11 @@ pub fn bufPrintZ(buf: []u8, comptime fmt: []const u8, args: anytype) BufPrintErr |
| 845 | /// Count the characters needed for format. | 845 | /// Count the characters needed for format. |
| 846 | pub fn count(comptime fmt: []const u8, args: anytype) usize { | 846 | pub fn count(comptime fmt: []const u8, args: anytype) usize { |
| 847 | var trash_buffer: [64]u8 = undefined; | 847 | var trash_buffer: [64]u8 = undefined; |
| 848 | var bw: Writer = .{ | 848 | var w: Writer = .discarding(&trash_buffer); |
| 849 | .unbuffered_writer = .discarding, | 849 | w.print(fmt, args) catch |err| switch (err) { |
| 850 | .buffer = &trash_buffer, | ||
| 851 | }; | ||
| 852 | bw.print(fmt, args) catch |err| switch (err) { | ||
| 853 | error.WriteFailed => unreachable, | 850 | error.WriteFailed => unreachable, |
| 854 | }; | 851 | }; |
| 855 | return bw.count; | 852 | return w.count; |
| 856 | } | 853 | } |
| 857 | 854 | ||
| 858 | pub fn allocPrint(gpa: Allocator, comptime fmt: []const u8, args: anytype) Allocator.Error![]u8 { | 855 | pub fn allocPrint(gpa: Allocator, comptime fmt: []const u8, args: anytype) Allocator.Error![]u8 { |
lib/std/io/Writer.zig+17-54| ... | @@ -155,11 +155,7 @@ pub fn writeSplat(w: *Writer, data: []const []const u8, splat: usize) Error!usiz | ... | @@ -155,11 +155,7 @@ pub fn writeSplat(w: *Writer, data: []const []const u8, splat: usize) Error!usiz |
| 155 | assert(data.len > 0); | 155 | assert(data.len > 0); |
| 156 | const buffer = w.buffer; | 156 | const buffer = w.buffer; |
| 157 | const count = countSplat(0, data, splat); | 157 | const count = countSplat(0, data, splat); |
| 158 | if (w.end + count > buffer.len) { | 158 | if (w.end + count > buffer.len) return w.vtable.drain(w, data, splat); |
| 159 | const end = w.end; | ||
| 160 | const n = try w.vtable.drain(w, data, splat); | ||
| 161 | return n -| end; | ||
| 162 | } | ||
| 163 | w.count += count; | 159 | w.count += count; |
| 164 | for (data) |bytes| { | 160 | for (data) |bytes| { |
| 165 | @memcpy(buffer[w.end..][0..bytes.len], bytes); | 161 | @memcpy(buffer[w.end..][0..bytes.len], bytes); |
| ... | @@ -168,7 +164,6 @@ pub fn writeSplat(w: *Writer, data: []const []const u8, splat: usize) Error!usiz | ... | @@ -168,7 +164,6 @@ pub fn writeSplat(w: *Writer, data: []const []const u8, splat: usize) Error!usiz |
| 168 | const pattern = data[data.len - 1]; | 164 | const pattern = data[data.len - 1]; |
| 169 | if (splat == 0) { | 165 | if (splat == 0) { |
| 170 | @branchHint(.unlikely); | 166 | @branchHint(.unlikely); |
| 171 | // It was added in the loop above; undo it here. | ||
| 172 | w.end -= pattern.len; | 167 | w.end -= pattern.len; |
| 173 | return count; | 168 | return count; |
| 174 | } | 169 | } |
| ... | @@ -245,24 +240,14 @@ pub fn writableSlice(w: *Writer, len: usize) Error![]u8 { | ... | @@ -245,24 +240,14 @@ pub fn writableSlice(w: *Writer, len: usize) Error![]u8 { |
| 245 | /// If `minimum_length` is zero, this is equivalent to `unusedCapacitySlice`. | 240 | /// If `minimum_length` is zero, this is equivalent to `unusedCapacitySlice`. |
| 246 | pub fn writableSliceGreedy(w: *Writer, minimum_length: usize) Error![]u8 { | 241 | pub fn writableSliceGreedy(w: *Writer, minimum_length: usize) Error![]u8 { |
| 247 | assert(w.buffer.len >= minimum_length); | 242 | assert(w.buffer.len >= minimum_length); |
| 248 | const cap_slice = w.buffer[w.end..]; | 243 | while (true) { |
| 249 | if (cap_slice.len >= minimum_length) { | 244 | const cap_slice = w.buffer[w.end..]; |
| 250 | @branchHint(.likely); | 245 | if (cap_slice.len >= minimum_length) { |
| 251 | return cap_slice; | 246 | @branchHint(.likely); |
| 252 | } | 247 | return cap_slice; |
| 253 | const buffer = w.buffer[0..w.end]; | 248 | } |
| 254 | const n = try w.unbuffered_writer.writeVec(&.{buffer}); | 249 | assert(0 == try w.vtable.drain(w, &.{""}, 1)); |
| 255 | if (n == buffer.len) { | ||
| 256 | @branchHint(.likely); | ||
| 257 | w.end = 0; | ||
| 258 | return w.buffer; | ||
| 259 | } | ||
| 260 | if (n > 0) { | ||
| 261 | const remainder = buffer[n..]; | ||
| 262 | std.mem.copyForwards(u8, buffer[0..remainder.len], remainder); | ||
| 263 | w.end = remainder.len; | ||
| 264 | } | 250 | } |
| 265 | return w.buffer[w.end..]; | ||
| 266 | } | 251 | } |
| 267 | 252 | ||
| 268 | pub fn ensureUnusedCapacity(w: *Writer, n: usize) Error!void { | 253 | pub fn ensureUnusedCapacity(w: *Writer, n: usize) Error!void { |
| ... | @@ -358,39 +343,17 @@ pub fn print(w: *Writer, comptime format: []const u8, args: anytype) Error!void | ... | @@ -358,39 +343,17 @@ pub fn print(w: *Writer, comptime format: []const u8, args: anytype) Error!void |
| 358 | } | 343 | } |
| 359 | 344 | ||
| 360 | pub fn writeByte(w: *Writer, byte: u8) Error!void { | 345 | pub fn writeByte(w: *Writer, byte: u8) Error!void { |
| 361 | const buffer = w.buffer[0..w.end]; | 346 | while (w.buffer.len - w.end == 0) { |
| 362 | if (buffer.len < w.buffer.len) { | 347 | const n = try w.vtable.drain(w, &.{&.{byte}}, 1); |
| 363 | @branchHint(.likely); | 348 | if (n > 0) { |
| 364 | buffer.ptr[buffer.len] = byte; | 349 | w.count += 1; |
| 365 | w.end = buffer.len + 1; | 350 | return; |
| 366 | w.count += 1; | ||
| 367 | return; | ||
| 368 | } | ||
| 369 | var buffers: [2][]const u8 = .{ buffer, &.{byte} }; | ||
| 370 | while (true) { | ||
| 371 | const n = try w.unbuffered_writer.writeVec(&buffers); | ||
| 372 | if (n == 0) { | ||
| 373 | @branchHint(.unlikely); | ||
| 374 | continue; | ||
| 375 | } | 351 | } |
| 352 | } else { | ||
| 353 | @branchHint(.likely); | ||
| 354 | w.buffer[w.end] = byte; | ||
| 355 | w.end += 1; | ||
| 376 | w.count += 1; | 356 | w.count += 1; |
| 377 | if (n >= buffer.len) { | ||
| 378 | @branchHint(.likely); | ||
| 379 | if (n > buffer.len) { | ||
| 380 | @branchHint(.likely); | ||
| 381 | w.end = 0; | ||
| 382 | return; | ||
| 383 | } else { | ||
| 384 | buffer[0] = byte; | ||
| 385 | w.end = 1; | ||
| 386 | return; | ||
| 387 | } | ||
| 388 | } | ||
| 389 | const remainder = buffer[n..]; | ||
| 390 | std.mem.copyForwards(u8, buffer[0..remainder.len], remainder); | ||
| 391 | buffer[remainder.len] = byte; | ||
| 392 | w.end = remainder.len + 1; | ||
| 393 | return; | ||
| 394 | } | 357 | } |
| 395 | } | 358 | } |
| 396 | 359 |
lib/std/zon/stringify.zig+2-5| ... | @@ -1040,11 +1040,8 @@ pub const Serializer = struct { | ... | @@ -1040,11 +1040,8 @@ pub const Serializer = struct { |
| 1040 | }; | 1040 | }; |
| 1041 | 1041 | ||
| 1042 | test Serializer { | 1042 | test Serializer { |
| 1043 | var bw: Writer = .{ | 1043 | var w: Writer = .discarding(&.{}); |
| 1044 | .unbuffered_writer = .discarding, | 1044 | var s: Serializer = .{ .writer = &w }; |
| 1045 | .buffer = &.{}, | ||
| 1046 | }; | ||
| 1047 | var s: Serializer = .{ .writer = &bw }; | ||
| 1048 | var vec2 = try s.beginStruct(.{}); | 1045 | var vec2 = try s.beginStruct(.{}); |
| 1049 | try vec2.field("x", 1.5, .{}); | 1046 | try vec2.field("x", 1.5, .{}); |
| 1050 | try vec2.fieldPrefix("prefix"); | 1047 | try vec2.fieldPrefix("prefix"); |