JSPromiseDeferred* JSPromiseDeferred::create(ExecState* exec, JSGlobalObject* globalObject) { VM& vm = exec->vm(); JSFunction* resolver = createDeferredConstructionFunction(vm, globalObject); JSPromise* promise = constructPromise(exec, globalObject, resolver); JSValue resolve = resolver->get(exec, vm.propertyNames->resolvePrivateName); JSValue reject = resolver->get(exec, vm.propertyNames->rejectPrivateName); return JSPromiseDeferred::create(vm, promise, resolve, reject); }
JSValue createJSPromiseDeferredFromConstructor(ExecState* exec, JSValue C) { // -- This implements the GetDeferred(C) abstract operation -- // 1. If IsConstructor(C) is false, throw a TypeError. if (!C.isObject()) return throwTypeError(exec); ConstructData constructData; ConstructType constructType = getConstructData(C, constructData); if (constructType == ConstructTypeNone) return throwTypeError(exec); VM& vm = exec->vm(); // 2. Let 'resolver' be a new built-in function object as defined in Deferred Construction Functions. JSFunction* resolver = createDeferredConstructionFunction(vm, asObject(C)->globalObject()); // 3. Let 'promise' be the result of calling the [[Construct]] internal method of 'C' with // an argument list containing the single item resolver. MarkedArgumentBuffer constructArguments; constructArguments.append(resolver); JSObject* promise = construct(exec, C, constructType, constructData, constructArguments); // 4. ReturnIfAbrupt(promise). if (exec->hadException()) return jsUndefined(); // 5. Let 'resolve' be the value of resolver's [[Resolve]] internal slot. JSValue resolve = resolver->get(exec, vm.propertyNames->resolvePrivateName); // 6. If IsCallable(resolve) is false, throw a TypeError. CallData resolveCallData; CallType resolveCallType = getCallData(resolve, resolveCallData); if (resolveCallType == CallTypeNone) return throwTypeError(exec); // 7. Let 'reject' be the value of resolver's [[Reject]] internal slot. JSValue reject = resolver->get(exec, vm.propertyNames->rejectPrivateName); // 8. If IsCallable(reject) is false, throw a TypeError. CallData rejectCallData; CallType rejectCallType = getCallData(reject, rejectCallData); if (rejectCallType == CallTypeNone) return throwTypeError(exec); // 9. Return the Deferred { [[Promise]]: promise, [[Resolve]]: resolve, [[Reject]]: reject }. return JSPromiseDeferred::create(exec->vm(), promise, resolve, reject); }