blob: f53e69abd346a78fa0b52de66726f89fad5240e3 [file] [log] [blame]
// Copyright 2023 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
namespace promise {
extern macro AllocatePromiseWithResolversResult(
implicit context: Context)(JSAny, JSAny, JSAny): JSObject;
// https://tc39.es/proposal-promise-with-resolvers/#sec-promise.withResolvers
@incrementUseCounter('v8::Isolate::kPromiseWithResolvers')
transitioning javascript builtin PromiseWithResolvers(
js-implicit context: Context, receiver: JSAny)(): JSAny {
// 1. Let C be the this value.
const receiver = Cast<JSReceiver>(receiver)
otherwise ThrowTypeError(
MessageTemplate::kCalledOnNonObject, 'Promise.withResolvers');
// 2. Let promiseCapability be ? NewPromiseCapability(C).
const capability = NewPromiseCapability(receiver, False);
// 3. Let obj be OrdinaryObjectCreate(%Object.prototype%).
// 4. Perform ! CreateDataPropertyOrThrow(obj, "promise",
// promiseCapability.[[Promise]]).
// 5. Perform ! CreateDataPropertyOrThrow(obj, "resolve",
// promiseCapability.[[Resolve]]).
// 6. Perform ! CreateDataPropertyOrThrow(obj, "reject",
// promiseCapability.[[Reject]]).
// 7. Return obj.
return AllocatePromiseWithResolversResult(
capability.promise, capability.resolve, capability.reject);
}
} // namespace promise