| // 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 |