mirror of
https://github.com/ziglang/zig.git
synced 2025-12-24 07:03:11 +00:00
Revert "Fix infinite loop in Reader.Limited"
This reverts commit 27aba2d776caf59bb6569934626af587fdba9c75. I'd like to review this contribution more carefully, particularly with the alternate implementation that is also open as a pull request (#25109). Reopens #25093
This commit is contained in:
parent
2c0aa1c6f5
commit
b824ca8494
@ -28,11 +28,9 @@ pub fn init(reader: *Reader, limit: Limit, buffer: []u8) Limited {
|
|||||||
fn stream(r: *Reader, w: *Writer, limit: Limit) Reader.StreamError!usize {
|
fn stream(r: *Reader, w: *Writer, limit: Limit) Reader.StreamError!usize {
|
||||||
const l: *Limited = @fieldParentPtr("interface", r);
|
const l: *Limited = @fieldParentPtr("interface", r);
|
||||||
const combined_limit = limit.min(l.remaining);
|
const combined_limit = limit.min(l.remaining);
|
||||||
if (combined_limit.nonzero()) {
|
const n = try l.unlimited.stream(w, combined_limit);
|
||||||
const n = try l.unlimited.stream(w, combined_limit);
|
l.remaining = l.remaining.subtract(n).?;
|
||||||
l.remaining = l.remaining.subtract(n).?;
|
return n;
|
||||||
return n;
|
|
||||||
} else return error.EndOfStream;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
test stream {
|
test stream {
|
||||||
@ -51,64 +49,6 @@ test stream {
|
|||||||
try std.testing.expectEqualStrings("test", result_buf[0..streamed]);
|
try std.testing.expectEqualStrings("test", result_buf[0..streamed]);
|
||||||
}
|
}
|
||||||
|
|
||||||
test "readSliceAll from infinite source" {
|
|
||||||
const InfSource = struct {
|
|
||||||
reader: std.Io.Reader,
|
|
||||||
|
|
||||||
pub fn init(buffer: []u8) @This() {
|
|
||||||
return @This(){
|
|
||||||
.reader = .{
|
|
||||||
.vtable = &.{
|
|
||||||
.stream = streamA,
|
|
||||||
},
|
|
||||||
.buffer = buffer,
|
|
||||||
.seek = 0,
|
|
||||||
.end = 0,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
fn streamA(io_reader: *std.Io.Reader, w: *std.Io.Writer, limit: std.Io.Limit) std.Io.Reader.StreamError!usize {
|
|
||||||
_ = io_reader;
|
|
||||||
|
|
||||||
std.debug.assert(limit.nonzero());
|
|
||||||
|
|
||||||
const n_bytes_remaining = limit.minInt(2);
|
|
||||||
for (0..n_bytes_remaining) |_| {
|
|
||||||
try w.writeByte('A');
|
|
||||||
}
|
|
||||||
return n_bytes_remaining;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Exact size
|
|
||||||
{
|
|
||||||
var inf_buf: [10]u8 = undefined;
|
|
||||||
var inf_stream = InfSource.init(&inf_buf);
|
|
||||||
|
|
||||||
var limit_buf: [2]u8 = undefined;
|
|
||||||
var limited: std.Io.Reader.Limited = .init(&inf_stream.reader, .limited(2), &limit_buf);
|
|
||||||
const limited_reader = &limited.interface;
|
|
||||||
|
|
||||||
var out_buffer: [2]u8 = undefined;
|
|
||||||
try std.testing.expectEqual({}, limited_reader.readSliceAll(&out_buffer));
|
|
||||||
try std.testing.expectEqualStrings("AA", &out_buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Too large
|
|
||||||
{
|
|
||||||
var inf_buf: [10]u8 = undefined;
|
|
||||||
var inf_stream = InfSource.init(&inf_buf);
|
|
||||||
|
|
||||||
var limit_buf: [2]u8 = undefined;
|
|
||||||
var limited: std.Io.Reader.Limited = .init(&inf_stream.reader, .limited(2), &limit_buf);
|
|
||||||
const limited_reader = &limited.interface;
|
|
||||||
|
|
||||||
var out_buffer: [8]u8 = undefined;
|
|
||||||
try std.testing.expectError(error.EndOfStream, limited_reader.readSliceAll(&out_buffer));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn discard(r: *Reader, limit: Limit) Reader.Error!usize {
|
fn discard(r: *Reader, limit: Limit) Reader.Error!usize {
|
||||||
const l: *Limited = @fieldParentPtr("interface", r);
|
const l: *Limited = @fieldParentPtr("interface", r);
|
||||||
const combined_limit = limit.min(l.remaining);
|
const combined_limit = limit.min(l.remaining);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user