mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 16:18:12 +00:00
LibJS: Make PromiseCapability GC-allocated
A struct with three raw pointers to other GC'd types is a pretty big liability, let's just turn this into a Cell itself. This comes with the additional benefit of being able to capture it in a lambda effortlessly, without having to create handles for individual members.
This commit is contained in:
parent
0585029c30
commit
fc9d587e39
29 changed files with 243 additions and 217 deletions
|
@ -11,8 +11,27 @@
|
|||
|
||||
namespace JS {
|
||||
|
||||
NonnullGCPtr<PromiseCapability> PromiseCapability::create(VM& vm, GCPtr<Object> promise, GCPtr<FunctionObject> resolve, GCPtr<FunctionObject> reject)
|
||||
{
|
||||
return NonnullGCPtr { *vm.heap().allocate_without_realm<PromiseCapability>(promise, resolve, reject) };
|
||||
}
|
||||
|
||||
PromiseCapability::PromiseCapability(GCPtr<Object> promise, GCPtr<FunctionObject> resolve, GCPtr<FunctionObject> reject)
|
||||
: m_promise(promise)
|
||||
, m_resolve(resolve)
|
||||
, m_reject(reject)
|
||||
{
|
||||
}
|
||||
|
||||
void PromiseCapability::visit_edges(Cell::Visitor& visitor)
|
||||
{
|
||||
visitor.visit(m_promise);
|
||||
visitor.visit(m_resolve);
|
||||
visitor.visit(m_reject);
|
||||
}
|
||||
|
||||
// 27.2.1.5 NewPromiseCapability ( C ), https://tc39.es/ecma262/#sec-newpromisecapability
|
||||
ThrowCompletionOr<PromiseCapability> new_promise_capability(VM& vm, Value constructor)
|
||||
ThrowCompletionOr<NonnullGCPtr<PromiseCapability>> new_promise_capability(VM& vm, Value constructor)
|
||||
{
|
||||
auto& realm = *vm.current_realm();
|
||||
|
||||
|
@ -70,11 +89,11 @@ ThrowCompletionOr<PromiseCapability> new_promise_capability(VM& vm, Value constr
|
|||
|
||||
// 9. Set promiseCapability.[[Promise]] to promise.
|
||||
// 10. Return promiseCapability.
|
||||
return PromiseCapability {
|
||||
return PromiseCapability::create(
|
||||
vm,
|
||||
promise,
|
||||
&promise_capability_functions.resolve.as_function(),
|
||||
&promise_capability_functions.reject.as_function(),
|
||||
};
|
||||
&promise_capability_functions.reject.as_function());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue