1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 20:27:45 +00:00

LibWeb/Streams: Make ReadRequest GC-allocated

This allows it to keep its edges alive. Fixes an intermittent crash seen
by UBSAN on CI. :^)
This commit is contained in:
Andreas Kling 2023-08-09 18:17:19 +02:00
parent 40bdcdf966
commit 9c3e9e8981
6 changed files with 37 additions and 14 deletions

View file

@ -20,7 +20,9 @@ struct ReadableStreamReadResult {
bool done;
};
class ReadRequest : public RefCounted<ReadRequest> {
class ReadRequest : public JS::Cell {
JS_CELL(ReadRequest, JS::Cell);
public:
virtual ~ReadRequest() = default;
@ -29,7 +31,9 @@ public:
virtual void on_error(JS::Value error) = 0;
};
class ReadLoopReadRequest : public ReadRequest {
class ReadLoopReadRequest final : public ReadRequest {
JS_CELL(ReadLoopReadRequest, JS::Cell);
public:
// successSteps, which is an algorithm accepting a byte sequence
using SuccessSteps = JS::SafeFunction<void(ByteBuffer)>;
@ -46,6 +50,8 @@ public:
virtual void on_error(JS::Value error) override;
private:
virtual void visit_edges(Visitor&) override;
JS::VM& m_vm;
JS::Realm& m_realm;
ReadableStreamDefaultReader& m_reader;
@ -72,7 +78,7 @@ public:
WebIDL::ExceptionOr<void> release_lock();
SinglyLinkedList<NonnullRefPtr<ReadRequest>>& read_requests() { return m_read_requests; }
SinglyLinkedList<JS::NonnullGCPtr<ReadRequest>>& read_requests() { return m_read_requests; }
private:
explicit ReadableStreamDefaultReader(JS::Realm&);
@ -81,7 +87,7 @@ private:
virtual void visit_edges(Cell::Visitor&) override;
SinglyLinkedList<NonnullRefPtr<ReadRequest>> m_read_requests;
SinglyLinkedList<JS::NonnullGCPtr<ReadRequest>> m_read_requests;
};
}