From 5951a93f51bd87417b56d680991b1d4ab0554f8b Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Sun, 3 Sep 2023 17:32:52 +0200 Subject: [PATCH] LibWeb: Remove GC allocations in FetchAlgorithms constructor We should not GC allocate in the constructors of GC-allocated objects because a new allocation might trigger garbage collection, which in turn might access not fully initialized objects. --- .../Fetch/Infrastructure/FetchAlgorithms.cpp | 34 ++++++++++++++----- .../Fetch/Infrastructure/FetchAlgorithms.h | 27 +++++++++++---- 2 files changed, 46 insertions(+), 15 deletions(-) diff --git a/Userland/Libraries/LibWeb/Fetch/Infrastructure/FetchAlgorithms.cpp b/Userland/Libraries/LibWeb/Fetch/Infrastructure/FetchAlgorithms.cpp index 0b967ee551..2fc7e5c758 100644 --- a/Userland/Libraries/LibWeb/Fetch/Infrastructure/FetchAlgorithms.cpp +++ b/Userland/Libraries/LibWeb/Fetch/Infrastructure/FetchAlgorithms.cpp @@ -12,16 +12,34 @@ namespace Web::Fetch::Infrastructure { JS::NonnullGCPtr FetchAlgorithms::create(JS::VM& vm, Input input) { - return vm.heap().allocate_without_realm(vm, move(input)); + auto process_request_body_chunk_length = JS::create_heap_function(vm.heap(), move(input.process_request_body_chunk_length)); + auto process_request_end_of_body = JS::create_heap_function(vm.heap(), move(input.process_request_end_of_body)); + auto process_early_hints_response = JS::create_heap_function(vm.heap(), move(input.process_early_hints_response)); + auto process_response = JS::create_heap_function(vm.heap(), move(input.process_response)); + auto process_response_end_of_body = JS::create_heap_function(vm.heap(), move(input.process_response_end_of_body)); + auto process_response_consume_body = JS::create_heap_function(vm.heap(), move(input.process_response_consume_body)); + return vm.heap().allocate_without_realm( + process_request_body_chunk_length, + process_request_end_of_body, + process_early_hints_response, + process_response, + process_response_end_of_body, + process_response_consume_body); } -FetchAlgorithms::FetchAlgorithms(JS::VM& vm, Input input) - : m_process_request_body_chunk_length(JS::create_heap_function(vm.heap(), move(input.process_request_body_chunk_length))) - , m_process_request_end_of_body(JS::create_heap_function(vm.heap(), move(input.process_request_end_of_body))) - , m_process_early_hints_response(JS::create_heap_function(vm.heap(), move(input.process_early_hints_response))) - , m_process_response(JS::create_heap_function(vm.heap(), move(input.process_response))) - , m_process_response_end_of_body(JS::create_heap_function(vm.heap(), move(input.process_response_end_of_body))) - , m_process_response_consume_body(JS::create_heap_function(vm.heap(), move(input.process_response_consume_body))) +FetchAlgorithms::FetchAlgorithms( + ProcessRequestBodyChunkLengthHeapFunction process_request_body_chunk_length, + ProcessRequestEndOfBodyHeapFunction process_request_end_of_body, + ProcessEarlyHintsResponseHeapFunction process_early_hints_response, + ProcessResponseHeapFunction process_response, + ProcessResponseEndOfBodyHeapFunction process_response_end_of_body, + ProcessResponseConsumeBodyHeapFunction process_response_consume_body) + : m_process_request_body_chunk_length(process_request_body_chunk_length) + , m_process_request_end_of_body(process_request_end_of_body) + , m_process_early_hints_response(process_early_hints_response) + , m_process_response(process_response) + , m_process_response_end_of_body(process_response_end_of_body) + , m_process_response_consume_body(process_response_consume_body) { } diff --git a/Userland/Libraries/LibWeb/Fetch/Infrastructure/FetchAlgorithms.h b/Userland/Libraries/LibWeb/Fetch/Infrastructure/FetchAlgorithms.h index b7b0409d7d..b6eda21a28 100644 --- a/Userland/Libraries/LibWeb/Fetch/Infrastructure/FetchAlgorithms.h +++ b/Userland/Libraries/LibWeb/Fetch/Infrastructure/FetchAlgorithms.h @@ -30,6 +30,13 @@ public: using ProcessResponseEndOfBodyFunction = Function)>; using ProcessResponseConsumeBodyFunction = Function, BodyBytes)>; + using ProcessRequestBodyChunkLengthHeapFunction = JS::NonnullGCPtr>; + using ProcessRequestEndOfBodyHeapFunction = JS::NonnullGCPtr>; + using ProcessEarlyHintsResponseHeapFunction = JS::NonnullGCPtr>; + using ProcessResponseHeapFunction = JS::NonnullGCPtr>; + using ProcessResponseEndOfBodyHeapFunction = JS::NonnullGCPtr>; + using ProcessResponseConsumeBodyHeapFunction = JS::NonnullGCPtr>; + struct Input { ProcessRequestBodyChunkLengthFunction process_request_body_chunk_length; ProcessRequestEndOfBodyFunction process_request_end_of_body; @@ -51,14 +58,20 @@ public: virtual void visit_edges(JS::Cell::Visitor&) override; private: - explicit FetchAlgorithms(JS::VM&, Input); + explicit FetchAlgorithms( + ProcessRequestBodyChunkLengthHeapFunction process_request_body_chunk_length, + ProcessRequestEndOfBodyHeapFunction process_request_end_of_body, + ProcessEarlyHintsResponseHeapFunction process_early_hints_response, + ProcessResponseHeapFunction process_response, + ProcessResponseEndOfBodyHeapFunction process_response_end_of_body, + ProcessResponseConsumeBodyHeapFunction process_response_consume_body); - JS::NonnullGCPtr> m_process_request_body_chunk_length; - JS::NonnullGCPtr> m_process_request_end_of_body; - JS::NonnullGCPtr)>> m_process_early_hints_response; - JS::NonnullGCPtr)>> m_process_response; - JS::NonnullGCPtr)>> m_process_response_end_of_body; - JS::NonnullGCPtr, BodyBytes)>> m_process_response_consume_body; + ProcessRequestBodyChunkLengthHeapFunction m_process_request_body_chunk_length; + ProcessRequestEndOfBodyHeapFunction m_process_request_end_of_body; + ProcessEarlyHintsResponseHeapFunction m_process_early_hints_response; + ProcessResponseHeapFunction m_process_response; + ProcessResponseEndOfBodyHeapFunction m_process_response_end_of_body; + ProcessResponseConsumeBodyHeapFunction m_process_response_consume_body; }; }