From 930dd2948f3dee09f44d892a7f06c2dbaf79488a Mon Sep 17 00:00:00 2001 From: Shannon Booth Date: Sun, 16 Jul 2023 17:54:26 +1200 Subject: [PATCH] LibJS: Make AsyncFunctionStart and AsyncBlockStart templates This will allow implementing a version of these functions that accepts a JS::SafeFunction, which is needed for the implementation of Array.fromAsync. --- .../Libraries/LibJS/Runtime/ECMAScriptFunctionObject.cpp | 9 +++++++-- .../Libraries/LibJS/Runtime/ECMAScriptFunctionObject.h | 7 +++++-- Userland/Libraries/LibJS/SourceTextModule.cpp | 2 +- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/Userland/Libraries/LibJS/Runtime/ECMAScriptFunctionObject.cpp b/Userland/Libraries/LibJS/Runtime/ECMAScriptFunctionObject.cpp index d524ae39d1..0e8474e6bc 100644 --- a/Userland/Libraries/LibJS/Runtime/ECMAScriptFunctionObject.cpp +++ b/Userland/Libraries/LibJS/Runtime/ECMAScriptFunctionObject.cpp @@ -754,7 +754,8 @@ void ECMAScriptFunctionObject::ordinary_call_bind_this(ExecutionContext& callee_ } // 27.7.5.1 AsyncFunctionStart ( promiseCapability, asyncFunctionBody ), https://tc39.es/ecma262/#sec-async-functions-abstract-operations-async-function-start -void async_function_start(VM& vm, PromiseCapability const& promise_capability, NonnullRefPtr const& async_function_body) +template +void async_function_start(VM& vm, PromiseCapability const& promise_capability, T const& async_function_body) { // 1. Let runningContext be the running execution context. auto& running_context = vm.running_execution_context(); @@ -771,7 +772,8 @@ void async_function_start(VM& vm, PromiseCapability const& promise_capability, N } // 27.7.5.2 AsyncBlockStart ( promiseCapability, asyncBody, asyncContext ), https://tc39.es/ecma262/#sec-asyncblockstart -void async_block_start(VM& vm, NonnullRefPtr const& async_body, PromiseCapability const& promise_capability, ExecutionContext& async_context) +template +void async_block_start(VM& vm, T const& async_body, PromiseCapability const& promise_capability, ExecutionContext& async_context) { auto& realm = *vm.current_realm(); @@ -847,6 +849,9 @@ void async_block_start(VM& vm, NonnullRefPtr const& async_body, // 8. Return unused. } +template void async_block_start(VM&, NonnullGCPtr const& async_body, PromiseCapability const&, ExecutionContext&); +template void async_function_start(VM&, PromiseCapability const&, NonnullGCPtr const& async_function_body); + // 10.2.1.4 OrdinaryCallEvaluateBody ( F, argumentsList ), https://tc39.es/ecma262/#sec-ordinarycallevaluatebody // 15.8.4 Runtime Semantics: EvaluateAsyncFunctionBody, https://tc39.es/ecma262/#sec-runtime-semantics-evaluatefunctionbody Completion ECMAScriptFunctionObject::ordinary_call_evaluate_body() diff --git a/Userland/Libraries/LibJS/Runtime/ECMAScriptFunctionObject.h b/Userland/Libraries/LibJS/Runtime/ECMAScriptFunctionObject.h index 62413eef58..ae707b34b1 100644 --- a/Userland/Libraries/LibJS/Runtime/ECMAScriptFunctionObject.h +++ b/Userland/Libraries/LibJS/Runtime/ECMAScriptFunctionObject.h @@ -15,8 +15,11 @@ namespace JS { -void async_block_start(VM&, NonnullRefPtr const& parse_node, PromiseCapability const&, ExecutionContext&); -void async_function_start(VM&, PromiseCapability const&, NonnullRefPtr const& async_function_body); +template +void async_block_start(VM&, T const& async_body, PromiseCapability const&, ExecutionContext&); + +template +void async_function_start(VM&, PromiseCapability const&, T const& async_function_body); // 10.2 ECMAScript Function Objects, https://tc39.es/ecma262/#sec-ecmascript-function-objects class ECMAScriptFunctionObject final : public FunctionObject { diff --git a/Userland/Libraries/LibJS/SourceTextModule.cpp b/Userland/Libraries/LibJS/SourceTextModule.cpp index 69bcd0a5a4..787bc079e4 100644 --- a/Userland/Libraries/LibJS/SourceTextModule.cpp +++ b/Userland/Libraries/LibJS/SourceTextModule.cpp @@ -737,7 +737,7 @@ ThrowCompletionOr SourceTextModule::execute_module(VM& vm, GCPtr>(vm, m_ecmascript_code, *capability, module_context); } // 11. Return unused.