mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-07-29 04:09:13 +00:00
LibJS: Use HeapFunction for async body closure in Array.fromAsync
This commit is contained in:
parent
e6d1123ce8
commit
716e86f042
Notes:
github-actions[bot]
2024-10-30 19:56:49 +00:00
Author: https://github.com/shannonbooth
Commit: 716e86f042
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/2062
Reviewed-by: https://github.com/kalenikaliaksandr ✅
2 changed files with 7 additions and 9 deletions
|
@ -306,7 +306,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayConstructor::from_async)
|
||||||
auto promise_capability = MUST(new_promise_capability(vm, realm.intrinsics().promise_constructor()));
|
auto promise_capability = MUST(new_promise_capability(vm, realm.intrinsics().promise_constructor()));
|
||||||
|
|
||||||
// 3. Let fromAsyncClosure be a new Abstract Closure with no parameters that captures C, mapfn, and thisArg and performs the following steps when called:
|
// 3. Let fromAsyncClosure be a new Abstract Closure with no parameters that captures C, mapfn, and thisArg and performs the following steps when called:
|
||||||
SafeFunction<Completion()> from_async_closure = [constructor, mapfn, this_arg, &vm, &realm, async_items]() mutable -> Completion {
|
auto from_async_closure = create_heap_function(realm.heap(), [constructor, mapfn, this_arg, &vm, &realm, async_items]() mutable -> Completion {
|
||||||
bool mapping;
|
bool mapping;
|
||||||
|
|
||||||
// a. If mapfn is undefined, let mapping be false.
|
// a. If mapfn is undefined, let mapping be false.
|
||||||
|
@ -510,10 +510,10 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayConstructor::from_async)
|
||||||
// ix. Return Completion Record { [[Type]]: return, [[Value]]: A, [[Target]]: empty }.
|
// ix. Return Completion Record { [[Type]]: return, [[Value]]: A, [[Target]]: empty }.
|
||||||
return Completion { Completion::Type::Return, array };
|
return Completion { Completion::Type::Return, array };
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
|
|
||||||
// 4. Perform AsyncFunctionStart(promiseCapability, fromAsyncClosure).
|
// 4. Perform AsyncFunctionStart(promiseCapability, fromAsyncClosure).
|
||||||
async_function_start(vm, promise_capability, from_async_closure);
|
async_function_start(vm, promise_capability, *from_async_closure);
|
||||||
|
|
||||||
// 5. Return promiseCapability.[[Promise]].
|
// 5. Return promiseCapability.[[Promise]].
|
||||||
return promise_capability->promise();
|
return promise_capability->promise();
|
||||||
|
|
|
@ -734,7 +734,7 @@ void async_block_start(VM& vm, T const& async_body, PromiseCapability const& pro
|
||||||
Completion result;
|
Completion result;
|
||||||
|
|
||||||
// a. If asyncBody is a Parse Node, then
|
// a. If asyncBody is a Parse Node, then
|
||||||
if constexpr (!IsCallableWithArguments<T, Completion>) {
|
if constexpr (!IsSame<T, HeapFunction<Completion()>>) {
|
||||||
// a. Let result be the result of evaluating asyncBody.
|
// a. Let result be the result of evaluating asyncBody.
|
||||||
// FIXME: Cache this executable somewhere.
|
// FIXME: Cache this executable somewhere.
|
||||||
auto maybe_executable = Bytecode::compile(vm, async_body, FunctionKind::Async, "AsyncBlockStart"sv);
|
auto maybe_executable = Bytecode::compile(vm, async_body, FunctionKind::Async, "AsyncBlockStart"sv);
|
||||||
|
@ -746,10 +746,8 @@ void async_block_start(VM& vm, T const& async_body, PromiseCapability const& pro
|
||||||
// b. Else,
|
// b. Else,
|
||||||
else {
|
else {
|
||||||
// i. Assert: asyncBody is an Abstract Closure with no parameters.
|
// i. Assert: asyncBody is an Abstract Closure with no parameters.
|
||||||
static_assert(IsCallableWithArguments<T, Completion>);
|
|
||||||
|
|
||||||
// ii. Let result be asyncBody().
|
// ii. Let result be asyncBody().
|
||||||
result = async_body();
|
result = async_body.function()();
|
||||||
}
|
}
|
||||||
|
|
||||||
// c. Assert: If we return here, the async function either threw an exception or performed an implicit or explicit return; all awaiting is done.
|
// c. Assert: If we return here, the async function either threw an exception or performed an implicit or explicit return; all awaiting is done.
|
||||||
|
@ -811,8 +809,8 @@ void async_block_start(VM& vm, T const& async_body, PromiseCapability const& pro
|
||||||
template void async_block_start(VM&, NonnullRefPtr<Statement const> const& async_body, PromiseCapability const&, ExecutionContext&);
|
template void async_block_start(VM&, NonnullRefPtr<Statement const> const& async_body, PromiseCapability const&, ExecutionContext&);
|
||||||
template void async_function_start(VM&, PromiseCapability const&, NonnullRefPtr<Statement const> const& async_function_body);
|
template void async_function_start(VM&, PromiseCapability const&, NonnullRefPtr<Statement const> const& async_function_body);
|
||||||
|
|
||||||
template void async_block_start(VM&, SafeFunction<Completion()> const& async_body, PromiseCapability const&, ExecutionContext&);
|
template void async_block_start(VM&, HeapFunction<Completion()> const& async_body, PromiseCapability const&, ExecutionContext&);
|
||||||
template void async_function_start(VM&, PromiseCapability const&, SafeFunction<Completion()> const& async_function_body);
|
template void async_function_start(VM&, PromiseCapability const&, HeapFunction<Completion()> const& async_function_body);
|
||||||
|
|
||||||
// 10.2.1.4 OrdinaryCallEvaluateBody ( F, argumentsList ), https://tc39.es/ecma262/#sec-ordinarycallevaluatebody
|
// 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
|
// 15.8.4 Runtime Semantics: EvaluateAsyncFunctionBody, https://tc39.es/ecma262/#sec-runtime-semantics-evaluatefunctionbody
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue