authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-03-13 18:32:50-07:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2024-03-13 18:32:50-07:00
logea8e9e668b8b566a94e8d69476d392458918382a
tree29737ffdfc6a4e17260bdb13ed1e3469210dda9c
parent17bad9f88666bd6659bc0d6deb0acad39028291a
parent791c4491a7677506ee7f028c0692065664d0b56c
signaturebadge-check Signed by PGP key B5690EEEBB952194

Merge pull request #19289 from ianic/issue_19052

compress.xz: fix slow running read loop

1 files changed, 15 insertions(+), 18 deletions(-)

lib/std/compress/xz/block.zig+15-18
......@@ -34,6 +34,7 @@ pub fn Decoder(comptime ReaderType: type) type {
3434 check: xz.Check,
3535 err: ?Error,
3636 to_read: ArrayListUnmanaged(u8),
37 read_pos: usize,
3738 block_count: usize,
3839
3940 fn init(allocator: Allocator, in_reader: ReaderType, check: xz.Check) !Self {
......@@ -43,6 +44,7 @@ pub fn Decoder(comptime ReaderType: type) type {
4344 .check = check,
4445 .err = null,
4546 .to_read = .{},
47 .read_pos = 0,
4648 .block_count = 0,
4749 };
4850 }
......@@ -57,25 +59,22 @@ pub fn Decoder(comptime ReaderType: type) type {
5759
5860 pub fn read(self: *Self, output: []u8) Error!usize {
5961 while (true) {
60 if (self.to_read.items.len > 0) {
61 const input = self.to_read.items;
62 const n = @min(input.len, output.len);
63 @memcpy(output[0..n], input[0..n]);
64 std.mem.copyForwards(u8, input, input[n..]);
65 self.to_read.shrinkRetainingCapacity(input.len - n);
66 if (self.to_read.items.len == 0 and self.err != null) {
67 if (self.err.? == DecodeError.EndOfStreamWithNoError) {
68 return n;
69 }
70 return self.err.?;
71 }
62 const unread_len = self.to_read.items.len - self.read_pos;
63 if (unread_len > 0) {
64 const n = @min(unread_len, output.len);
65 @memcpy(output[0..n], self.to_read.items[self.read_pos..][0..n]);
66 self.read_pos += n;
7267 return n;
7368 }
74 if (self.err != null) {
75 if (self.err.? == DecodeError.EndOfStreamWithNoError) {
69 if (self.err) |e| {
70 if (e == DecodeError.EndOfStreamWithNoError) {
7671 return 0;
7772 }
78 return self.err.?;
73 return e;
74 }
75 if (self.read_pos > 0) {
76 self.to_read.shrinkRetainingCapacity(0);
77 self.read_pos = 0;
7978 }
8079 self.readBlock() catch |e| {
8180 self.err = e;
......@@ -84,8 +83,6 @@ pub fn Decoder(comptime ReaderType: type) type {
8483 }
8584
8685 fn readBlock(self: *Self) Error!void {
87 const unpacked_pos = self.to_read.items.len;
88
8986 var block_counter = std.io.countingReader(self.inner_reader);
9087 const block_reader = block_counter.reader();
9188
......@@ -166,7 +163,7 @@ pub fn Decoder(comptime ReaderType: type) type {
166163 return error.CorruptInput;
167164 }
168165
169 const unpacked_bytes = self.to_read.items[unpacked_pos..];
166 const unpacked_bytes = self.to_read.items;
170167 if (unpacked_size) |s| {
171168 if (s != unpacked_bytes.len)
172169 return error.CorruptInput;