haikuwebkit/LayoutTests/js/Promise-types-expected.txt

55 lines
2.4 KiB
Plaintext
Raw Permalink Normal View History

Add support for Promises https://bugs.webkit.org/show_bug.cgi?id=120260 Reviewed by Darin Adler. Source/JavaScriptCore: Add an initial implementation of Promises - http://dom.spec.whatwg.org/#promises. - Despite Promises being defined in the DOM, the implementation is being put in JSC in preparation for the Promises eventually being defined in ECMAScript. * CMakeLists.txt: * DerivedSources.make: * DerivedSources.pri: * GNUmakefile.list.am: * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: * JavaScriptCore.xcodeproj/project.pbxproj: * Target.pri: Add new files. * jsc.cpp: Update jsc's GlobalObjectMethodTable to stub out the new QueueTaskToEventLoop callback. This mean's you can't quite use Promises with with the command line tool yet. * interpreter/CallFrame.h: (JSC::ExecState::promisePrototypeTable): (JSC::ExecState::promiseConstructorTable): (JSC::ExecState::promiseResolverPrototypeTable): * runtime/VM.cpp: (JSC::VM::VM): (JSC::VM::~VM): * runtime/VM.h: Add supporting code for the new static lookup tables. * runtime/CommonIdentifiers.h: Add 3 new identifiers, "Promise", "PromiseResolver", and "then". * runtime/JSGlobalObject.cpp: (JSC::JSGlobalObject::reset): (JSC::JSGlobalObject::visitChildren): Add supporting code Promise and PromiseResolver's constructors and structures. * runtime/JSGlobalObject.h: (JSC::TaskContext::~TaskContext): Add a new callback to the GlobalObjectMethodTable to post a task on the embedder's runloop. (JSC::JSGlobalObject::promisePrototype): (JSC::JSGlobalObject::promiseResolverPrototype): (JSC::JSGlobalObject::promiseStructure): (JSC::JSGlobalObject::promiseResolverStructure): (JSC::JSGlobalObject::promiseCallbackStructure): (JSC::JSGlobalObject::promiseWrapperCallbackStructure): Add supporting code Promise and PromiseResolver's constructors and structures. * runtime/JSPromise.cpp: Added. * runtime/JSPromise.h: Added. * runtime/JSPromiseCallback.cpp: Added. * runtime/JSPromiseCallback.h: Added. * runtime/JSPromiseConstructor.cpp: Added. * runtime/JSPromiseConstructor.h: Added. * runtime/JSPromisePrototype.cpp: Added. * runtime/JSPromisePrototype.h: Added. * runtime/JSPromiseResolver.cpp: Added. * runtime/JSPromiseResolver.h: Added. * runtime/JSPromiseResolverConstructor.cpp: Added. * runtime/JSPromiseResolverConstructor.h: Added. * runtime/JSPromiseResolverPrototype.cpp: Added. * runtime/JSPromiseResolverPrototype.h: Added. Add Promise implementation. Source/WebCore: Add an initial implementation of Promises - http://dom.spec.whatwg.org/#promises. - Despite Promises being defined in the DOM, the implementation is being put in JSC in preparation for the Promises eventually being defined in ECMAScript. Tests: fast/js/Promise-already-fulfilled.html fast/js/Promise-already-rejected.html fast/js/Promise-already-resolved.html fast/js/Promise-catch-in-workers.html fast/js/Promise-catch.html fast/js/Promise-chain.html fast/js/Promise-exception.html fast/js/Promise-fulfill-in-workers.html fast/js/Promise-fulfill.html fast/js/Promise-init-in-workers.html fast/js/Promise-init.html fast/js/Promise-reject-in-workers.html fast/js/Promise-reject.html fast/js/Promise-resolve-chain.html fast/js/Promise-resolve-in-workers.html fast/js/Promise-resolve-with-then-exception.html fast/js/Promise-resolve-with-then-fulfill.html fast/js/Promise-resolve-with-then-reject.html fast/js/Promise-resolve.html fast/js/Promise-simple-fulfill-inside-callback.html fast/js/Promise-simple-fulfill.html fast/js/Promise-simple-in-workers.html fast/js/Promise-simple.html fast/js/Promise-static-fulfill.html fast/js/Promise-static-reject.html fast/js/Promise-static-resolve.html fast/js/Promise-then-in-workers.html fast/js/Promise-then-without-callbacks-in-workers.html fast/js/Promise-then-without-callbacks.html fast/js/Promise-then.html fast/js/Promise-types.html fast/js/Promise.html * GNUmakefile.list.am: * Target.pri: * UseJSC.cmake: * WebCore.vcxproj/WebCore.vcxproj: * WebCore.vcxproj/WebCore.vcxproj.filters: * WebCore.xcodeproj/project.pbxproj: * bindings/js/JSBindingsAllInOne.cpp: Add new files. * bindings/js/JSDOMGlobalObjectTask.cpp: Added. (WebCore::JSGlobalObjectCallback::create): (WebCore::JSGlobalObjectCallback::~JSGlobalObjectCallback): (WebCore::JSGlobalObjectCallback::call): (WebCore::JSGlobalObjectCallback::JSGlobalObjectCallback): (WebCore::JSGlobalObjectTask::JSGlobalObjectTask): (WebCore::JSGlobalObjectTask::~JSGlobalObjectTask): (WebCore::JSGlobalObjectTask::performTask): * bindings/js/JSDOMGlobalObjectTask.h: Added. (WebCore::JSGlobalObjectTask::create): Add a new task type to be used with the GlobalObjectMethodTable's new QueueTaskToEventLoop callback. * bindings/js/JSDOMWindowBase.cpp: (WebCore::JSDOMWindowBase::queueTaskToEventLoop): * bindings/js/JSDOMWindowBase.h: Implement the GlobalObjectMethodTable callback, QueueTaskToEventLoop. * bindings/js/JSMainThreadExecState.h: All using JSMainThreadExecState as a simple RAII object. * bindings/js/JSWorkerGlobalScopeBase.cpp: (WebCore::JSWorkerGlobalScopeBase::JSWorkerGlobalScopeBase): (WebCore::JSWorkerGlobalScopeBase::allowsAccessFrom): (WebCore::JSWorkerGlobalScopeBase::supportsProfiling): (WebCore::JSWorkerGlobalScopeBase::supportsRichSourceInfo): (WebCore::JSWorkerGlobalScopeBase::shouldInterruptScript): (WebCore::JSWorkerGlobalScopeBase::javaScriptExperimentsEnabled): (WebCore::JSWorkerGlobalScopeBase::queueTaskToEventLoop): * bindings/js/JSWorkerGlobalScopeBase.h: Add a GlobalObjectMethodTable and implement QueueTaskToEventLoop. Forward the other callbacks to JSGlobalObject so they retain their existing behavior. LayoutTests: Add tests adapted from the Mozilla and Blink projects. * fast/js/Promise-already-fulfilled-expected.txt: Added. * fast/js/Promise-already-fulfilled.html: Added. * fast/js/Promise-already-rejected-expected.txt: Added. * fast/js/Promise-already-rejected.html: Added. * fast/js/Promise-already-resolved-expected.txt: Added. * fast/js/Promise-already-resolved.html: Added. * fast/js/Promise-catch-expected.txt: Added. * fast/js/Promise-catch-in-workers-expected.txt: Added. * fast/js/Promise-catch-in-workers.html: Added. * fast/js/Promise-catch.html: Added. * fast/js/Promise-chain-expected.txt: Added. * fast/js/Promise-chain.html: Added. * fast/js/Promise-exception-expected.txt: Added. * fast/js/Promise-exception.html: Added. * fast/js/Promise-expected.txt: Added. * fast/js/Promise-fulfill-expected.txt: Added. * fast/js/Promise-fulfill-in-workers-expected.txt: Added. * fast/js/Promise-fulfill-in-workers.html: Added. * fast/js/Promise-fulfill.html: Added. * fast/js/Promise-init-expected.txt: Added. * fast/js/Promise-init-in-workers-expected.txt: Added. * fast/js/Promise-init-in-workers.html: Added. * fast/js/Promise-init.html: Added. * fast/js/Promise-reject-expected.txt: Added. * fast/js/Promise-reject-in-workers-expected.txt: Added. * fast/js/Promise-reject-in-workers.html: Added. * fast/js/Promise-reject.html: Added. * fast/js/Promise-resolve-chain-expected.txt: Added. * fast/js/Promise-resolve-chain.html: Added. * fast/js/Promise-resolve-expected.txt: Added. * fast/js/Promise-resolve-in-workers-expected.txt: Added. * fast/js/Promise-resolve-in-workers.html: Added. * fast/js/Promise-resolve-with-then-exception-expected.txt: Added. * fast/js/Promise-resolve-with-then-exception.html: Added. * fast/js/Promise-resolve-with-then-fulfill-expected.txt: Added. * fast/js/Promise-resolve-with-then-fulfill.html: Added. * fast/js/Promise-resolve-with-then-reject-expected.txt: Added. * fast/js/Promise-resolve-with-then-reject.html: Added. * fast/js/Promise-resolve.html: Added. * fast/js/Promise-simple-expected.txt: Added. * fast/js/Promise-simple-fulfill-expected.txt: Added. * fast/js/Promise-simple-fulfill-inside-callback-expected.txt: Added. * fast/js/Promise-simple-fulfill-inside-callback.html: Added. * fast/js/Promise-simple-fulfill.html: Added. * fast/js/Promise-simple-in-workers-expected.txt: Added. * fast/js/Promise-simple-in-workers.html: Added. * fast/js/Promise-simple.html: Added. * fast/js/Promise-static-fulfill-expected.txt: Added. * fast/js/Promise-static-fulfill.html: Added. * fast/js/Promise-static-reject-expected.txt: Added. * fast/js/Promise-static-reject.html: Added. * fast/js/Promise-static-resolve-expected.txt: Added. * fast/js/Promise-static-resolve.html: Added. * fast/js/Promise-then-expected.txt: Added. * fast/js/Promise-then-in-workers-expected.txt: Added. * fast/js/Promise-then-in-workers.html: Added. * fast/js/Promise-then-without-callbacks-expected.txt: Added. * fast/js/Promise-then-without-callbacks-in-workers-expected.txt: Added. * fast/js/Promise-then-without-callbacks-in-workers.html: Added. * fast/js/Promise-then-without-callbacks.html: Added. * fast/js/Promise-then.html: Added. * fast/js/Promise-types-expected.txt: Added. * fast/js/Promise-types.html: Added. * fast/js/Promise.html: Added. * fast/js/resources/Promise-catch-in-workers.js: Added. * fast/js/resources/Promise-fulfill-in-workers.js: Added. * fast/js/resources/Promise-init-in-workers.js: Added. * fast/js/resources/Promise-reject-in-workers.js: Added. * fast/js/resources/Promise-resolve-in-workers.js: Added. * fast/js/resources/Promise-simple-in-workers.js: Added. * fast/js/resources/Promise-then-in-workers.js: Added. * fast/js/resources/Promise-then-without-callbacks-in-workers.js: Added. Canonical link: https://commits.webkit.org/138280@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@154629 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2013-08-26 19:19:50 +00:00
Promises - Test basic types / exceptions.
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
Promises
aPromise = new Promise(...)
PASS aPromise is an instance of Promise
PASS String(aPromise) is '[object Promise]'
PASS aPromise.then is defined.
PASS aPromise.then is an instance of Function
Update Promises to the https://github.com/domenic/promises-unwrapping spec https://bugs.webkit.org/show_bug.cgi?id=120954 Reviewed by Filip Pizlo. Source/JavaScriptCore: Update Promises to the revised spec. Notable changes: - JSPromiseResolver is gone. - TaskContext has been renamed Microtask and now has a virtual run() function. - Instead of using custom InternalFunction subclasses, JSFunctions are used with PrivateName properties for internal slots. * CMakeLists.txt: * DerivedSources.make: * GNUmakefile.list.am: * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: * JavaScriptCore.xcodeproj/project.pbxproj: * interpreter/CallFrame.h: (JSC::ExecState::promiseConstructorTable): * runtime/CommonIdentifiers.cpp: (JSC::CommonIdentifiers::CommonIdentifiers): * runtime/CommonIdentifiers.h: * runtime/JSGlobalObject.cpp: (JSC::JSGlobalObject::reset): (JSC::JSGlobalObject::visitChildren): (JSC::JSGlobalObject::queueMicrotask): * runtime/JSGlobalObject.h: (JSC::JSGlobalObject::promiseConstructor): (JSC::JSGlobalObject::promisePrototype): (JSC::JSGlobalObject::promiseStructure): * runtime/JSPromise.cpp: (JSC::JSPromise::create): (JSC::JSPromise::JSPromise): (JSC::JSPromise::finishCreation): (JSC::JSPromise::visitChildren): (JSC::JSPromise::reject): (JSC::JSPromise::resolve): (JSC::JSPromise::appendResolveReaction): (JSC::JSPromise::appendRejectReaction): (JSC::triggerPromiseReactions): * runtime/JSPromise.h: (JSC::JSPromise::status): (JSC::JSPromise::result): (JSC::JSPromise::constructor): * runtime/JSPromiseCallback.cpp: Removed. * runtime/JSPromiseCallback.h: Removed. * runtime/JSPromiseConstructor.cpp: (JSC::constructPromise): (JSC::JSPromiseConstructor::getCallData): (JSC::JSPromiseConstructorFuncCast): (JSC::JSPromiseConstructorFuncResolve): (JSC::JSPromiseConstructorFuncReject): * runtime/JSPromiseConstructor.h: * runtime/JSPromiseDeferred.cpp: Added. (JSC::JSPromiseDeferred::create): (JSC::JSPromiseDeferred::JSPromiseDeferred): (JSC::JSPromiseDeferred::finishCreation): (JSC::JSPromiseDeferred::visitChildren): (JSC::createJSPromiseDeferredFromConstructor): (JSC::updateDeferredFromPotentialThenable): * runtime/JSPromiseDeferred.h: Added. (JSC::JSPromiseDeferred::createStructure): (JSC::JSPromiseDeferred::promise): (JSC::JSPromiseDeferred::resolve): (JSC::JSPromiseDeferred::reject): * runtime/JSPromiseFunctions.cpp: Added. (JSC::deferredConstructionFunction): (JSC::createDeferredConstructionFunction): (JSC::identifyFunction): (JSC::createIdentifyFunction): (JSC::promiseAllCountdownFunction): (JSC::createPromiseAllCountdownFunction): (JSC::promiseResolutionHandlerFunction): (JSC::createPromiseResolutionHandlerFunction): (JSC::rejectPromiseFunction): (JSC::createRejectPromiseFunction): (JSC::resolvePromiseFunction): (JSC::createResolvePromiseFunction): (JSC::throwerFunction): (JSC::createThrowerFunction): * runtime/JSPromiseFunctions.h: Added. * runtime/JSPromisePrototype.cpp: (JSC::JSPromisePrototypeFuncThen): (JSC::JSPromisePrototypeFuncCatch): * runtime/JSPromiseReaction.cpp: Added. (JSC::createExecutePromiseReactionMicroTask): (JSC::ExecutePromiseReactionMicroTask::run): (JSC::JSPromiseReaction::create): (JSC::JSPromiseReaction::JSPromiseReaction): (JSC::JSPromiseReaction::finishCreation): (JSC::JSPromiseReaction::visitChildren): * runtime/JSPromiseReaction.h: Added. (JSC::JSPromiseReaction::createStructure): (JSC::JSPromiseReaction::deferred): (JSC::JSPromiseReaction::handler): * runtime/JSPromiseResolver.cpp: Removed. * runtime/JSPromiseResolver.h: Removed. * runtime/JSPromiseResolverConstructor.cpp: Removed. * runtime/JSPromiseResolverConstructor.h: Removed. * runtime/JSPromiseResolverPrototype.cpp: Removed. * runtime/JSPromiseResolverPrototype.h: Removed. * runtime/Microtask.h: Added. * runtime/VM.cpp: (JSC::VM::VM): (JSC::VM::~VM): * runtime/VM.h: Source/WebCore: * ForwardingHeaders/runtime/JSPromiseDeferred.h: Added. * ForwardingHeaders/runtime/JSPromiseResolver.h: Removed. * bindings/js/JSDOMGlobalObjectTask.cpp: (WebCore::JSGlobalObjectTask::JSGlobalObjectTask): * bindings/js/JSDOMGlobalObjectTask.h: * bindings/js/JSDOMPromise.cpp: (WebCore::DeferredWrapper::DeferredWrapper): (WebCore::DeferredWrapper::promise): (WebCore::DeferredWrapper::resolve): (WebCore::DeferredWrapper::reject): * bindings/js/JSDOMPromise.h: (WebCore::DeferredWrapper::resolve): (WebCore::DeferredWrapper::reject): (WebCore::DeferredWrapper::resolve<String>): (WebCore::DeferredWrapper::resolve<bool>): (WebCore::char>>): (WebCore::DeferredWrapper::reject<String>): * bindings/js/JSDOMWindowBase.cpp: (WebCore::JSDOMWindowBase::queueTaskToEventLoop): * bindings/js/JSDOMWindowBase.h: * bindings/js/JSSubtleCryptoCustom.cpp: (WebCore::JSSubtleCrypto::encrypt): (WebCore::JSSubtleCrypto::decrypt): (WebCore::JSSubtleCrypto::sign): (WebCore::JSSubtleCrypto::verify): (WebCore::JSSubtleCrypto::digest): (WebCore::JSSubtleCrypto::generateKey): (WebCore::JSSubtleCrypto::importKey): (WebCore::JSSubtleCrypto::exportKey): (WebCore::JSSubtleCrypto::wrapKey): (WebCore::JSSubtleCrypto::unwrapKey): * bindings/js/JSWorkerGlobalScopeBase.cpp: (WebCore::JSWorkerGlobalScopeBase::queueTaskToEventLoop): * bindings/js/JSWorkerGlobalScopeBase.h: LayoutTests: * crypto/subtle/argument-conversion.html: * crypto/subtle/resources/common.js: * crypto/subtle/sha-1.html: * crypto/subtle/sha-224.html: * crypto/subtle/sha-256.html: * crypto/subtle/sha-384.html: * crypto/subtle/sha-512.html: * js/dom/Promise-already-fulfilled-expected.txt: Removed. * js/dom/Promise-already-fulfilled.html: Removed. * js/dom/Promise-already-rejected.html: * js/dom/Promise-already-resolved.html: * js/dom/Promise-catch-expected.txt: * js/dom/Promise-catch-in-workers-expected.txt: * js/dom/Promise-catch.html: * js/dom/Promise-chain.html: * js/dom/Promise-exception-expected.txt: * js/dom/Promise-exception.html: * js/dom/Promise-expected.txt: * js/dom/Promise-fulfill-expected.txt: Removed. * js/dom/Promise-fulfill-in-workers-expected.txt: Removed. * js/dom/Promise-fulfill-in-workers.html: Removed. * js/dom/Promise-fulfill.html: Removed. * js/dom/Promise-init-callback-receiver-expected.txt: Added. * js/dom/Promise-init-callback-receiver.html: Added. * js/dom/Promise-init-expected.txt: * js/dom/Promise-init-in-workers-expected.txt: * js/dom/Promise-init.html: * js/dom/Promise-onFulfilled-deep-expected.txt: Added. * js/dom/Promise-onFulfilled-deep.html: Added. * js/dom/Promise-onRejected-deep-expected.txt: Added. * js/dom/Promise-onRejected-deep.html: Added. * js/dom/Promise-reject.html: * js/dom/Promise-resolve-chain.html: * js/dom/Promise-resolve-expected.txt: * js/dom/Promise-resolve-in-workers-expected.txt: * js/dom/Promise-resolve-state-expected.txt: Added. * js/dom/Promise-resolve-state-in-workers-expected.txt: Added. * js/dom/Promise-resolve-state-in-workers.html: Added. * js/dom/Promise-resolve-state.html: Added. * js/dom/Promise-resolve-with-itself-expected.txt: Added. * js/dom/Promise-resolve-with-itself.html: Added. * js/dom/Promise-resolve-with-then-exception.html: * js/dom/Promise-resolve-with-then-fulfill-expected.txt: * js/dom/Promise-resolve-with-then-fulfill.html: * js/dom/Promise-resolve-with-then-reject-expected.txt: * js/dom/Promise-resolve-with-then-reject.html: * js/dom/Promise-resolve.html: * js/dom/Promise-simple-expected.txt: * js/dom/Promise-simple-fulfill-expected.txt: Removed. * js/dom/Promise-simple-fulfill-inside-callback-expected.txt: Removed. * js/dom/Promise-simple-fulfill-inside-callback.html: Removed. * js/dom/Promise-simple-fulfill.html: Removed. * js/dom/Promise-simple-in-workers-expected.txt: * js/dom/Promise-simple-resolve-expected.txt: Added. * js/dom/Promise-simple-resolve.html: Added. * js/dom/Promise-simple.html: * js/dom/Promise-static-all-expected.txt: Added. * js/dom/Promise-static-all.html: Added. * js/dom/Promise-static-cast-expected.txt: Added. * js/dom/Promise-static-cast.html: Added. * js/dom/Promise-static-fulfill-expected.txt: Removed. * js/dom/Promise-static-fulfill.html: Removed. * js/dom/Promise-static-race-expected.txt: Added. * js/dom/Promise-static-race.html: Added. * js/dom/Promise-static-resolve.html: * js/dom/Promise-then-callback-receiver-expected.txt: Added. * js/dom/Promise-then-callback-receiver.html: Added. * js/dom/Promise-then-expected.txt: * js/dom/Promise-then-in-workers-expected.txt: * js/dom/Promise-then-without-callbacks.html: * js/dom/Promise-then.html: * js/dom/Promise-types-expected.txt: * js/dom/Promise-types.html: * js/dom/Promise.html: * js/resources/Promise-catch-in-workers.js: * js/resources/Promise-fulfill-in-workers.js: Removed. * js/resources/Promise-init-in-workers.js: * js/resources/Promise-reject-in-workers.js: * js/resources/Promise-resolve-in-workers.js: * js/resources/Promise-resolve-state-in-workers.js: Added. * js/resources/Promise-simple-in-workers.js: * js/resources/Promise-then-in-workers.js: * js/resources/Promise-then-without-callbacks-in-workers.js: Canonical link: https://commits.webkit.org/144312@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@161241 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2014-01-03 00:40:16 +00:00
PASS aPromise.then.length is 2
Add support for Promises https://bugs.webkit.org/show_bug.cgi?id=120260 Reviewed by Darin Adler. Source/JavaScriptCore: Add an initial implementation of Promises - http://dom.spec.whatwg.org/#promises. - Despite Promises being defined in the DOM, the implementation is being put in JSC in preparation for the Promises eventually being defined in ECMAScript. * CMakeLists.txt: * DerivedSources.make: * DerivedSources.pri: * GNUmakefile.list.am: * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: * JavaScriptCore.xcodeproj/project.pbxproj: * Target.pri: Add new files. * jsc.cpp: Update jsc's GlobalObjectMethodTable to stub out the new QueueTaskToEventLoop callback. This mean's you can't quite use Promises with with the command line tool yet. * interpreter/CallFrame.h: (JSC::ExecState::promisePrototypeTable): (JSC::ExecState::promiseConstructorTable): (JSC::ExecState::promiseResolverPrototypeTable): * runtime/VM.cpp: (JSC::VM::VM): (JSC::VM::~VM): * runtime/VM.h: Add supporting code for the new static lookup tables. * runtime/CommonIdentifiers.h: Add 3 new identifiers, "Promise", "PromiseResolver", and "then". * runtime/JSGlobalObject.cpp: (JSC::JSGlobalObject::reset): (JSC::JSGlobalObject::visitChildren): Add supporting code Promise and PromiseResolver's constructors and structures. * runtime/JSGlobalObject.h: (JSC::TaskContext::~TaskContext): Add a new callback to the GlobalObjectMethodTable to post a task on the embedder's runloop. (JSC::JSGlobalObject::promisePrototype): (JSC::JSGlobalObject::promiseResolverPrototype): (JSC::JSGlobalObject::promiseStructure): (JSC::JSGlobalObject::promiseResolverStructure): (JSC::JSGlobalObject::promiseCallbackStructure): (JSC::JSGlobalObject::promiseWrapperCallbackStructure): Add supporting code Promise and PromiseResolver's constructors and structures. * runtime/JSPromise.cpp: Added. * runtime/JSPromise.h: Added. * runtime/JSPromiseCallback.cpp: Added. * runtime/JSPromiseCallback.h: Added. * runtime/JSPromiseConstructor.cpp: Added. * runtime/JSPromiseConstructor.h: Added. * runtime/JSPromisePrototype.cpp: Added. * runtime/JSPromisePrototype.h: Added. * runtime/JSPromiseResolver.cpp: Added. * runtime/JSPromiseResolver.h: Added. * runtime/JSPromiseResolverConstructor.cpp: Added. * runtime/JSPromiseResolverConstructor.h: Added. * runtime/JSPromiseResolverPrototype.cpp: Added. * runtime/JSPromiseResolverPrototype.h: Added. Add Promise implementation. Source/WebCore: Add an initial implementation of Promises - http://dom.spec.whatwg.org/#promises. - Despite Promises being defined in the DOM, the implementation is being put in JSC in preparation for the Promises eventually being defined in ECMAScript. Tests: fast/js/Promise-already-fulfilled.html fast/js/Promise-already-rejected.html fast/js/Promise-already-resolved.html fast/js/Promise-catch-in-workers.html fast/js/Promise-catch.html fast/js/Promise-chain.html fast/js/Promise-exception.html fast/js/Promise-fulfill-in-workers.html fast/js/Promise-fulfill.html fast/js/Promise-init-in-workers.html fast/js/Promise-init.html fast/js/Promise-reject-in-workers.html fast/js/Promise-reject.html fast/js/Promise-resolve-chain.html fast/js/Promise-resolve-in-workers.html fast/js/Promise-resolve-with-then-exception.html fast/js/Promise-resolve-with-then-fulfill.html fast/js/Promise-resolve-with-then-reject.html fast/js/Promise-resolve.html fast/js/Promise-simple-fulfill-inside-callback.html fast/js/Promise-simple-fulfill.html fast/js/Promise-simple-in-workers.html fast/js/Promise-simple.html fast/js/Promise-static-fulfill.html fast/js/Promise-static-reject.html fast/js/Promise-static-resolve.html fast/js/Promise-then-in-workers.html fast/js/Promise-then-without-callbacks-in-workers.html fast/js/Promise-then-without-callbacks.html fast/js/Promise-then.html fast/js/Promise-types.html fast/js/Promise.html * GNUmakefile.list.am: * Target.pri: * UseJSC.cmake: * WebCore.vcxproj/WebCore.vcxproj: * WebCore.vcxproj/WebCore.vcxproj.filters: * WebCore.xcodeproj/project.pbxproj: * bindings/js/JSBindingsAllInOne.cpp: Add new files. * bindings/js/JSDOMGlobalObjectTask.cpp: Added. (WebCore::JSGlobalObjectCallback::create): (WebCore::JSGlobalObjectCallback::~JSGlobalObjectCallback): (WebCore::JSGlobalObjectCallback::call): (WebCore::JSGlobalObjectCallback::JSGlobalObjectCallback): (WebCore::JSGlobalObjectTask::JSGlobalObjectTask): (WebCore::JSGlobalObjectTask::~JSGlobalObjectTask): (WebCore::JSGlobalObjectTask::performTask): * bindings/js/JSDOMGlobalObjectTask.h: Added. (WebCore::JSGlobalObjectTask::create): Add a new task type to be used with the GlobalObjectMethodTable's new QueueTaskToEventLoop callback. * bindings/js/JSDOMWindowBase.cpp: (WebCore::JSDOMWindowBase::queueTaskToEventLoop): * bindings/js/JSDOMWindowBase.h: Implement the GlobalObjectMethodTable callback, QueueTaskToEventLoop. * bindings/js/JSMainThreadExecState.h: All using JSMainThreadExecState as a simple RAII object. * bindings/js/JSWorkerGlobalScopeBase.cpp: (WebCore::JSWorkerGlobalScopeBase::JSWorkerGlobalScopeBase): (WebCore::JSWorkerGlobalScopeBase::allowsAccessFrom): (WebCore::JSWorkerGlobalScopeBase::supportsProfiling): (WebCore::JSWorkerGlobalScopeBase::supportsRichSourceInfo): (WebCore::JSWorkerGlobalScopeBase::shouldInterruptScript): (WebCore::JSWorkerGlobalScopeBase::javaScriptExperimentsEnabled): (WebCore::JSWorkerGlobalScopeBase::queueTaskToEventLoop): * bindings/js/JSWorkerGlobalScopeBase.h: Add a GlobalObjectMethodTable and implement QueueTaskToEventLoop. Forward the other callbacks to JSGlobalObject so they retain their existing behavior. LayoutTests: Add tests adapted from the Mozilla and Blink projects. * fast/js/Promise-already-fulfilled-expected.txt: Added. * fast/js/Promise-already-fulfilled.html: Added. * fast/js/Promise-already-rejected-expected.txt: Added. * fast/js/Promise-already-rejected.html: Added. * fast/js/Promise-already-resolved-expected.txt: Added. * fast/js/Promise-already-resolved.html: Added. * fast/js/Promise-catch-expected.txt: Added. * fast/js/Promise-catch-in-workers-expected.txt: Added. * fast/js/Promise-catch-in-workers.html: Added. * fast/js/Promise-catch.html: Added. * fast/js/Promise-chain-expected.txt: Added. * fast/js/Promise-chain.html: Added. * fast/js/Promise-exception-expected.txt: Added. * fast/js/Promise-exception.html: Added. * fast/js/Promise-expected.txt: Added. * fast/js/Promise-fulfill-expected.txt: Added. * fast/js/Promise-fulfill-in-workers-expected.txt: Added. * fast/js/Promise-fulfill-in-workers.html: Added. * fast/js/Promise-fulfill.html: Added. * fast/js/Promise-init-expected.txt: Added. * fast/js/Promise-init-in-workers-expected.txt: Added. * fast/js/Promise-init-in-workers.html: Added. * fast/js/Promise-init.html: Added. * fast/js/Promise-reject-expected.txt: Added. * fast/js/Promise-reject-in-workers-expected.txt: Added. * fast/js/Promise-reject-in-workers.html: Added. * fast/js/Promise-reject.html: Added. * fast/js/Promise-resolve-chain-expected.txt: Added. * fast/js/Promise-resolve-chain.html: Added. * fast/js/Promise-resolve-expected.txt: Added. * fast/js/Promise-resolve-in-workers-expected.txt: Added. * fast/js/Promise-resolve-in-workers.html: Added. * fast/js/Promise-resolve-with-then-exception-expected.txt: Added. * fast/js/Promise-resolve-with-then-exception.html: Added. * fast/js/Promise-resolve-with-then-fulfill-expected.txt: Added. * fast/js/Promise-resolve-with-then-fulfill.html: Added. * fast/js/Promise-resolve-with-then-reject-expected.txt: Added. * fast/js/Promise-resolve-with-then-reject.html: Added. * fast/js/Promise-resolve.html: Added. * fast/js/Promise-simple-expected.txt: Added. * fast/js/Promise-simple-fulfill-expected.txt: Added. * fast/js/Promise-simple-fulfill-inside-callback-expected.txt: Added. * fast/js/Promise-simple-fulfill-inside-callback.html: Added. * fast/js/Promise-simple-fulfill.html: Added. * fast/js/Promise-simple-in-workers-expected.txt: Added. * fast/js/Promise-simple-in-workers.html: Added. * fast/js/Promise-simple.html: Added. * fast/js/Promise-static-fulfill-expected.txt: Added. * fast/js/Promise-static-fulfill.html: Added. * fast/js/Promise-static-reject-expected.txt: Added. * fast/js/Promise-static-reject.html: Added. * fast/js/Promise-static-resolve-expected.txt: Added. * fast/js/Promise-static-resolve.html: Added. * fast/js/Promise-then-expected.txt: Added. * fast/js/Promise-then-in-workers-expected.txt: Added. * fast/js/Promise-then-in-workers.html: Added. * fast/js/Promise-then-without-callbacks-expected.txt: Added. * fast/js/Promise-then-without-callbacks-in-workers-expected.txt: Added. * fast/js/Promise-then-without-callbacks-in-workers.html: Added. * fast/js/Promise-then-without-callbacks.html: Added. * fast/js/Promise-then.html: Added. * fast/js/Promise-types-expected.txt: Added. * fast/js/Promise-types.html: Added. * fast/js/Promise.html: Added. * fast/js/resources/Promise-catch-in-workers.js: Added. * fast/js/resources/Promise-fulfill-in-workers.js: Added. * fast/js/resources/Promise-init-in-workers.js: Added. * fast/js/resources/Promise-reject-in-workers.js: Added. * fast/js/resources/Promise-resolve-in-workers.js: Added. * fast/js/resources/Promise-simple-in-workers.js: Added. * fast/js/resources/Promise-then-in-workers.js: Added. * fast/js/resources/Promise-then-without-callbacks-in-workers.js: Added. Canonical link: https://commits.webkit.org/138280@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@154629 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2013-08-26 19:19:50 +00:00
PASS aPromise.catch is defined.
PASS aPromise.catch is an instance of Function
Update Promises to the https://github.com/domenic/promises-unwrapping spec https://bugs.webkit.org/show_bug.cgi?id=120954 Reviewed by Filip Pizlo. Source/JavaScriptCore: Update Promises to the revised spec. Notable changes: - JSPromiseResolver is gone. - TaskContext has been renamed Microtask and now has a virtual run() function. - Instead of using custom InternalFunction subclasses, JSFunctions are used with PrivateName properties for internal slots. * CMakeLists.txt: * DerivedSources.make: * GNUmakefile.list.am: * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: * JavaScriptCore.xcodeproj/project.pbxproj: * interpreter/CallFrame.h: (JSC::ExecState::promiseConstructorTable): * runtime/CommonIdentifiers.cpp: (JSC::CommonIdentifiers::CommonIdentifiers): * runtime/CommonIdentifiers.h: * runtime/JSGlobalObject.cpp: (JSC::JSGlobalObject::reset): (JSC::JSGlobalObject::visitChildren): (JSC::JSGlobalObject::queueMicrotask): * runtime/JSGlobalObject.h: (JSC::JSGlobalObject::promiseConstructor): (JSC::JSGlobalObject::promisePrototype): (JSC::JSGlobalObject::promiseStructure): * runtime/JSPromise.cpp: (JSC::JSPromise::create): (JSC::JSPromise::JSPromise): (JSC::JSPromise::finishCreation): (JSC::JSPromise::visitChildren): (JSC::JSPromise::reject): (JSC::JSPromise::resolve): (JSC::JSPromise::appendResolveReaction): (JSC::JSPromise::appendRejectReaction): (JSC::triggerPromiseReactions): * runtime/JSPromise.h: (JSC::JSPromise::status): (JSC::JSPromise::result): (JSC::JSPromise::constructor): * runtime/JSPromiseCallback.cpp: Removed. * runtime/JSPromiseCallback.h: Removed. * runtime/JSPromiseConstructor.cpp: (JSC::constructPromise): (JSC::JSPromiseConstructor::getCallData): (JSC::JSPromiseConstructorFuncCast): (JSC::JSPromiseConstructorFuncResolve): (JSC::JSPromiseConstructorFuncReject): * runtime/JSPromiseConstructor.h: * runtime/JSPromiseDeferred.cpp: Added. (JSC::JSPromiseDeferred::create): (JSC::JSPromiseDeferred::JSPromiseDeferred): (JSC::JSPromiseDeferred::finishCreation): (JSC::JSPromiseDeferred::visitChildren): (JSC::createJSPromiseDeferredFromConstructor): (JSC::updateDeferredFromPotentialThenable): * runtime/JSPromiseDeferred.h: Added. (JSC::JSPromiseDeferred::createStructure): (JSC::JSPromiseDeferred::promise): (JSC::JSPromiseDeferred::resolve): (JSC::JSPromiseDeferred::reject): * runtime/JSPromiseFunctions.cpp: Added. (JSC::deferredConstructionFunction): (JSC::createDeferredConstructionFunction): (JSC::identifyFunction): (JSC::createIdentifyFunction): (JSC::promiseAllCountdownFunction): (JSC::createPromiseAllCountdownFunction): (JSC::promiseResolutionHandlerFunction): (JSC::createPromiseResolutionHandlerFunction): (JSC::rejectPromiseFunction): (JSC::createRejectPromiseFunction): (JSC::resolvePromiseFunction): (JSC::createResolvePromiseFunction): (JSC::throwerFunction): (JSC::createThrowerFunction): * runtime/JSPromiseFunctions.h: Added. * runtime/JSPromisePrototype.cpp: (JSC::JSPromisePrototypeFuncThen): (JSC::JSPromisePrototypeFuncCatch): * runtime/JSPromiseReaction.cpp: Added. (JSC::createExecutePromiseReactionMicroTask): (JSC::ExecutePromiseReactionMicroTask::run): (JSC::JSPromiseReaction::create): (JSC::JSPromiseReaction::JSPromiseReaction): (JSC::JSPromiseReaction::finishCreation): (JSC::JSPromiseReaction::visitChildren): * runtime/JSPromiseReaction.h: Added. (JSC::JSPromiseReaction::createStructure): (JSC::JSPromiseReaction::deferred): (JSC::JSPromiseReaction::handler): * runtime/JSPromiseResolver.cpp: Removed. * runtime/JSPromiseResolver.h: Removed. * runtime/JSPromiseResolverConstructor.cpp: Removed. * runtime/JSPromiseResolverConstructor.h: Removed. * runtime/JSPromiseResolverPrototype.cpp: Removed. * runtime/JSPromiseResolverPrototype.h: Removed. * runtime/Microtask.h: Added. * runtime/VM.cpp: (JSC::VM::VM): (JSC::VM::~VM): * runtime/VM.h: Source/WebCore: * ForwardingHeaders/runtime/JSPromiseDeferred.h: Added. * ForwardingHeaders/runtime/JSPromiseResolver.h: Removed. * bindings/js/JSDOMGlobalObjectTask.cpp: (WebCore::JSGlobalObjectTask::JSGlobalObjectTask): * bindings/js/JSDOMGlobalObjectTask.h: * bindings/js/JSDOMPromise.cpp: (WebCore::DeferredWrapper::DeferredWrapper): (WebCore::DeferredWrapper::promise): (WebCore::DeferredWrapper::resolve): (WebCore::DeferredWrapper::reject): * bindings/js/JSDOMPromise.h: (WebCore::DeferredWrapper::resolve): (WebCore::DeferredWrapper::reject): (WebCore::DeferredWrapper::resolve<String>): (WebCore::DeferredWrapper::resolve<bool>): (WebCore::char>>): (WebCore::DeferredWrapper::reject<String>): * bindings/js/JSDOMWindowBase.cpp: (WebCore::JSDOMWindowBase::queueTaskToEventLoop): * bindings/js/JSDOMWindowBase.h: * bindings/js/JSSubtleCryptoCustom.cpp: (WebCore::JSSubtleCrypto::encrypt): (WebCore::JSSubtleCrypto::decrypt): (WebCore::JSSubtleCrypto::sign): (WebCore::JSSubtleCrypto::verify): (WebCore::JSSubtleCrypto::digest): (WebCore::JSSubtleCrypto::generateKey): (WebCore::JSSubtleCrypto::importKey): (WebCore::JSSubtleCrypto::exportKey): (WebCore::JSSubtleCrypto::wrapKey): (WebCore::JSSubtleCrypto::unwrapKey): * bindings/js/JSWorkerGlobalScopeBase.cpp: (WebCore::JSWorkerGlobalScopeBase::queueTaskToEventLoop): * bindings/js/JSWorkerGlobalScopeBase.h: LayoutTests: * crypto/subtle/argument-conversion.html: * crypto/subtle/resources/common.js: * crypto/subtle/sha-1.html: * crypto/subtle/sha-224.html: * crypto/subtle/sha-256.html: * crypto/subtle/sha-384.html: * crypto/subtle/sha-512.html: * js/dom/Promise-already-fulfilled-expected.txt: Removed. * js/dom/Promise-already-fulfilled.html: Removed. * js/dom/Promise-already-rejected.html: * js/dom/Promise-already-resolved.html: * js/dom/Promise-catch-expected.txt: * js/dom/Promise-catch-in-workers-expected.txt: * js/dom/Promise-catch.html: * js/dom/Promise-chain.html: * js/dom/Promise-exception-expected.txt: * js/dom/Promise-exception.html: * js/dom/Promise-expected.txt: * js/dom/Promise-fulfill-expected.txt: Removed. * js/dom/Promise-fulfill-in-workers-expected.txt: Removed. * js/dom/Promise-fulfill-in-workers.html: Removed. * js/dom/Promise-fulfill.html: Removed. * js/dom/Promise-init-callback-receiver-expected.txt: Added. * js/dom/Promise-init-callback-receiver.html: Added. * js/dom/Promise-init-expected.txt: * js/dom/Promise-init-in-workers-expected.txt: * js/dom/Promise-init.html: * js/dom/Promise-onFulfilled-deep-expected.txt: Added. * js/dom/Promise-onFulfilled-deep.html: Added. * js/dom/Promise-onRejected-deep-expected.txt: Added. * js/dom/Promise-onRejected-deep.html: Added. * js/dom/Promise-reject.html: * js/dom/Promise-resolve-chain.html: * js/dom/Promise-resolve-expected.txt: * js/dom/Promise-resolve-in-workers-expected.txt: * js/dom/Promise-resolve-state-expected.txt: Added. * js/dom/Promise-resolve-state-in-workers-expected.txt: Added. * js/dom/Promise-resolve-state-in-workers.html: Added. * js/dom/Promise-resolve-state.html: Added. * js/dom/Promise-resolve-with-itself-expected.txt: Added. * js/dom/Promise-resolve-with-itself.html: Added. * js/dom/Promise-resolve-with-then-exception.html: * js/dom/Promise-resolve-with-then-fulfill-expected.txt: * js/dom/Promise-resolve-with-then-fulfill.html: * js/dom/Promise-resolve-with-then-reject-expected.txt: * js/dom/Promise-resolve-with-then-reject.html: * js/dom/Promise-resolve.html: * js/dom/Promise-simple-expected.txt: * js/dom/Promise-simple-fulfill-expected.txt: Removed. * js/dom/Promise-simple-fulfill-inside-callback-expected.txt: Removed. * js/dom/Promise-simple-fulfill-inside-callback.html: Removed. * js/dom/Promise-simple-fulfill.html: Removed. * js/dom/Promise-simple-in-workers-expected.txt: * js/dom/Promise-simple-resolve-expected.txt: Added. * js/dom/Promise-simple-resolve.html: Added. * js/dom/Promise-simple.html: * js/dom/Promise-static-all-expected.txt: Added. * js/dom/Promise-static-all.html: Added. * js/dom/Promise-static-cast-expected.txt: Added. * js/dom/Promise-static-cast.html: Added. * js/dom/Promise-static-fulfill-expected.txt: Removed. * js/dom/Promise-static-fulfill.html: Removed. * js/dom/Promise-static-race-expected.txt: Added. * js/dom/Promise-static-race.html: Added. * js/dom/Promise-static-resolve.html: * js/dom/Promise-then-callback-receiver-expected.txt: Added. * js/dom/Promise-then-callback-receiver.html: Added. * js/dom/Promise-then-expected.txt: * js/dom/Promise-then-in-workers-expected.txt: * js/dom/Promise-then-without-callbacks.html: * js/dom/Promise-then.html: * js/dom/Promise-types-expected.txt: * js/dom/Promise-types.html: * js/dom/Promise.html: * js/resources/Promise-catch-in-workers.js: * js/resources/Promise-fulfill-in-workers.js: Removed. * js/resources/Promise-init-in-workers.js: * js/resources/Promise-reject-in-workers.js: * js/resources/Promise-resolve-in-workers.js: * js/resources/Promise-resolve-state-in-workers.js: Added. * js/resources/Promise-simple-in-workers.js: * js/resources/Promise-then-in-workers.js: * js/resources/Promise-then-without-callbacks-in-workers.js: Canonical link: https://commits.webkit.org/144312@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@161241 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2014-01-03 00:40:16 +00:00
PASS aPromise.catch.length is 1
PASS aPromise.finally is an instance of Function
PASS aPromise.finally.length is 1
aPromise2 = Promise(...)
[JSC] Make Promise implementation faster https://bugs.webkit.org/show_bug.cgi?id=200898 Reviewed by Saam Barati. JSTests: * ChakraCore/test/UnitTestFramework/UnitTestFramework.js: (assert.assert.return.throws): * modules/breaking-builtin-promise-then-does-not-break-internal-promise.js: Added. * modules/breaking-builtin-promise-then-does-not-break-internal-promise/test.js: Added. * stress/constructor-kind-naked-should-not-be-applied-to-inner-functions.js: Added. (shouldThrow): (new.Promise): (shouldThrow.Promise): * stress/create-promise-should-respect-promise-realm.js: Added. (shouldBe): (other.new.OtherPromise): (DerivedOtherPromise): (i.promise.new.DerivedOtherPromise): (createPromise): * stress/derived-promise-constructor-class-syntax-prototype-replace-attempt.js: Added. (shouldBe): (DerivedPromise): (i.array.push.new.DerivedPromise): (promise.new.DerivedPromise): * stress/derived-promise-constructor-inlined.js: Added. (shouldBe): (DerivedPromise): (i.array.push.new.DerivedPromise): (DerivedPromise.all.array.then): * stress/derived-promise-prototype-replaced.js: Added. (shouldBe): (DerivedPromise): (i.array.push.new.DerivedPromise): (promise.new.DerivedPromise): * stress/internal-promise-constructor-not-confusing.js: Added. (shouldBe): (InternalPromise.vm.createBuiltin): (DerivedPromise): * stress/internal-promise-is-not-exposed.js: Added. (shouldBe): * stress/new-promise-should-respect-promise-realm.js: Added. (shouldBe): (other.new.OtherPromise): (createPromise): * stress/promise-cannot-be-called.js: (shouldThrow): * stress/promise-capability-fast-path.js: Added. (shouldBe): (i.array.push.new.Promise): (i.array.i.then): * stress/promise-capability-slow-path.js: Added. (shouldBe): (Promise.prototype.then): (i.array.push.new.Promise): (i.array.i.then): * stress/promise-capability-then-slow-path.js: Added. (shouldBe): (DerivedPromise): (DerivedPromise.prototype.then): (i.array.push.new.DerivedPromise): (i.array.i.then): * stress/promise-constructor-inlined.js: Added. (shouldBe): (i.array.push.new.Promise): (Promise.all.array.then): * stress/promise-constructor-transition-from-new-promise-to-create-promise.js: Added. (shouldBe): (DerivedPromise): (DerivedPromise2): (i.array.push.new.DerivedPromise): (i.array2.push.new.DerivedPromise2): * stress/without-promise-functions.js: Added. (shouldBe): (async): LayoutTests/imported/w3c: * web-platform-tests/html/browsers/origin/cross-origin-objects/cross-origin-objects-expected.txt: Source/JavaScriptCore: This is the major change of the Promise implementation and it improves JetStream2/async-fs by 62%. 1. Make JSPromise C++ friendly Instead of using objects with private properties (properties with private symbols), we put internal fields in JSPromise. This avoids allocating unnecessary butterflies for these private fields, and makes allocating JSPromise and accessing these fields from C++ easy. Moreover, this patch reduces # of fields of JSPromise from 4 to 2 to make JSPromise compact. To access these internal fields efficiently from JS, we add `op_get_promise_internal_field` and `op_put_promise_internal_field` bytecodes, and corresponding DFG/FTL supports. They are similar to GetClosureVar / PutClosureVar implementation. These two bytecodes are intentionally generic to later expand this support to generator and async-generator by renaming them to `op_get_internal_field` and `op_put_internal_field`. It is filed in [1]. We also add JSPromiseType as JSType. And structures for JSPromise should have that. So that now `@isPromise` is efficiently implemented. This also requires adding SpecPromiseObject and PromiseObjectUse to DFG. Further, by introducing another bit flag representing `alreadyResolved` to JSPromise's flags, we can remove JSPromiseDeferred. This extension is filed in [2]. 2. Make JSPromise constructor JS friendly The old JSPromise constructor was very inefficient: JSPromise constructor is InternalFunction in C++, and in it, it calls `initializePromise` JS function. And this `initializePromise` function invokes `executor` function passed by user program. If we can implement JSPromise constructor fully in JS, we can recognize `executor` and we have a chance to fully inline them. Unfortunately, we cannot inline JSPromise constructor for now since it takes 120 bytecode cost while our inlining threshold for construct is 100. We might want to investigate getting it inlined in the future[3]. We can avoid C++ <-> JS dance in such an important operation, allocating JSPromise. This patch introduces @nakedConstructor annotation to builtin JS. And this is propagated as `ConstructorKind::Naked`. If this kind is attached, the bytecode generator do not emit `op_create_this` implicitly and the constructor does not return `this` object implicitly. The naked constructor allows us to emit bare-metal bytecode, specifically necessary to allocate non-final JSObject from JS constructor. We introduce op_create_promise, which is similar to op_create_this, but it allocates JSPromise. And by using @createPromise bytecode intrinsic, we implement JSPromise constructor fully in JS. With this, we can start introducing object-allocation-sinking for JSPromise too. It is filed in [4]. 3. DFG supports for JSPromise operations This patch adds four DFG nodes, CreatePromise, NewPromise, GetPromiseInternalField, and PutPromiseInternalField. CreatePromise mimics CreateThis, and NewPromise mimics NewObject. CreatePromise can be converted to NewPromise with some condition checks and NewPromise can efficiently allocate promises. CreatePromise and NewPromise have `isInternalPromise` flag so that InternalPromise is also correctly handled in DFG. When converting CreatePromise to NewPromise, we need to get the correct structure with a specified `callee.prototype`. We mimic the mechanism used in CreateThis, but we use InternalFunctionAllocationProfile instead of ObjectAllocationProfile because (1) InternalFunctionAllocationProfile can handle non-final JSObjects and (2) we do not need to handle inline-capacity for promises. To make InternalFunctionAllocationProfile usable in DFG, we connect watchpoint to InternalFunctionAllocationProfile's invalidation so that DFG code can notice when InternalFunctionAllocationProfile's structure is invalidated: `callee.prototype` is replaced. 4. Avoid creating unnecessary promises Some promises are never shown to users, and they are never rejected. One example is `await`'s promise. And some of promise creation can be avoided. For example, when resolving a value with `Promise.resolve`, if a value is promise and if it's `then` method is the builtin `then`, we can avoid creating intermediate promise. To handle these things well, we introduce `@resolveWithoutPromise`, `@rejectWithoutPromise`, and `@fulfillWithoutPromise`. They take `onFulfilled` and `onRejected` handlers and they do not need an intermediate promise for resolving. This removes internal promise allocations in major cases and makes promise / async-functions efficient. And we also expose builtin `then` function as `@then`, and insert `@isPromise(xxx) && then === @then` check to take a fast path. We introduced four types of promise reactions to avoid some of object allocations. And microtask reaction is handling these four types. 5. Avoid creating resolving-functions and promise capabilities Resolving functions have `alreadyResolved` flag to prevent calling `resolve` and `reject` multiple times. For the first resolving function creation, this patch embeds one bit flag to JSPromise itself which indicates `alreadyResolved` in the first created resolving functions (resolving functions can be later created again for the same promise. In that case, we just create a usual resolving functions). By doing so, we avoid unnecessary resolving functions and promise capability allocations. We introduce a wrapper function `@resolvePromiseWithFirstResolvingFunctionCallCheck` and `@rejectPromiseWithFirstResolvingFunctionCallCheck`. The resolving functions which are first created with `@newPromiseCapability` can be mechanically replaced with the calls to these functions, e.g. replacing `promiseCapability.@resolve.@call(@undefined, value)` with `@resolvePromiseWithFirstResolvingFunctionCallCheck(promise, value)`. This mechanism will be used to drop JSPromiseDeferred in a separate patch. JetStream2/async-fs results. ToT: Running async-fs: Startup: 116.279 Worst Case: 151.515 Average: 176.630 Score: 145.996 Wall time: 0:01.149 Patched: Running async-fs: Startup: 166.667 Worst Case: 267.857 Average: 299.080 Score: 237.235 Wall time: 0:00.683 [1]: https://bugs.webkit.org/show_bug.cgi?id=201159 [2]: https://bugs.webkit.org/show_bug.cgi?id=201160 [3]: https://bugs.webkit.org/show_bug.cgi?id=201452 [4]: https://bugs.webkit.org/show_bug.cgi?id=201158 * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * Scripts/wkbuiltins/builtins_generate_combined_header.py: (ConstructAbility): (ConstructorKind): * Scripts/wkbuiltins/builtins_generate_separate_header.py: * Scripts/wkbuiltins/builtins_generator.py: (BuiltinsGenerator.generate_embedded_code_data_for_function): (BuiltinsGenerator.generate_embedded_code_string_section_for_data): * Scripts/wkbuiltins/builtins_model.py: (BuiltinFunction.__init__): (BuiltinFunction.fromString): * Scripts/wkbuiltins/builtins_templates.py: * builtins/AsyncFromSyncIteratorPrototype.js: (next.try): (next): (return.try): (return): (throw.try): (throw): * builtins/AsyncFunctionPrototype.js: (globalPrivate.asyncFunctionResume): * builtins/AsyncGeneratorPrototype.js: (globalPrivate.asyncGeneratorQueueIsEmpty): (globalPrivate.asyncGeneratorQueueEnqueue): (globalPrivate.asyncGeneratorQueueDequeue): (globalPrivate.asyncGeneratorReject): (globalPrivate.asyncGeneratorResolve): (globalPrivate.asyncGeneratorYield): (onRejected): (globalPrivate.awaitValue): (onFulfilled): (globalPrivate.doAsyncGeneratorBodyCall): (globalPrivate.asyncGeneratorResumeNext): (globalPrivate.asyncGeneratorEnqueue): (globalPrivate.asyncGeneratorDequeue): Deleted. (const.onRejected): Deleted. (const.onFulfilled): Deleted. (globalPrivate.asyncGeneratorResumeNext.): Deleted. * builtins/BuiltinExecutableCreator.h: * builtins/BuiltinExecutables.cpp: (JSC::BuiltinExecutables::defaultConstructorSourceCode): (JSC::BuiltinExecutables::createDefaultConstructor): (JSC::BuiltinExecutables::createBuiltinExecutable): (JSC::BuiltinExecutables::createExecutable): (JSC::createBuiltinExecutable): Deleted. * builtins/BuiltinExecutables.h: * builtins/BuiltinNames.h: * builtins/BuiltinUtils.h: * builtins/ModuleLoader.js: (forceFulfillPromise): * builtins/PromiseConstructor.js: (nakedConstructor.Promise.resolve): (nakedConstructor.Promise.reject): (nakedConstructor.Promise): (nakedConstructor.InternalPromise.resolve): (nakedConstructor.InternalPromise.reject): (nakedConstructor.InternalPromise): * builtins/PromiseOperations.js: (globalPrivate.newPromiseReaction): (globalPrivate.newPromiseCapability): (globalPrivate.newHandledRejectedPromise): (globalPrivate.triggerPromiseReactions): (globalPrivate.resolvePromise): (globalPrivate.rejectPromise): (globalPrivate.fulfillPromise): (globalPrivate.resolvePromiseWithFirstResolvingFunctionCallCheck): (globalPrivate.rejectPromiseWithFirstResolvingFunctionCallCheck): (globalPrivate.createResolvingFunctions.resolve): (globalPrivate.createResolvingFunctions.reject): (globalPrivate.createResolvingFunctions): (globalPrivate.promiseReactionJobWithoutPromise): (globalPrivate.resolveWithoutPromise): (globalPrivate.rejectWithoutPromise): (globalPrivate.fulfillWithoutPromise): (resolve): (reject): (globalPrivate.createResolvingFunctionsWithoutPromise): (globalPrivate.promiseReactionJob): (globalPrivate.promiseResolveThenableJobFast): (globalPrivate.promiseResolveThenableJobWithoutPromiseFast): (globalPrivate.promiseResolveThenableJob): (globalPrivate.isPromise): Deleted. (globalPrivate.newPromiseCapability.executor): Deleted. (globalPrivate.initializePromise): Deleted. * builtins/PromisePrototype.js: (then): * bytecode/BytecodeIntrinsicRegistry.cpp: (JSC::BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry): * bytecode/BytecodeIntrinsicRegistry.h: * bytecode/BytecodeList.rb: * bytecode/BytecodeUseDef.h: (JSC::computeUsesForBytecodeOffset): (JSC::computeDefsForBytecodeOffset): * bytecode/CodeBlock.cpp: (JSC::CodeBlock::finishCreation): (JSC::CodeBlock::finalizeLLIntInlineCaches): * bytecode/Opcode.h: * bytecode/SpeculatedType.cpp: (JSC::dumpSpeculation): (JSC::speculationFromClassInfo): (JSC::speculationFromJSType): (JSC::speculationFromString): * bytecode/SpeculatedType.h: * bytecode/UnlinkedFunctionExecutable.h: * bytecompiler/BytecodeGenerator.cpp: (JSC::BytecodeGenerator::generate): (JSC::BytecodeGenerator::BytecodeGenerator): (JSC::BytecodeGenerator::emitGetPromiseInternalField): (JSC::BytecodeGenerator::emitPutPromiseInternalField): (JSC::BytecodeGenerator::emitCreatePromise): (JSC::BytecodeGenerator::emitNewPromise): (JSC::BytecodeGenerator::emitReturn): * bytecompiler/BytecodeGenerator.h: (JSC::BytecodeGenerator::promiseRegister): (JSC::BytecodeGenerator::emitIsPromise): (JSC::BytecodeGenerator::promiseCapabilityRegister): Deleted. * bytecompiler/NodesCodegen.cpp: (JSC::promiseInternalFieldIndex): (JSC::BytecodeIntrinsicNode::emit_intrinsic_getPromiseInternalField): (JSC::BytecodeIntrinsicNode::emit_intrinsic_putPromiseInternalField): (JSC::BytecodeIntrinsicNode::emit_intrinsic_isPromise): (JSC::BytecodeIntrinsicNode::emit_intrinsic_createPromise): (JSC::BytecodeIntrinsicNode::emit_intrinsic_newPromise): (JSC::FunctionNode::emitBytecode): * dfg/DFGAbstractHeap.h: * dfg/DFGAbstractInterpreterInlines.h: (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): * dfg/DFGByteCodeParser.cpp: (JSC::DFG::ByteCodeParser::parseBlock): * dfg/DFGCapabilities.cpp: (JSC::DFG::capabilityLevel): * dfg/DFGClobberize.h: (JSC::DFG::clobberize): * dfg/DFGClobbersExitState.cpp: (JSC::DFG::clobbersExitState): * dfg/DFGConstantFoldingPhase.cpp: (JSC::DFG::ConstantFoldingPhase::foldConstants): * dfg/DFGDoesGC.cpp: (JSC::DFG::doesGC): * dfg/DFGFixupPhase.cpp: (JSC::DFG::FixupPhase::fixupNode): * dfg/DFGGraph.cpp: (JSC::DFG::Graph::dump): * dfg/DFGHeapLocation.cpp: (WTF::printInternal): * dfg/DFGHeapLocation.h: * dfg/DFGMayExit.cpp: * dfg/DFGNode.h: (JSC::DFG::Node::convertToNewPromise): (JSC::DFG::Node::hasIsInternalPromise): (JSC::DFG::Node::isInternalPromise): (JSC::DFG::Node::hasInternalFieldIndex): (JSC::DFG::Node::internalFieldIndex): (JSC::DFG::Node::hasHeapPrediction): (JSC::DFG::Node::hasStructure): * dfg/DFGNodeType.h: * dfg/DFGOperations.cpp: * dfg/DFGOperations.h: * dfg/DFGPredictionPropagationPhase.cpp: * dfg/DFGPromotedHeapLocation.cpp: (WTF::printInternal): * dfg/DFGPromotedHeapLocation.h: * dfg/DFGSafeToExecute.h: (JSC::DFG::SafeToExecuteEdge::operator()): (JSC::DFG::safeToExecute): * dfg/DFGSpeculativeJIT.cpp: (JSC::DFG::SpeculativeJIT::compileNewFunctionCommon): (JSC::DFG::SpeculativeJIT::speculatePromiseObject): (JSC::DFG::SpeculativeJIT::speculate): (JSC::DFG::SpeculativeJIT::compileGetPromiseInternalField): (JSC::DFG::SpeculativeJIT::compilePutPromiseInternalField): (JSC::DFG::SpeculativeJIT::compileCreatePromise): (JSC::DFG::SpeculativeJIT::compileNewPromise): * dfg/DFGSpeculativeJIT.h: * dfg/DFGSpeculativeJIT32_64.cpp: (JSC::DFG::SpeculativeJIT::compile): * dfg/DFGSpeculativeJIT64.cpp: (JSC::DFG::SpeculativeJIT::compile): * dfg/DFGStoreBarrierInsertionPhase.cpp: * dfg/DFGUseKind.cpp: (WTF::printInternal): * dfg/DFGUseKind.h: (JSC::DFG::typeFilterFor): (JSC::DFG::isCell): * ftl/FTLAbstractHeapRepository.h: * ftl/FTLCapabilities.cpp: (JSC::FTL::canCompile): * ftl/FTLLowerDFGToB3.cpp: (JSC::FTL::DFG::LowerDFGToB3::compileNode): (JSC::FTL::DFG::LowerDFGToB3::compileNewFunction): (JSC::FTL::DFG::LowerDFGToB3::compileNewPromise): (JSC::FTL::DFG::LowerDFGToB3::compileCreatePromise): (JSC::FTL::DFG::LowerDFGToB3::compileGetPromiseInternalField): (JSC::FTL::DFG::LowerDFGToB3::compilePutPromiseInternalField): (JSC::FTL::DFG::LowerDFGToB3::speculate): (JSC::FTL::DFG::LowerDFGToB3::speculatePromiseObject): * jit/JIT.cpp: (JSC::JIT::privateCompileMainPass): (JSC::JIT::privateCompileSlowCases): * jit/JIT.h: * jit/JITOperations.cpp: * jit/JITOperations.h: * jit/JITPropertyAccess.cpp: (JSC::JIT::emit_op_get_promise_internal_field): (JSC::JIT::emit_op_put_promise_internal_field): * jit/JITPropertyAccess32_64.cpp: (JSC::JIT::emit_op_get_promise_internal_field): (JSC::JIT::emit_op_put_promise_internal_field): * llint/LowLevelInterpreter.asm: * llint/LowLevelInterpreter32_64.asm: * llint/LowLevelInterpreter64.asm: * parser/Parser.cpp: (JSC::Parser<LexerType>::Parser): (JSC::Parser<LexerType>::parseFunctionInfo): * parser/Parser.h: (JSC::parse): * parser/ParserModes.h: * runtime/CommonSlowPaths.cpp: (JSC::SLOW_PATH_DECL): * runtime/CommonSlowPaths.h: * runtime/ConstructAbility.h: * runtime/ConstructorKind.h: Copied from Source/JavaScriptCore/runtime/ConstructAbility.h. * runtime/FunctionRareData.cpp: (JSC::FunctionRareData::FunctionRareData): (JSC::FunctionRareData::initializeObjectAllocationProfile): (JSC::FunctionRareData::clear): * runtime/FunctionRareData.h: * runtime/InternalFunction.cpp: (JSC::InternalFunction::createSubclassStructureSlow): * runtime/InternalFunction.h: (JSC::InternalFunction::createSubclassStructure): * runtime/JSCast.h: * runtime/JSGlobalObject.cpp: (JSC::enqueueJob): (JSC::JSGlobalObject::init): (JSC::JSGlobalObject::visitChildren): * runtime/JSGlobalObject.h: (JSC::JSGlobalObject::arrayProtoValuesFunction const): (JSC::JSGlobalObject::promiseProtoThenFunction const): (JSC::JSGlobalObject::initializePromiseFunction const): Deleted. * runtime/JSInternalPromise.cpp: (JSC::JSInternalPromise::createStructure): * runtime/JSInternalPromiseConstructor.cpp: (JSC::JSInternalPromiseConstructor::create): (JSC::JSInternalPromiseConstructor::createStructure): (JSC::JSInternalPromiseConstructor::JSInternalPromiseConstructor): (JSC::constructPromise): Deleted. * runtime/JSInternalPromiseConstructor.h: * runtime/JSInternalPromisePrototype.cpp: (JSC::JSInternalPromisePrototype::create): * runtime/JSMicrotask.cpp: (JSC::createJSMicrotask): (JSC::JSMicrotask::run): * runtime/JSMicrotask.h: * runtime/JSPromise.cpp: (JSC::JSPromise::createStructure): (JSC::JSPromise::finishCreation): (JSC::JSPromise::visitChildren): (JSC::JSPromise::status const): (JSC::JSPromise::result const): (JSC::JSPromise::isHandled const): (JSC::JSPromise::initialize): Deleted. * runtime/JSPromise.h: (JSC::JSPromise::allocationSize): (JSC::JSPromise::offsetOfInternalFields): (JSC::JSPromise::offsetOfInternalField): * runtime/JSPromiseConstructor.cpp: (JSC::JSPromiseConstructor::create): (JSC::JSPromiseConstructor::createStructure): (JSC::JSPromiseConstructor::JSPromiseConstructor): (JSC::JSPromiseConstructor::finishCreation): (JSC::constructPromise): Deleted. (JSC::callPromise): Deleted. * runtime/JSPromiseConstructor.h: * runtime/JSPromisePrototype.cpp: (JSC::JSPromisePrototype::create): (JSC::JSPromisePrototype::finishCreation): (JSC::JSPromisePrototype::addOwnInternalSlots): * runtime/JSPromisePrototype.h: * runtime/JSType.cpp: (WTF::printInternal): * runtime/JSType.h: Source/WebCore: * Modules/streams/ReadableStream.js: (pipeThrough): * Modules/streams/ReadableStreamInternals.js: (readableStreamError): (readableStreamReaderGenericRelease): LayoutTests: * inspector/canvas/recording-bitmaprenderer-frameCount-expected.txt: * inspector/canvas/recording-bitmaprenderer-full-expected.txt: * inspector/canvas/recording-bitmaprenderer-memoryLimit-expected.txt: * inspector/console/message-stack-trace-expected.txt: * inspector/console/queryHolders-expected.txt: * js/Promise-types-expected.txt: * js/dom/Promise-resolve-with-itself-expected.txt: * js/dom/Promise-resolve-with-itself.html: * js/script-tests/Promise-types.js: Canonical link: https://commits.webkit.org/215115@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249509 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-09-05 01:23:46 +00:00
PASS Promise(function(resolve, reject) { resolve(1); }) threw exception TypeError: Cannot call a constructor without |new|.
Add support for Promises https://bugs.webkit.org/show_bug.cgi?id=120260 Reviewed by Darin Adler. Source/JavaScriptCore: Add an initial implementation of Promises - http://dom.spec.whatwg.org/#promises. - Despite Promises being defined in the DOM, the implementation is being put in JSC in preparation for the Promises eventually being defined in ECMAScript. * CMakeLists.txt: * DerivedSources.make: * DerivedSources.pri: * GNUmakefile.list.am: * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: * JavaScriptCore.xcodeproj/project.pbxproj: * Target.pri: Add new files. * jsc.cpp: Update jsc's GlobalObjectMethodTable to stub out the new QueueTaskToEventLoop callback. This mean's you can't quite use Promises with with the command line tool yet. * interpreter/CallFrame.h: (JSC::ExecState::promisePrototypeTable): (JSC::ExecState::promiseConstructorTable): (JSC::ExecState::promiseResolverPrototypeTable): * runtime/VM.cpp: (JSC::VM::VM): (JSC::VM::~VM): * runtime/VM.h: Add supporting code for the new static lookup tables. * runtime/CommonIdentifiers.h: Add 3 new identifiers, "Promise", "PromiseResolver", and "then". * runtime/JSGlobalObject.cpp: (JSC::JSGlobalObject::reset): (JSC::JSGlobalObject::visitChildren): Add supporting code Promise and PromiseResolver's constructors and structures. * runtime/JSGlobalObject.h: (JSC::TaskContext::~TaskContext): Add a new callback to the GlobalObjectMethodTable to post a task on the embedder's runloop. (JSC::JSGlobalObject::promisePrototype): (JSC::JSGlobalObject::promiseResolverPrototype): (JSC::JSGlobalObject::promiseStructure): (JSC::JSGlobalObject::promiseResolverStructure): (JSC::JSGlobalObject::promiseCallbackStructure): (JSC::JSGlobalObject::promiseWrapperCallbackStructure): Add supporting code Promise and PromiseResolver's constructors and structures. * runtime/JSPromise.cpp: Added. * runtime/JSPromise.h: Added. * runtime/JSPromiseCallback.cpp: Added. * runtime/JSPromiseCallback.h: Added. * runtime/JSPromiseConstructor.cpp: Added. * runtime/JSPromiseConstructor.h: Added. * runtime/JSPromisePrototype.cpp: Added. * runtime/JSPromisePrototype.h: Added. * runtime/JSPromiseResolver.cpp: Added. * runtime/JSPromiseResolver.h: Added. * runtime/JSPromiseResolverConstructor.cpp: Added. * runtime/JSPromiseResolverConstructor.h: Added. * runtime/JSPromiseResolverPrototype.cpp: Added. * runtime/JSPromiseResolverPrototype.h: Added. Add Promise implementation. Source/WebCore: Add an initial implementation of Promises - http://dom.spec.whatwg.org/#promises. - Despite Promises being defined in the DOM, the implementation is being put in JSC in preparation for the Promises eventually being defined in ECMAScript. Tests: fast/js/Promise-already-fulfilled.html fast/js/Promise-already-rejected.html fast/js/Promise-already-resolved.html fast/js/Promise-catch-in-workers.html fast/js/Promise-catch.html fast/js/Promise-chain.html fast/js/Promise-exception.html fast/js/Promise-fulfill-in-workers.html fast/js/Promise-fulfill.html fast/js/Promise-init-in-workers.html fast/js/Promise-init.html fast/js/Promise-reject-in-workers.html fast/js/Promise-reject.html fast/js/Promise-resolve-chain.html fast/js/Promise-resolve-in-workers.html fast/js/Promise-resolve-with-then-exception.html fast/js/Promise-resolve-with-then-fulfill.html fast/js/Promise-resolve-with-then-reject.html fast/js/Promise-resolve.html fast/js/Promise-simple-fulfill-inside-callback.html fast/js/Promise-simple-fulfill.html fast/js/Promise-simple-in-workers.html fast/js/Promise-simple.html fast/js/Promise-static-fulfill.html fast/js/Promise-static-reject.html fast/js/Promise-static-resolve.html fast/js/Promise-then-in-workers.html fast/js/Promise-then-without-callbacks-in-workers.html fast/js/Promise-then-without-callbacks.html fast/js/Promise-then.html fast/js/Promise-types.html fast/js/Promise.html * GNUmakefile.list.am: * Target.pri: * UseJSC.cmake: * WebCore.vcxproj/WebCore.vcxproj: * WebCore.vcxproj/WebCore.vcxproj.filters: * WebCore.xcodeproj/project.pbxproj: * bindings/js/JSBindingsAllInOne.cpp: Add new files. * bindings/js/JSDOMGlobalObjectTask.cpp: Added. (WebCore::JSGlobalObjectCallback::create): (WebCore::JSGlobalObjectCallback::~JSGlobalObjectCallback): (WebCore::JSGlobalObjectCallback::call): (WebCore::JSGlobalObjectCallback::JSGlobalObjectCallback): (WebCore::JSGlobalObjectTask::JSGlobalObjectTask): (WebCore::JSGlobalObjectTask::~JSGlobalObjectTask): (WebCore::JSGlobalObjectTask::performTask): * bindings/js/JSDOMGlobalObjectTask.h: Added. (WebCore::JSGlobalObjectTask::create): Add a new task type to be used with the GlobalObjectMethodTable's new QueueTaskToEventLoop callback. * bindings/js/JSDOMWindowBase.cpp: (WebCore::JSDOMWindowBase::queueTaskToEventLoop): * bindings/js/JSDOMWindowBase.h: Implement the GlobalObjectMethodTable callback, QueueTaskToEventLoop. * bindings/js/JSMainThreadExecState.h: All using JSMainThreadExecState as a simple RAII object. * bindings/js/JSWorkerGlobalScopeBase.cpp: (WebCore::JSWorkerGlobalScopeBase::JSWorkerGlobalScopeBase): (WebCore::JSWorkerGlobalScopeBase::allowsAccessFrom): (WebCore::JSWorkerGlobalScopeBase::supportsProfiling): (WebCore::JSWorkerGlobalScopeBase::supportsRichSourceInfo): (WebCore::JSWorkerGlobalScopeBase::shouldInterruptScript): (WebCore::JSWorkerGlobalScopeBase::javaScriptExperimentsEnabled): (WebCore::JSWorkerGlobalScopeBase::queueTaskToEventLoop): * bindings/js/JSWorkerGlobalScopeBase.h: Add a GlobalObjectMethodTable and implement QueueTaskToEventLoop. Forward the other callbacks to JSGlobalObject so they retain their existing behavior. LayoutTests: Add tests adapted from the Mozilla and Blink projects. * fast/js/Promise-already-fulfilled-expected.txt: Added. * fast/js/Promise-already-fulfilled.html: Added. * fast/js/Promise-already-rejected-expected.txt: Added. * fast/js/Promise-already-rejected.html: Added. * fast/js/Promise-already-resolved-expected.txt: Added. * fast/js/Promise-already-resolved.html: Added. * fast/js/Promise-catch-expected.txt: Added. * fast/js/Promise-catch-in-workers-expected.txt: Added. * fast/js/Promise-catch-in-workers.html: Added. * fast/js/Promise-catch.html: Added. * fast/js/Promise-chain-expected.txt: Added. * fast/js/Promise-chain.html: Added. * fast/js/Promise-exception-expected.txt: Added. * fast/js/Promise-exception.html: Added. * fast/js/Promise-expected.txt: Added. * fast/js/Promise-fulfill-expected.txt: Added. * fast/js/Promise-fulfill-in-workers-expected.txt: Added. * fast/js/Promise-fulfill-in-workers.html: Added. * fast/js/Promise-fulfill.html: Added. * fast/js/Promise-init-expected.txt: Added. * fast/js/Promise-init-in-workers-expected.txt: Added. * fast/js/Promise-init-in-workers.html: Added. * fast/js/Promise-init.html: Added. * fast/js/Promise-reject-expected.txt: Added. * fast/js/Promise-reject-in-workers-expected.txt: Added. * fast/js/Promise-reject-in-workers.html: Added. * fast/js/Promise-reject.html: Added. * fast/js/Promise-resolve-chain-expected.txt: Added. * fast/js/Promise-resolve-chain.html: Added. * fast/js/Promise-resolve-expected.txt: Added. * fast/js/Promise-resolve-in-workers-expected.txt: Added. * fast/js/Promise-resolve-in-workers.html: Added. * fast/js/Promise-resolve-with-then-exception-expected.txt: Added. * fast/js/Promise-resolve-with-then-exception.html: Added. * fast/js/Promise-resolve-with-then-fulfill-expected.txt: Added. * fast/js/Promise-resolve-with-then-fulfill.html: Added. * fast/js/Promise-resolve-with-then-reject-expected.txt: Added. * fast/js/Promise-resolve-with-then-reject.html: Added. * fast/js/Promise-resolve.html: Added. * fast/js/Promise-simple-expected.txt: Added. * fast/js/Promise-simple-fulfill-expected.txt: Added. * fast/js/Promise-simple-fulfill-inside-callback-expected.txt: Added. * fast/js/Promise-simple-fulfill-inside-callback.html: Added. * fast/js/Promise-simple-fulfill.html: Added. * fast/js/Promise-simple-in-workers-expected.txt: Added. * fast/js/Promise-simple-in-workers.html: Added. * fast/js/Promise-simple.html: Added. * fast/js/Promise-static-fulfill-expected.txt: Added. * fast/js/Promise-static-fulfill.html: Added. * fast/js/Promise-static-reject-expected.txt: Added. * fast/js/Promise-static-reject.html: Added. * fast/js/Promise-static-resolve-expected.txt: Added. * fast/js/Promise-static-resolve.html: Added. * fast/js/Promise-then-expected.txt: Added. * fast/js/Promise-then-in-workers-expected.txt: Added. * fast/js/Promise-then-in-workers.html: Added. * fast/js/Promise-then-without-callbacks-expected.txt: Added. * fast/js/Promise-then-without-callbacks-in-workers-expected.txt: Added. * fast/js/Promise-then-without-callbacks-in-workers.html: Added. * fast/js/Promise-then-without-callbacks.html: Added. * fast/js/Promise-then.html: Added. * fast/js/Promise-types-expected.txt: Added. * fast/js/Promise-types.html: Added. * fast/js/Promise.html: Added. * fast/js/resources/Promise-catch-in-workers.js: Added. * fast/js/resources/Promise-fulfill-in-workers.js: Added. * fast/js/resources/Promise-init-in-workers.js: Added. * fast/js/resources/Promise-reject-in-workers.js: Added. * fast/js/resources/Promise-resolve-in-workers.js: Added. * fast/js/resources/Promise-simple-in-workers.js: Added. * fast/js/resources/Promise-then-in-workers.js: Added. * fast/js/resources/Promise-then-without-callbacks-in-workers.js: Added. Canonical link: https://commits.webkit.org/138280@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@154629 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2013-08-26 19:19:50 +00:00
Promise constructor
PASS Promise.length is 1
Update Promises to the https://github.com/domenic/promises-unwrapping spec https://bugs.webkit.org/show_bug.cgi?id=120954 Reviewed by Filip Pizlo. Source/JavaScriptCore: Update Promises to the revised spec. Notable changes: - JSPromiseResolver is gone. - TaskContext has been renamed Microtask and now has a virtual run() function. - Instead of using custom InternalFunction subclasses, JSFunctions are used with PrivateName properties for internal slots. * CMakeLists.txt: * DerivedSources.make: * GNUmakefile.list.am: * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: * JavaScriptCore.xcodeproj/project.pbxproj: * interpreter/CallFrame.h: (JSC::ExecState::promiseConstructorTable): * runtime/CommonIdentifiers.cpp: (JSC::CommonIdentifiers::CommonIdentifiers): * runtime/CommonIdentifiers.h: * runtime/JSGlobalObject.cpp: (JSC::JSGlobalObject::reset): (JSC::JSGlobalObject::visitChildren): (JSC::JSGlobalObject::queueMicrotask): * runtime/JSGlobalObject.h: (JSC::JSGlobalObject::promiseConstructor): (JSC::JSGlobalObject::promisePrototype): (JSC::JSGlobalObject::promiseStructure): * runtime/JSPromise.cpp: (JSC::JSPromise::create): (JSC::JSPromise::JSPromise): (JSC::JSPromise::finishCreation): (JSC::JSPromise::visitChildren): (JSC::JSPromise::reject): (JSC::JSPromise::resolve): (JSC::JSPromise::appendResolveReaction): (JSC::JSPromise::appendRejectReaction): (JSC::triggerPromiseReactions): * runtime/JSPromise.h: (JSC::JSPromise::status): (JSC::JSPromise::result): (JSC::JSPromise::constructor): * runtime/JSPromiseCallback.cpp: Removed. * runtime/JSPromiseCallback.h: Removed. * runtime/JSPromiseConstructor.cpp: (JSC::constructPromise): (JSC::JSPromiseConstructor::getCallData): (JSC::JSPromiseConstructorFuncCast): (JSC::JSPromiseConstructorFuncResolve): (JSC::JSPromiseConstructorFuncReject): * runtime/JSPromiseConstructor.h: * runtime/JSPromiseDeferred.cpp: Added. (JSC::JSPromiseDeferred::create): (JSC::JSPromiseDeferred::JSPromiseDeferred): (JSC::JSPromiseDeferred::finishCreation): (JSC::JSPromiseDeferred::visitChildren): (JSC::createJSPromiseDeferredFromConstructor): (JSC::updateDeferredFromPotentialThenable): * runtime/JSPromiseDeferred.h: Added. (JSC::JSPromiseDeferred::createStructure): (JSC::JSPromiseDeferred::promise): (JSC::JSPromiseDeferred::resolve): (JSC::JSPromiseDeferred::reject): * runtime/JSPromiseFunctions.cpp: Added. (JSC::deferredConstructionFunction): (JSC::createDeferredConstructionFunction): (JSC::identifyFunction): (JSC::createIdentifyFunction): (JSC::promiseAllCountdownFunction): (JSC::createPromiseAllCountdownFunction): (JSC::promiseResolutionHandlerFunction): (JSC::createPromiseResolutionHandlerFunction): (JSC::rejectPromiseFunction): (JSC::createRejectPromiseFunction): (JSC::resolvePromiseFunction): (JSC::createResolvePromiseFunction): (JSC::throwerFunction): (JSC::createThrowerFunction): * runtime/JSPromiseFunctions.h: Added. * runtime/JSPromisePrototype.cpp: (JSC::JSPromisePrototypeFuncThen): (JSC::JSPromisePrototypeFuncCatch): * runtime/JSPromiseReaction.cpp: Added. (JSC::createExecutePromiseReactionMicroTask): (JSC::ExecutePromiseReactionMicroTask::run): (JSC::JSPromiseReaction::create): (JSC::JSPromiseReaction::JSPromiseReaction): (JSC::JSPromiseReaction::finishCreation): (JSC::JSPromiseReaction::visitChildren): * runtime/JSPromiseReaction.h: Added. (JSC::JSPromiseReaction::createStructure): (JSC::JSPromiseReaction::deferred): (JSC::JSPromiseReaction::handler): * runtime/JSPromiseResolver.cpp: Removed. * runtime/JSPromiseResolver.h: Removed. * runtime/JSPromiseResolverConstructor.cpp: Removed. * runtime/JSPromiseResolverConstructor.h: Removed. * runtime/JSPromiseResolverPrototype.cpp: Removed. * runtime/JSPromiseResolverPrototype.h: Removed. * runtime/Microtask.h: Added. * runtime/VM.cpp: (JSC::VM::VM): (JSC::VM::~VM): * runtime/VM.h: Source/WebCore: * ForwardingHeaders/runtime/JSPromiseDeferred.h: Added. * ForwardingHeaders/runtime/JSPromiseResolver.h: Removed. * bindings/js/JSDOMGlobalObjectTask.cpp: (WebCore::JSGlobalObjectTask::JSGlobalObjectTask): * bindings/js/JSDOMGlobalObjectTask.h: * bindings/js/JSDOMPromise.cpp: (WebCore::DeferredWrapper::DeferredWrapper): (WebCore::DeferredWrapper::promise): (WebCore::DeferredWrapper::resolve): (WebCore::DeferredWrapper::reject): * bindings/js/JSDOMPromise.h: (WebCore::DeferredWrapper::resolve): (WebCore::DeferredWrapper::reject): (WebCore::DeferredWrapper::resolve<String>): (WebCore::DeferredWrapper::resolve<bool>): (WebCore::char>>): (WebCore::DeferredWrapper::reject<String>): * bindings/js/JSDOMWindowBase.cpp: (WebCore::JSDOMWindowBase::queueTaskToEventLoop): * bindings/js/JSDOMWindowBase.h: * bindings/js/JSSubtleCryptoCustom.cpp: (WebCore::JSSubtleCrypto::encrypt): (WebCore::JSSubtleCrypto::decrypt): (WebCore::JSSubtleCrypto::sign): (WebCore::JSSubtleCrypto::verify): (WebCore::JSSubtleCrypto::digest): (WebCore::JSSubtleCrypto::generateKey): (WebCore::JSSubtleCrypto::importKey): (WebCore::JSSubtleCrypto::exportKey): (WebCore::JSSubtleCrypto::wrapKey): (WebCore::JSSubtleCrypto::unwrapKey): * bindings/js/JSWorkerGlobalScopeBase.cpp: (WebCore::JSWorkerGlobalScopeBase::queueTaskToEventLoop): * bindings/js/JSWorkerGlobalScopeBase.h: LayoutTests: * crypto/subtle/argument-conversion.html: * crypto/subtle/resources/common.js: * crypto/subtle/sha-1.html: * crypto/subtle/sha-224.html: * crypto/subtle/sha-256.html: * crypto/subtle/sha-384.html: * crypto/subtle/sha-512.html: * js/dom/Promise-already-fulfilled-expected.txt: Removed. * js/dom/Promise-already-fulfilled.html: Removed. * js/dom/Promise-already-rejected.html: * js/dom/Promise-already-resolved.html: * js/dom/Promise-catch-expected.txt: * js/dom/Promise-catch-in-workers-expected.txt: * js/dom/Promise-catch.html: * js/dom/Promise-chain.html: * js/dom/Promise-exception-expected.txt: * js/dom/Promise-exception.html: * js/dom/Promise-expected.txt: * js/dom/Promise-fulfill-expected.txt: Removed. * js/dom/Promise-fulfill-in-workers-expected.txt: Removed. * js/dom/Promise-fulfill-in-workers.html: Removed. * js/dom/Promise-fulfill.html: Removed. * js/dom/Promise-init-callback-receiver-expected.txt: Added. * js/dom/Promise-init-callback-receiver.html: Added. * js/dom/Promise-init-expected.txt: * js/dom/Promise-init-in-workers-expected.txt: * js/dom/Promise-init.html: * js/dom/Promise-onFulfilled-deep-expected.txt: Added. * js/dom/Promise-onFulfilled-deep.html: Added. * js/dom/Promise-onRejected-deep-expected.txt: Added. * js/dom/Promise-onRejected-deep.html: Added. * js/dom/Promise-reject.html: * js/dom/Promise-resolve-chain.html: * js/dom/Promise-resolve-expected.txt: * js/dom/Promise-resolve-in-workers-expected.txt: * js/dom/Promise-resolve-state-expected.txt: Added. * js/dom/Promise-resolve-state-in-workers-expected.txt: Added. * js/dom/Promise-resolve-state-in-workers.html: Added. * js/dom/Promise-resolve-state.html: Added. * js/dom/Promise-resolve-with-itself-expected.txt: Added. * js/dom/Promise-resolve-with-itself.html: Added. * js/dom/Promise-resolve-with-then-exception.html: * js/dom/Promise-resolve-with-then-fulfill-expected.txt: * js/dom/Promise-resolve-with-then-fulfill.html: * js/dom/Promise-resolve-with-then-reject-expected.txt: * js/dom/Promise-resolve-with-then-reject.html: * js/dom/Promise-resolve.html: * js/dom/Promise-simple-expected.txt: * js/dom/Promise-simple-fulfill-expected.txt: Removed. * js/dom/Promise-simple-fulfill-inside-callback-expected.txt: Removed. * js/dom/Promise-simple-fulfill-inside-callback.html: Removed. * js/dom/Promise-simple-fulfill.html: Removed. * js/dom/Promise-simple-in-workers-expected.txt: * js/dom/Promise-simple-resolve-expected.txt: Added. * js/dom/Promise-simple-resolve.html: Added. * js/dom/Promise-simple.html: * js/dom/Promise-static-all-expected.txt: Added. * js/dom/Promise-static-all.html: Added. * js/dom/Promise-static-cast-expected.txt: Added. * js/dom/Promise-static-cast.html: Added. * js/dom/Promise-static-fulfill-expected.txt: Removed. * js/dom/Promise-static-fulfill.html: Removed. * js/dom/Promise-static-race-expected.txt: Added. * js/dom/Promise-static-race.html: Added. * js/dom/Promise-static-resolve.html: * js/dom/Promise-then-callback-receiver-expected.txt: Added. * js/dom/Promise-then-callback-receiver.html: Added. * js/dom/Promise-then-expected.txt: * js/dom/Promise-then-in-workers-expected.txt: * js/dom/Promise-then-without-callbacks.html: * js/dom/Promise-then.html: * js/dom/Promise-types-expected.txt: * js/dom/Promise-types.html: * js/dom/Promise.html: * js/resources/Promise-catch-in-workers.js: * js/resources/Promise-fulfill-in-workers.js: Removed. * js/resources/Promise-init-in-workers.js: * js/resources/Promise-reject-in-workers.js: * js/resources/Promise-resolve-in-workers.js: * js/resources/Promise-resolve-state-in-workers.js: Added. * js/resources/Promise-simple-in-workers.js: * js/resources/Promise-then-in-workers.js: * js/resources/Promise-then-without-callbacks-in-workers.js: Canonical link: https://commits.webkit.org/144312@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@161241 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2014-01-03 00:40:16 +00:00
PASS new Promise() threw exception TypeError: Promise constructor takes a function argument.
[JSC] Make Promise implementation faster https://bugs.webkit.org/show_bug.cgi?id=200898 Reviewed by Saam Barati. JSTests: * ChakraCore/test/UnitTestFramework/UnitTestFramework.js: (assert.assert.return.throws): * modules/breaking-builtin-promise-then-does-not-break-internal-promise.js: Added. * modules/breaking-builtin-promise-then-does-not-break-internal-promise/test.js: Added. * stress/constructor-kind-naked-should-not-be-applied-to-inner-functions.js: Added. (shouldThrow): (new.Promise): (shouldThrow.Promise): * stress/create-promise-should-respect-promise-realm.js: Added. (shouldBe): (other.new.OtherPromise): (DerivedOtherPromise): (i.promise.new.DerivedOtherPromise): (createPromise): * stress/derived-promise-constructor-class-syntax-prototype-replace-attempt.js: Added. (shouldBe): (DerivedPromise): (i.array.push.new.DerivedPromise): (promise.new.DerivedPromise): * stress/derived-promise-constructor-inlined.js: Added. (shouldBe): (DerivedPromise): (i.array.push.new.DerivedPromise): (DerivedPromise.all.array.then): * stress/derived-promise-prototype-replaced.js: Added. (shouldBe): (DerivedPromise): (i.array.push.new.DerivedPromise): (promise.new.DerivedPromise): * stress/internal-promise-constructor-not-confusing.js: Added. (shouldBe): (InternalPromise.vm.createBuiltin): (DerivedPromise): * stress/internal-promise-is-not-exposed.js: Added. (shouldBe): * stress/new-promise-should-respect-promise-realm.js: Added. (shouldBe): (other.new.OtherPromise): (createPromise): * stress/promise-cannot-be-called.js: (shouldThrow): * stress/promise-capability-fast-path.js: Added. (shouldBe): (i.array.push.new.Promise): (i.array.i.then): * stress/promise-capability-slow-path.js: Added. (shouldBe): (Promise.prototype.then): (i.array.push.new.Promise): (i.array.i.then): * stress/promise-capability-then-slow-path.js: Added. (shouldBe): (DerivedPromise): (DerivedPromise.prototype.then): (i.array.push.new.DerivedPromise): (i.array.i.then): * stress/promise-constructor-inlined.js: Added. (shouldBe): (i.array.push.new.Promise): (Promise.all.array.then): * stress/promise-constructor-transition-from-new-promise-to-create-promise.js: Added. (shouldBe): (DerivedPromise): (DerivedPromise2): (i.array.push.new.DerivedPromise): (i.array2.push.new.DerivedPromise2): * stress/without-promise-functions.js: Added. (shouldBe): (async): LayoutTests/imported/w3c: * web-platform-tests/html/browsers/origin/cross-origin-objects/cross-origin-objects-expected.txt: Source/JavaScriptCore: This is the major change of the Promise implementation and it improves JetStream2/async-fs by 62%. 1. Make JSPromise C++ friendly Instead of using objects with private properties (properties with private symbols), we put internal fields in JSPromise. This avoids allocating unnecessary butterflies for these private fields, and makes allocating JSPromise and accessing these fields from C++ easy. Moreover, this patch reduces # of fields of JSPromise from 4 to 2 to make JSPromise compact. To access these internal fields efficiently from JS, we add `op_get_promise_internal_field` and `op_put_promise_internal_field` bytecodes, and corresponding DFG/FTL supports. They are similar to GetClosureVar / PutClosureVar implementation. These two bytecodes are intentionally generic to later expand this support to generator and async-generator by renaming them to `op_get_internal_field` and `op_put_internal_field`. It is filed in [1]. We also add JSPromiseType as JSType. And structures for JSPromise should have that. So that now `@isPromise` is efficiently implemented. This also requires adding SpecPromiseObject and PromiseObjectUse to DFG. Further, by introducing another bit flag representing `alreadyResolved` to JSPromise's flags, we can remove JSPromiseDeferred. This extension is filed in [2]. 2. Make JSPromise constructor JS friendly The old JSPromise constructor was very inefficient: JSPromise constructor is InternalFunction in C++, and in it, it calls `initializePromise` JS function. And this `initializePromise` function invokes `executor` function passed by user program. If we can implement JSPromise constructor fully in JS, we can recognize `executor` and we have a chance to fully inline them. Unfortunately, we cannot inline JSPromise constructor for now since it takes 120 bytecode cost while our inlining threshold for construct is 100. We might want to investigate getting it inlined in the future[3]. We can avoid C++ <-> JS dance in such an important operation, allocating JSPromise. This patch introduces @nakedConstructor annotation to builtin JS. And this is propagated as `ConstructorKind::Naked`. If this kind is attached, the bytecode generator do not emit `op_create_this` implicitly and the constructor does not return `this` object implicitly. The naked constructor allows us to emit bare-metal bytecode, specifically necessary to allocate non-final JSObject from JS constructor. We introduce op_create_promise, which is similar to op_create_this, but it allocates JSPromise. And by using @createPromise bytecode intrinsic, we implement JSPromise constructor fully in JS. With this, we can start introducing object-allocation-sinking for JSPromise too. It is filed in [4]. 3. DFG supports for JSPromise operations This patch adds four DFG nodes, CreatePromise, NewPromise, GetPromiseInternalField, and PutPromiseInternalField. CreatePromise mimics CreateThis, and NewPromise mimics NewObject. CreatePromise can be converted to NewPromise with some condition checks and NewPromise can efficiently allocate promises. CreatePromise and NewPromise have `isInternalPromise` flag so that InternalPromise is also correctly handled in DFG. When converting CreatePromise to NewPromise, we need to get the correct structure with a specified `callee.prototype`. We mimic the mechanism used in CreateThis, but we use InternalFunctionAllocationProfile instead of ObjectAllocationProfile because (1) InternalFunctionAllocationProfile can handle non-final JSObjects and (2) we do not need to handle inline-capacity for promises. To make InternalFunctionAllocationProfile usable in DFG, we connect watchpoint to InternalFunctionAllocationProfile's invalidation so that DFG code can notice when InternalFunctionAllocationProfile's structure is invalidated: `callee.prototype` is replaced. 4. Avoid creating unnecessary promises Some promises are never shown to users, and they are never rejected. One example is `await`'s promise. And some of promise creation can be avoided. For example, when resolving a value with `Promise.resolve`, if a value is promise and if it's `then` method is the builtin `then`, we can avoid creating intermediate promise. To handle these things well, we introduce `@resolveWithoutPromise`, `@rejectWithoutPromise`, and `@fulfillWithoutPromise`. They take `onFulfilled` and `onRejected` handlers and they do not need an intermediate promise for resolving. This removes internal promise allocations in major cases and makes promise / async-functions efficient. And we also expose builtin `then` function as `@then`, and insert `@isPromise(xxx) && then === @then` check to take a fast path. We introduced four types of promise reactions to avoid some of object allocations. And microtask reaction is handling these four types. 5. Avoid creating resolving-functions and promise capabilities Resolving functions have `alreadyResolved` flag to prevent calling `resolve` and `reject` multiple times. For the first resolving function creation, this patch embeds one bit flag to JSPromise itself which indicates `alreadyResolved` in the first created resolving functions (resolving functions can be later created again for the same promise. In that case, we just create a usual resolving functions). By doing so, we avoid unnecessary resolving functions and promise capability allocations. We introduce a wrapper function `@resolvePromiseWithFirstResolvingFunctionCallCheck` and `@rejectPromiseWithFirstResolvingFunctionCallCheck`. The resolving functions which are first created with `@newPromiseCapability` can be mechanically replaced with the calls to these functions, e.g. replacing `promiseCapability.@resolve.@call(@undefined, value)` with `@resolvePromiseWithFirstResolvingFunctionCallCheck(promise, value)`. This mechanism will be used to drop JSPromiseDeferred in a separate patch. JetStream2/async-fs results. ToT: Running async-fs: Startup: 116.279 Worst Case: 151.515 Average: 176.630 Score: 145.996 Wall time: 0:01.149 Patched: Running async-fs: Startup: 166.667 Worst Case: 267.857 Average: 299.080 Score: 237.235 Wall time: 0:00.683 [1]: https://bugs.webkit.org/show_bug.cgi?id=201159 [2]: https://bugs.webkit.org/show_bug.cgi?id=201160 [3]: https://bugs.webkit.org/show_bug.cgi?id=201452 [4]: https://bugs.webkit.org/show_bug.cgi?id=201158 * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * Scripts/wkbuiltins/builtins_generate_combined_header.py: (ConstructAbility): (ConstructorKind): * Scripts/wkbuiltins/builtins_generate_separate_header.py: * Scripts/wkbuiltins/builtins_generator.py: (BuiltinsGenerator.generate_embedded_code_data_for_function): (BuiltinsGenerator.generate_embedded_code_string_section_for_data): * Scripts/wkbuiltins/builtins_model.py: (BuiltinFunction.__init__): (BuiltinFunction.fromString): * Scripts/wkbuiltins/builtins_templates.py: * builtins/AsyncFromSyncIteratorPrototype.js: (next.try): (next): (return.try): (return): (throw.try): (throw): * builtins/AsyncFunctionPrototype.js: (globalPrivate.asyncFunctionResume): * builtins/AsyncGeneratorPrototype.js: (globalPrivate.asyncGeneratorQueueIsEmpty): (globalPrivate.asyncGeneratorQueueEnqueue): (globalPrivate.asyncGeneratorQueueDequeue): (globalPrivate.asyncGeneratorReject): (globalPrivate.asyncGeneratorResolve): (globalPrivate.asyncGeneratorYield): (onRejected): (globalPrivate.awaitValue): (onFulfilled): (globalPrivate.doAsyncGeneratorBodyCall): (globalPrivate.asyncGeneratorResumeNext): (globalPrivate.asyncGeneratorEnqueue): (globalPrivate.asyncGeneratorDequeue): Deleted. (const.onRejected): Deleted. (const.onFulfilled): Deleted. (globalPrivate.asyncGeneratorResumeNext.): Deleted. * builtins/BuiltinExecutableCreator.h: * builtins/BuiltinExecutables.cpp: (JSC::BuiltinExecutables::defaultConstructorSourceCode): (JSC::BuiltinExecutables::createDefaultConstructor): (JSC::BuiltinExecutables::createBuiltinExecutable): (JSC::BuiltinExecutables::createExecutable): (JSC::createBuiltinExecutable): Deleted. * builtins/BuiltinExecutables.h: * builtins/BuiltinNames.h: * builtins/BuiltinUtils.h: * builtins/ModuleLoader.js: (forceFulfillPromise): * builtins/PromiseConstructor.js: (nakedConstructor.Promise.resolve): (nakedConstructor.Promise.reject): (nakedConstructor.Promise): (nakedConstructor.InternalPromise.resolve): (nakedConstructor.InternalPromise.reject): (nakedConstructor.InternalPromise): * builtins/PromiseOperations.js: (globalPrivate.newPromiseReaction): (globalPrivate.newPromiseCapability): (globalPrivate.newHandledRejectedPromise): (globalPrivate.triggerPromiseReactions): (globalPrivate.resolvePromise): (globalPrivate.rejectPromise): (globalPrivate.fulfillPromise): (globalPrivate.resolvePromiseWithFirstResolvingFunctionCallCheck): (globalPrivate.rejectPromiseWithFirstResolvingFunctionCallCheck): (globalPrivate.createResolvingFunctions.resolve): (globalPrivate.createResolvingFunctions.reject): (globalPrivate.createResolvingFunctions): (globalPrivate.promiseReactionJobWithoutPromise): (globalPrivate.resolveWithoutPromise): (globalPrivate.rejectWithoutPromise): (globalPrivate.fulfillWithoutPromise): (resolve): (reject): (globalPrivate.createResolvingFunctionsWithoutPromise): (globalPrivate.promiseReactionJob): (globalPrivate.promiseResolveThenableJobFast): (globalPrivate.promiseResolveThenableJobWithoutPromiseFast): (globalPrivate.promiseResolveThenableJob): (globalPrivate.isPromise): Deleted. (globalPrivate.newPromiseCapability.executor): Deleted. (globalPrivate.initializePromise): Deleted. * builtins/PromisePrototype.js: (then): * bytecode/BytecodeIntrinsicRegistry.cpp: (JSC::BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry): * bytecode/BytecodeIntrinsicRegistry.h: * bytecode/BytecodeList.rb: * bytecode/BytecodeUseDef.h: (JSC::computeUsesForBytecodeOffset): (JSC::computeDefsForBytecodeOffset): * bytecode/CodeBlock.cpp: (JSC::CodeBlock::finishCreation): (JSC::CodeBlock::finalizeLLIntInlineCaches): * bytecode/Opcode.h: * bytecode/SpeculatedType.cpp: (JSC::dumpSpeculation): (JSC::speculationFromClassInfo): (JSC::speculationFromJSType): (JSC::speculationFromString): * bytecode/SpeculatedType.h: * bytecode/UnlinkedFunctionExecutable.h: * bytecompiler/BytecodeGenerator.cpp: (JSC::BytecodeGenerator::generate): (JSC::BytecodeGenerator::BytecodeGenerator): (JSC::BytecodeGenerator::emitGetPromiseInternalField): (JSC::BytecodeGenerator::emitPutPromiseInternalField): (JSC::BytecodeGenerator::emitCreatePromise): (JSC::BytecodeGenerator::emitNewPromise): (JSC::BytecodeGenerator::emitReturn): * bytecompiler/BytecodeGenerator.h: (JSC::BytecodeGenerator::promiseRegister): (JSC::BytecodeGenerator::emitIsPromise): (JSC::BytecodeGenerator::promiseCapabilityRegister): Deleted. * bytecompiler/NodesCodegen.cpp: (JSC::promiseInternalFieldIndex): (JSC::BytecodeIntrinsicNode::emit_intrinsic_getPromiseInternalField): (JSC::BytecodeIntrinsicNode::emit_intrinsic_putPromiseInternalField): (JSC::BytecodeIntrinsicNode::emit_intrinsic_isPromise): (JSC::BytecodeIntrinsicNode::emit_intrinsic_createPromise): (JSC::BytecodeIntrinsicNode::emit_intrinsic_newPromise): (JSC::FunctionNode::emitBytecode): * dfg/DFGAbstractHeap.h: * dfg/DFGAbstractInterpreterInlines.h: (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): * dfg/DFGByteCodeParser.cpp: (JSC::DFG::ByteCodeParser::parseBlock): * dfg/DFGCapabilities.cpp: (JSC::DFG::capabilityLevel): * dfg/DFGClobberize.h: (JSC::DFG::clobberize): * dfg/DFGClobbersExitState.cpp: (JSC::DFG::clobbersExitState): * dfg/DFGConstantFoldingPhase.cpp: (JSC::DFG::ConstantFoldingPhase::foldConstants): * dfg/DFGDoesGC.cpp: (JSC::DFG::doesGC): * dfg/DFGFixupPhase.cpp: (JSC::DFG::FixupPhase::fixupNode): * dfg/DFGGraph.cpp: (JSC::DFG::Graph::dump): * dfg/DFGHeapLocation.cpp: (WTF::printInternal): * dfg/DFGHeapLocation.h: * dfg/DFGMayExit.cpp: * dfg/DFGNode.h: (JSC::DFG::Node::convertToNewPromise): (JSC::DFG::Node::hasIsInternalPromise): (JSC::DFG::Node::isInternalPromise): (JSC::DFG::Node::hasInternalFieldIndex): (JSC::DFG::Node::internalFieldIndex): (JSC::DFG::Node::hasHeapPrediction): (JSC::DFG::Node::hasStructure): * dfg/DFGNodeType.h: * dfg/DFGOperations.cpp: * dfg/DFGOperations.h: * dfg/DFGPredictionPropagationPhase.cpp: * dfg/DFGPromotedHeapLocation.cpp: (WTF::printInternal): * dfg/DFGPromotedHeapLocation.h: * dfg/DFGSafeToExecute.h: (JSC::DFG::SafeToExecuteEdge::operator()): (JSC::DFG::safeToExecute): * dfg/DFGSpeculativeJIT.cpp: (JSC::DFG::SpeculativeJIT::compileNewFunctionCommon): (JSC::DFG::SpeculativeJIT::speculatePromiseObject): (JSC::DFG::SpeculativeJIT::speculate): (JSC::DFG::SpeculativeJIT::compileGetPromiseInternalField): (JSC::DFG::SpeculativeJIT::compilePutPromiseInternalField): (JSC::DFG::SpeculativeJIT::compileCreatePromise): (JSC::DFG::SpeculativeJIT::compileNewPromise): * dfg/DFGSpeculativeJIT.h: * dfg/DFGSpeculativeJIT32_64.cpp: (JSC::DFG::SpeculativeJIT::compile): * dfg/DFGSpeculativeJIT64.cpp: (JSC::DFG::SpeculativeJIT::compile): * dfg/DFGStoreBarrierInsertionPhase.cpp: * dfg/DFGUseKind.cpp: (WTF::printInternal): * dfg/DFGUseKind.h: (JSC::DFG::typeFilterFor): (JSC::DFG::isCell): * ftl/FTLAbstractHeapRepository.h: * ftl/FTLCapabilities.cpp: (JSC::FTL::canCompile): * ftl/FTLLowerDFGToB3.cpp: (JSC::FTL::DFG::LowerDFGToB3::compileNode): (JSC::FTL::DFG::LowerDFGToB3::compileNewFunction): (JSC::FTL::DFG::LowerDFGToB3::compileNewPromise): (JSC::FTL::DFG::LowerDFGToB3::compileCreatePromise): (JSC::FTL::DFG::LowerDFGToB3::compileGetPromiseInternalField): (JSC::FTL::DFG::LowerDFGToB3::compilePutPromiseInternalField): (JSC::FTL::DFG::LowerDFGToB3::speculate): (JSC::FTL::DFG::LowerDFGToB3::speculatePromiseObject): * jit/JIT.cpp: (JSC::JIT::privateCompileMainPass): (JSC::JIT::privateCompileSlowCases): * jit/JIT.h: * jit/JITOperations.cpp: * jit/JITOperations.h: * jit/JITPropertyAccess.cpp: (JSC::JIT::emit_op_get_promise_internal_field): (JSC::JIT::emit_op_put_promise_internal_field): * jit/JITPropertyAccess32_64.cpp: (JSC::JIT::emit_op_get_promise_internal_field): (JSC::JIT::emit_op_put_promise_internal_field): * llint/LowLevelInterpreter.asm: * llint/LowLevelInterpreter32_64.asm: * llint/LowLevelInterpreter64.asm: * parser/Parser.cpp: (JSC::Parser<LexerType>::Parser): (JSC::Parser<LexerType>::parseFunctionInfo): * parser/Parser.h: (JSC::parse): * parser/ParserModes.h: * runtime/CommonSlowPaths.cpp: (JSC::SLOW_PATH_DECL): * runtime/CommonSlowPaths.h: * runtime/ConstructAbility.h: * runtime/ConstructorKind.h: Copied from Source/JavaScriptCore/runtime/ConstructAbility.h. * runtime/FunctionRareData.cpp: (JSC::FunctionRareData::FunctionRareData): (JSC::FunctionRareData::initializeObjectAllocationProfile): (JSC::FunctionRareData::clear): * runtime/FunctionRareData.h: * runtime/InternalFunction.cpp: (JSC::InternalFunction::createSubclassStructureSlow): * runtime/InternalFunction.h: (JSC::InternalFunction::createSubclassStructure): * runtime/JSCast.h: * runtime/JSGlobalObject.cpp: (JSC::enqueueJob): (JSC::JSGlobalObject::init): (JSC::JSGlobalObject::visitChildren): * runtime/JSGlobalObject.h: (JSC::JSGlobalObject::arrayProtoValuesFunction const): (JSC::JSGlobalObject::promiseProtoThenFunction const): (JSC::JSGlobalObject::initializePromiseFunction const): Deleted. * runtime/JSInternalPromise.cpp: (JSC::JSInternalPromise::createStructure): * runtime/JSInternalPromiseConstructor.cpp: (JSC::JSInternalPromiseConstructor::create): (JSC::JSInternalPromiseConstructor::createStructure): (JSC::JSInternalPromiseConstructor::JSInternalPromiseConstructor): (JSC::constructPromise): Deleted. * runtime/JSInternalPromiseConstructor.h: * runtime/JSInternalPromisePrototype.cpp: (JSC::JSInternalPromisePrototype::create): * runtime/JSMicrotask.cpp: (JSC::createJSMicrotask): (JSC::JSMicrotask::run): * runtime/JSMicrotask.h: * runtime/JSPromise.cpp: (JSC::JSPromise::createStructure): (JSC::JSPromise::finishCreation): (JSC::JSPromise::visitChildren): (JSC::JSPromise::status const): (JSC::JSPromise::result const): (JSC::JSPromise::isHandled const): (JSC::JSPromise::initialize): Deleted. * runtime/JSPromise.h: (JSC::JSPromise::allocationSize): (JSC::JSPromise::offsetOfInternalFields): (JSC::JSPromise::offsetOfInternalField): * runtime/JSPromiseConstructor.cpp: (JSC::JSPromiseConstructor::create): (JSC::JSPromiseConstructor::createStructure): (JSC::JSPromiseConstructor::JSPromiseConstructor): (JSC::JSPromiseConstructor::finishCreation): (JSC::constructPromise): Deleted. (JSC::callPromise): Deleted. * runtime/JSPromiseConstructor.h: * runtime/JSPromisePrototype.cpp: (JSC::JSPromisePrototype::create): (JSC::JSPromisePrototype::finishCreation): (JSC::JSPromisePrototype::addOwnInternalSlots): * runtime/JSPromisePrototype.h: * runtime/JSType.cpp: (WTF::printInternal): * runtime/JSType.h: Source/WebCore: * Modules/streams/ReadableStream.js: (pipeThrough): * Modules/streams/ReadableStreamInternals.js: (readableStreamError): (readableStreamReaderGenericRelease): LayoutTests: * inspector/canvas/recording-bitmaprenderer-frameCount-expected.txt: * inspector/canvas/recording-bitmaprenderer-full-expected.txt: * inspector/canvas/recording-bitmaprenderer-memoryLimit-expected.txt: * inspector/console/message-stack-trace-expected.txt: * inspector/console/queryHolders-expected.txt: * js/Promise-types-expected.txt: * js/dom/Promise-resolve-with-itself-expected.txt: * js/dom/Promise-resolve-with-itself.html: * js/script-tests/Promise-types.js: Canonical link: https://commits.webkit.org/215115@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249509 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-09-05 01:23:46 +00:00
PASS Promise() threw exception TypeError: Cannot call a constructor without |new|.
Update Promises to the https://github.com/domenic/promises-unwrapping spec https://bugs.webkit.org/show_bug.cgi?id=120954 Reviewed by Filip Pizlo. Source/JavaScriptCore: Update Promises to the revised spec. Notable changes: - JSPromiseResolver is gone. - TaskContext has been renamed Microtask and now has a virtual run() function. - Instead of using custom InternalFunction subclasses, JSFunctions are used with PrivateName properties for internal slots. * CMakeLists.txt: * DerivedSources.make: * GNUmakefile.list.am: * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: * JavaScriptCore.xcodeproj/project.pbxproj: * interpreter/CallFrame.h: (JSC::ExecState::promiseConstructorTable): * runtime/CommonIdentifiers.cpp: (JSC::CommonIdentifiers::CommonIdentifiers): * runtime/CommonIdentifiers.h: * runtime/JSGlobalObject.cpp: (JSC::JSGlobalObject::reset): (JSC::JSGlobalObject::visitChildren): (JSC::JSGlobalObject::queueMicrotask): * runtime/JSGlobalObject.h: (JSC::JSGlobalObject::promiseConstructor): (JSC::JSGlobalObject::promisePrototype): (JSC::JSGlobalObject::promiseStructure): * runtime/JSPromise.cpp: (JSC::JSPromise::create): (JSC::JSPromise::JSPromise): (JSC::JSPromise::finishCreation): (JSC::JSPromise::visitChildren): (JSC::JSPromise::reject): (JSC::JSPromise::resolve): (JSC::JSPromise::appendResolveReaction): (JSC::JSPromise::appendRejectReaction): (JSC::triggerPromiseReactions): * runtime/JSPromise.h: (JSC::JSPromise::status): (JSC::JSPromise::result): (JSC::JSPromise::constructor): * runtime/JSPromiseCallback.cpp: Removed. * runtime/JSPromiseCallback.h: Removed. * runtime/JSPromiseConstructor.cpp: (JSC::constructPromise): (JSC::JSPromiseConstructor::getCallData): (JSC::JSPromiseConstructorFuncCast): (JSC::JSPromiseConstructorFuncResolve): (JSC::JSPromiseConstructorFuncReject): * runtime/JSPromiseConstructor.h: * runtime/JSPromiseDeferred.cpp: Added. (JSC::JSPromiseDeferred::create): (JSC::JSPromiseDeferred::JSPromiseDeferred): (JSC::JSPromiseDeferred::finishCreation): (JSC::JSPromiseDeferred::visitChildren): (JSC::createJSPromiseDeferredFromConstructor): (JSC::updateDeferredFromPotentialThenable): * runtime/JSPromiseDeferred.h: Added. (JSC::JSPromiseDeferred::createStructure): (JSC::JSPromiseDeferred::promise): (JSC::JSPromiseDeferred::resolve): (JSC::JSPromiseDeferred::reject): * runtime/JSPromiseFunctions.cpp: Added. (JSC::deferredConstructionFunction): (JSC::createDeferredConstructionFunction): (JSC::identifyFunction): (JSC::createIdentifyFunction): (JSC::promiseAllCountdownFunction): (JSC::createPromiseAllCountdownFunction): (JSC::promiseResolutionHandlerFunction): (JSC::createPromiseResolutionHandlerFunction): (JSC::rejectPromiseFunction): (JSC::createRejectPromiseFunction): (JSC::resolvePromiseFunction): (JSC::createResolvePromiseFunction): (JSC::throwerFunction): (JSC::createThrowerFunction): * runtime/JSPromiseFunctions.h: Added. * runtime/JSPromisePrototype.cpp: (JSC::JSPromisePrototypeFuncThen): (JSC::JSPromisePrototypeFuncCatch): * runtime/JSPromiseReaction.cpp: Added. (JSC::createExecutePromiseReactionMicroTask): (JSC::ExecutePromiseReactionMicroTask::run): (JSC::JSPromiseReaction::create): (JSC::JSPromiseReaction::JSPromiseReaction): (JSC::JSPromiseReaction::finishCreation): (JSC::JSPromiseReaction::visitChildren): * runtime/JSPromiseReaction.h: Added. (JSC::JSPromiseReaction::createStructure): (JSC::JSPromiseReaction::deferred): (JSC::JSPromiseReaction::handler): * runtime/JSPromiseResolver.cpp: Removed. * runtime/JSPromiseResolver.h: Removed. * runtime/JSPromiseResolverConstructor.cpp: Removed. * runtime/JSPromiseResolverConstructor.h: Removed. * runtime/JSPromiseResolverPrototype.cpp: Removed. * runtime/JSPromiseResolverPrototype.h: Removed. * runtime/Microtask.h: Added. * runtime/VM.cpp: (JSC::VM::VM): (JSC::VM::~VM): * runtime/VM.h: Source/WebCore: * ForwardingHeaders/runtime/JSPromiseDeferred.h: Added. * ForwardingHeaders/runtime/JSPromiseResolver.h: Removed. * bindings/js/JSDOMGlobalObjectTask.cpp: (WebCore::JSGlobalObjectTask::JSGlobalObjectTask): * bindings/js/JSDOMGlobalObjectTask.h: * bindings/js/JSDOMPromise.cpp: (WebCore::DeferredWrapper::DeferredWrapper): (WebCore::DeferredWrapper::promise): (WebCore::DeferredWrapper::resolve): (WebCore::DeferredWrapper::reject): * bindings/js/JSDOMPromise.h: (WebCore::DeferredWrapper::resolve): (WebCore::DeferredWrapper::reject): (WebCore::DeferredWrapper::resolve<String>): (WebCore::DeferredWrapper::resolve<bool>): (WebCore::char>>): (WebCore::DeferredWrapper::reject<String>): * bindings/js/JSDOMWindowBase.cpp: (WebCore::JSDOMWindowBase::queueTaskToEventLoop): * bindings/js/JSDOMWindowBase.h: * bindings/js/JSSubtleCryptoCustom.cpp: (WebCore::JSSubtleCrypto::encrypt): (WebCore::JSSubtleCrypto::decrypt): (WebCore::JSSubtleCrypto::sign): (WebCore::JSSubtleCrypto::verify): (WebCore::JSSubtleCrypto::digest): (WebCore::JSSubtleCrypto::generateKey): (WebCore::JSSubtleCrypto::importKey): (WebCore::JSSubtleCrypto::exportKey): (WebCore::JSSubtleCrypto::wrapKey): (WebCore::JSSubtleCrypto::unwrapKey): * bindings/js/JSWorkerGlobalScopeBase.cpp: (WebCore::JSWorkerGlobalScopeBase::queueTaskToEventLoop): * bindings/js/JSWorkerGlobalScopeBase.h: LayoutTests: * crypto/subtle/argument-conversion.html: * crypto/subtle/resources/common.js: * crypto/subtle/sha-1.html: * crypto/subtle/sha-224.html: * crypto/subtle/sha-256.html: * crypto/subtle/sha-384.html: * crypto/subtle/sha-512.html: * js/dom/Promise-already-fulfilled-expected.txt: Removed. * js/dom/Promise-already-fulfilled.html: Removed. * js/dom/Promise-already-rejected.html: * js/dom/Promise-already-resolved.html: * js/dom/Promise-catch-expected.txt: * js/dom/Promise-catch-in-workers-expected.txt: * js/dom/Promise-catch.html: * js/dom/Promise-chain.html: * js/dom/Promise-exception-expected.txt: * js/dom/Promise-exception.html: * js/dom/Promise-expected.txt: * js/dom/Promise-fulfill-expected.txt: Removed. * js/dom/Promise-fulfill-in-workers-expected.txt: Removed. * js/dom/Promise-fulfill-in-workers.html: Removed. * js/dom/Promise-fulfill.html: Removed. * js/dom/Promise-init-callback-receiver-expected.txt: Added. * js/dom/Promise-init-callback-receiver.html: Added. * js/dom/Promise-init-expected.txt: * js/dom/Promise-init-in-workers-expected.txt: * js/dom/Promise-init.html: * js/dom/Promise-onFulfilled-deep-expected.txt: Added. * js/dom/Promise-onFulfilled-deep.html: Added. * js/dom/Promise-onRejected-deep-expected.txt: Added. * js/dom/Promise-onRejected-deep.html: Added. * js/dom/Promise-reject.html: * js/dom/Promise-resolve-chain.html: * js/dom/Promise-resolve-expected.txt: * js/dom/Promise-resolve-in-workers-expected.txt: * js/dom/Promise-resolve-state-expected.txt: Added. * js/dom/Promise-resolve-state-in-workers-expected.txt: Added. * js/dom/Promise-resolve-state-in-workers.html: Added. * js/dom/Promise-resolve-state.html: Added. * js/dom/Promise-resolve-with-itself-expected.txt: Added. * js/dom/Promise-resolve-with-itself.html: Added. * js/dom/Promise-resolve-with-then-exception.html: * js/dom/Promise-resolve-with-then-fulfill-expected.txt: * js/dom/Promise-resolve-with-then-fulfill.html: * js/dom/Promise-resolve-with-then-reject-expected.txt: * js/dom/Promise-resolve-with-then-reject.html: * js/dom/Promise-resolve.html: * js/dom/Promise-simple-expected.txt: * js/dom/Promise-simple-fulfill-expected.txt: Removed. * js/dom/Promise-simple-fulfill-inside-callback-expected.txt: Removed. * js/dom/Promise-simple-fulfill-inside-callback.html: Removed. * js/dom/Promise-simple-fulfill.html: Removed. * js/dom/Promise-simple-in-workers-expected.txt: * js/dom/Promise-simple-resolve-expected.txt: Added. * js/dom/Promise-simple-resolve.html: Added. * js/dom/Promise-simple.html: * js/dom/Promise-static-all-expected.txt: Added. * js/dom/Promise-static-all.html: Added. * js/dom/Promise-static-cast-expected.txt: Added. * js/dom/Promise-static-cast.html: Added. * js/dom/Promise-static-fulfill-expected.txt: Removed. * js/dom/Promise-static-fulfill.html: Removed. * js/dom/Promise-static-race-expected.txt: Added. * js/dom/Promise-static-race.html: Added. * js/dom/Promise-static-resolve.html: * js/dom/Promise-then-callback-receiver-expected.txt: Added. * js/dom/Promise-then-callback-receiver.html: Added. * js/dom/Promise-then-expected.txt: * js/dom/Promise-then-in-workers-expected.txt: * js/dom/Promise-then-without-callbacks.html: * js/dom/Promise-then.html: * js/dom/Promise-types-expected.txt: * js/dom/Promise-types.html: * js/dom/Promise.html: * js/resources/Promise-catch-in-workers.js: * js/resources/Promise-fulfill-in-workers.js: Removed. * js/resources/Promise-init-in-workers.js: * js/resources/Promise-reject-in-workers.js: * js/resources/Promise-resolve-in-workers.js: * js/resources/Promise-resolve-state-in-workers.js: Added. * js/resources/Promise-simple-in-workers.js: * js/resources/Promise-then-in-workers.js: * js/resources/Promise-then-without-callbacks-in-workers.js: Canonical link: https://commits.webkit.org/144312@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@161241 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2014-01-03 00:40:16 +00:00
PASS new Promise(1) threw exception TypeError: Promise constructor takes a function argument.
PASS new Promise('hello') threw exception TypeError: Promise constructor takes a function argument.
PASS new Promise([]) threw exception TypeError: Promise constructor takes a function argument.
PASS new Promise({}) threw exception TypeError: Promise constructor takes a function argument.
PASS new Promise(null) threw exception TypeError: Promise constructor takes a function argument.
PASS new Promise(undefined) threw exception TypeError: Promise constructor takes a function argument.
[JSC] Make Promise implementation faster https://bugs.webkit.org/show_bug.cgi?id=200898 Reviewed by Saam Barati. JSTests: * ChakraCore/test/UnitTestFramework/UnitTestFramework.js: (assert.assert.return.throws): * modules/breaking-builtin-promise-then-does-not-break-internal-promise.js: Added. * modules/breaking-builtin-promise-then-does-not-break-internal-promise/test.js: Added. * stress/constructor-kind-naked-should-not-be-applied-to-inner-functions.js: Added. (shouldThrow): (new.Promise): (shouldThrow.Promise): * stress/create-promise-should-respect-promise-realm.js: Added. (shouldBe): (other.new.OtherPromise): (DerivedOtherPromise): (i.promise.new.DerivedOtherPromise): (createPromise): * stress/derived-promise-constructor-class-syntax-prototype-replace-attempt.js: Added. (shouldBe): (DerivedPromise): (i.array.push.new.DerivedPromise): (promise.new.DerivedPromise): * stress/derived-promise-constructor-inlined.js: Added. (shouldBe): (DerivedPromise): (i.array.push.new.DerivedPromise): (DerivedPromise.all.array.then): * stress/derived-promise-prototype-replaced.js: Added. (shouldBe): (DerivedPromise): (i.array.push.new.DerivedPromise): (promise.new.DerivedPromise): * stress/internal-promise-constructor-not-confusing.js: Added. (shouldBe): (InternalPromise.vm.createBuiltin): (DerivedPromise): * stress/internal-promise-is-not-exposed.js: Added. (shouldBe): * stress/new-promise-should-respect-promise-realm.js: Added. (shouldBe): (other.new.OtherPromise): (createPromise): * stress/promise-cannot-be-called.js: (shouldThrow): * stress/promise-capability-fast-path.js: Added. (shouldBe): (i.array.push.new.Promise): (i.array.i.then): * stress/promise-capability-slow-path.js: Added. (shouldBe): (Promise.prototype.then): (i.array.push.new.Promise): (i.array.i.then): * stress/promise-capability-then-slow-path.js: Added. (shouldBe): (DerivedPromise): (DerivedPromise.prototype.then): (i.array.push.new.DerivedPromise): (i.array.i.then): * stress/promise-constructor-inlined.js: Added. (shouldBe): (i.array.push.new.Promise): (Promise.all.array.then): * stress/promise-constructor-transition-from-new-promise-to-create-promise.js: Added. (shouldBe): (DerivedPromise): (DerivedPromise2): (i.array.push.new.DerivedPromise): (i.array2.push.new.DerivedPromise2): * stress/without-promise-functions.js: Added. (shouldBe): (async): LayoutTests/imported/w3c: * web-platform-tests/html/browsers/origin/cross-origin-objects/cross-origin-objects-expected.txt: Source/JavaScriptCore: This is the major change of the Promise implementation and it improves JetStream2/async-fs by 62%. 1. Make JSPromise C++ friendly Instead of using objects with private properties (properties with private symbols), we put internal fields in JSPromise. This avoids allocating unnecessary butterflies for these private fields, and makes allocating JSPromise and accessing these fields from C++ easy. Moreover, this patch reduces # of fields of JSPromise from 4 to 2 to make JSPromise compact. To access these internal fields efficiently from JS, we add `op_get_promise_internal_field` and `op_put_promise_internal_field` bytecodes, and corresponding DFG/FTL supports. They are similar to GetClosureVar / PutClosureVar implementation. These two bytecodes are intentionally generic to later expand this support to generator and async-generator by renaming them to `op_get_internal_field` and `op_put_internal_field`. It is filed in [1]. We also add JSPromiseType as JSType. And structures for JSPromise should have that. So that now `@isPromise` is efficiently implemented. This also requires adding SpecPromiseObject and PromiseObjectUse to DFG. Further, by introducing another bit flag representing `alreadyResolved` to JSPromise's flags, we can remove JSPromiseDeferred. This extension is filed in [2]. 2. Make JSPromise constructor JS friendly The old JSPromise constructor was very inefficient: JSPromise constructor is InternalFunction in C++, and in it, it calls `initializePromise` JS function. And this `initializePromise` function invokes `executor` function passed by user program. If we can implement JSPromise constructor fully in JS, we can recognize `executor` and we have a chance to fully inline them. Unfortunately, we cannot inline JSPromise constructor for now since it takes 120 bytecode cost while our inlining threshold for construct is 100. We might want to investigate getting it inlined in the future[3]. We can avoid C++ <-> JS dance in such an important operation, allocating JSPromise. This patch introduces @nakedConstructor annotation to builtin JS. And this is propagated as `ConstructorKind::Naked`. If this kind is attached, the bytecode generator do not emit `op_create_this` implicitly and the constructor does not return `this` object implicitly. The naked constructor allows us to emit bare-metal bytecode, specifically necessary to allocate non-final JSObject from JS constructor. We introduce op_create_promise, which is similar to op_create_this, but it allocates JSPromise. And by using @createPromise bytecode intrinsic, we implement JSPromise constructor fully in JS. With this, we can start introducing object-allocation-sinking for JSPromise too. It is filed in [4]. 3. DFG supports for JSPromise operations This patch adds four DFG nodes, CreatePromise, NewPromise, GetPromiseInternalField, and PutPromiseInternalField. CreatePromise mimics CreateThis, and NewPromise mimics NewObject. CreatePromise can be converted to NewPromise with some condition checks and NewPromise can efficiently allocate promises. CreatePromise and NewPromise have `isInternalPromise` flag so that InternalPromise is also correctly handled in DFG. When converting CreatePromise to NewPromise, we need to get the correct structure with a specified `callee.prototype`. We mimic the mechanism used in CreateThis, but we use InternalFunctionAllocationProfile instead of ObjectAllocationProfile because (1) InternalFunctionAllocationProfile can handle non-final JSObjects and (2) we do not need to handle inline-capacity for promises. To make InternalFunctionAllocationProfile usable in DFG, we connect watchpoint to InternalFunctionAllocationProfile's invalidation so that DFG code can notice when InternalFunctionAllocationProfile's structure is invalidated: `callee.prototype` is replaced. 4. Avoid creating unnecessary promises Some promises are never shown to users, and they are never rejected. One example is `await`'s promise. And some of promise creation can be avoided. For example, when resolving a value with `Promise.resolve`, if a value is promise and if it's `then` method is the builtin `then`, we can avoid creating intermediate promise. To handle these things well, we introduce `@resolveWithoutPromise`, `@rejectWithoutPromise`, and `@fulfillWithoutPromise`. They take `onFulfilled` and `onRejected` handlers and they do not need an intermediate promise for resolving. This removes internal promise allocations in major cases and makes promise / async-functions efficient. And we also expose builtin `then` function as `@then`, and insert `@isPromise(xxx) && then === @then` check to take a fast path. We introduced four types of promise reactions to avoid some of object allocations. And microtask reaction is handling these four types. 5. Avoid creating resolving-functions and promise capabilities Resolving functions have `alreadyResolved` flag to prevent calling `resolve` and `reject` multiple times. For the first resolving function creation, this patch embeds one bit flag to JSPromise itself which indicates `alreadyResolved` in the first created resolving functions (resolving functions can be later created again for the same promise. In that case, we just create a usual resolving functions). By doing so, we avoid unnecessary resolving functions and promise capability allocations. We introduce a wrapper function `@resolvePromiseWithFirstResolvingFunctionCallCheck` and `@rejectPromiseWithFirstResolvingFunctionCallCheck`. The resolving functions which are first created with `@newPromiseCapability` can be mechanically replaced with the calls to these functions, e.g. replacing `promiseCapability.@resolve.@call(@undefined, value)` with `@resolvePromiseWithFirstResolvingFunctionCallCheck(promise, value)`. This mechanism will be used to drop JSPromiseDeferred in a separate patch. JetStream2/async-fs results. ToT: Running async-fs: Startup: 116.279 Worst Case: 151.515 Average: 176.630 Score: 145.996 Wall time: 0:01.149 Patched: Running async-fs: Startup: 166.667 Worst Case: 267.857 Average: 299.080 Score: 237.235 Wall time: 0:00.683 [1]: https://bugs.webkit.org/show_bug.cgi?id=201159 [2]: https://bugs.webkit.org/show_bug.cgi?id=201160 [3]: https://bugs.webkit.org/show_bug.cgi?id=201452 [4]: https://bugs.webkit.org/show_bug.cgi?id=201158 * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * Scripts/wkbuiltins/builtins_generate_combined_header.py: (ConstructAbility): (ConstructorKind): * Scripts/wkbuiltins/builtins_generate_separate_header.py: * Scripts/wkbuiltins/builtins_generator.py: (BuiltinsGenerator.generate_embedded_code_data_for_function): (BuiltinsGenerator.generate_embedded_code_string_section_for_data): * Scripts/wkbuiltins/builtins_model.py: (BuiltinFunction.__init__): (BuiltinFunction.fromString): * Scripts/wkbuiltins/builtins_templates.py: * builtins/AsyncFromSyncIteratorPrototype.js: (next.try): (next): (return.try): (return): (throw.try): (throw): * builtins/AsyncFunctionPrototype.js: (globalPrivate.asyncFunctionResume): * builtins/AsyncGeneratorPrototype.js: (globalPrivate.asyncGeneratorQueueIsEmpty): (globalPrivate.asyncGeneratorQueueEnqueue): (globalPrivate.asyncGeneratorQueueDequeue): (globalPrivate.asyncGeneratorReject): (globalPrivate.asyncGeneratorResolve): (globalPrivate.asyncGeneratorYield): (onRejected): (globalPrivate.awaitValue): (onFulfilled): (globalPrivate.doAsyncGeneratorBodyCall): (globalPrivate.asyncGeneratorResumeNext): (globalPrivate.asyncGeneratorEnqueue): (globalPrivate.asyncGeneratorDequeue): Deleted. (const.onRejected): Deleted. (const.onFulfilled): Deleted. (globalPrivate.asyncGeneratorResumeNext.): Deleted. * builtins/BuiltinExecutableCreator.h: * builtins/BuiltinExecutables.cpp: (JSC::BuiltinExecutables::defaultConstructorSourceCode): (JSC::BuiltinExecutables::createDefaultConstructor): (JSC::BuiltinExecutables::createBuiltinExecutable): (JSC::BuiltinExecutables::createExecutable): (JSC::createBuiltinExecutable): Deleted. * builtins/BuiltinExecutables.h: * builtins/BuiltinNames.h: * builtins/BuiltinUtils.h: * builtins/ModuleLoader.js: (forceFulfillPromise): * builtins/PromiseConstructor.js: (nakedConstructor.Promise.resolve): (nakedConstructor.Promise.reject): (nakedConstructor.Promise): (nakedConstructor.InternalPromise.resolve): (nakedConstructor.InternalPromise.reject): (nakedConstructor.InternalPromise): * builtins/PromiseOperations.js: (globalPrivate.newPromiseReaction): (globalPrivate.newPromiseCapability): (globalPrivate.newHandledRejectedPromise): (globalPrivate.triggerPromiseReactions): (globalPrivate.resolvePromise): (globalPrivate.rejectPromise): (globalPrivate.fulfillPromise): (globalPrivate.resolvePromiseWithFirstResolvingFunctionCallCheck): (globalPrivate.rejectPromiseWithFirstResolvingFunctionCallCheck): (globalPrivate.createResolvingFunctions.resolve): (globalPrivate.createResolvingFunctions.reject): (globalPrivate.createResolvingFunctions): (globalPrivate.promiseReactionJobWithoutPromise): (globalPrivate.resolveWithoutPromise): (globalPrivate.rejectWithoutPromise): (globalPrivate.fulfillWithoutPromise): (resolve): (reject): (globalPrivate.createResolvingFunctionsWithoutPromise): (globalPrivate.promiseReactionJob): (globalPrivate.promiseResolveThenableJobFast): (globalPrivate.promiseResolveThenableJobWithoutPromiseFast): (globalPrivate.promiseResolveThenableJob): (globalPrivate.isPromise): Deleted. (globalPrivate.newPromiseCapability.executor): Deleted. (globalPrivate.initializePromise): Deleted. * builtins/PromisePrototype.js: (then): * bytecode/BytecodeIntrinsicRegistry.cpp: (JSC::BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry): * bytecode/BytecodeIntrinsicRegistry.h: * bytecode/BytecodeList.rb: * bytecode/BytecodeUseDef.h: (JSC::computeUsesForBytecodeOffset): (JSC::computeDefsForBytecodeOffset): * bytecode/CodeBlock.cpp: (JSC::CodeBlock::finishCreation): (JSC::CodeBlock::finalizeLLIntInlineCaches): * bytecode/Opcode.h: * bytecode/SpeculatedType.cpp: (JSC::dumpSpeculation): (JSC::speculationFromClassInfo): (JSC::speculationFromJSType): (JSC::speculationFromString): * bytecode/SpeculatedType.h: * bytecode/UnlinkedFunctionExecutable.h: * bytecompiler/BytecodeGenerator.cpp: (JSC::BytecodeGenerator::generate): (JSC::BytecodeGenerator::BytecodeGenerator): (JSC::BytecodeGenerator::emitGetPromiseInternalField): (JSC::BytecodeGenerator::emitPutPromiseInternalField): (JSC::BytecodeGenerator::emitCreatePromise): (JSC::BytecodeGenerator::emitNewPromise): (JSC::BytecodeGenerator::emitReturn): * bytecompiler/BytecodeGenerator.h: (JSC::BytecodeGenerator::promiseRegister): (JSC::BytecodeGenerator::emitIsPromise): (JSC::BytecodeGenerator::promiseCapabilityRegister): Deleted. * bytecompiler/NodesCodegen.cpp: (JSC::promiseInternalFieldIndex): (JSC::BytecodeIntrinsicNode::emit_intrinsic_getPromiseInternalField): (JSC::BytecodeIntrinsicNode::emit_intrinsic_putPromiseInternalField): (JSC::BytecodeIntrinsicNode::emit_intrinsic_isPromise): (JSC::BytecodeIntrinsicNode::emit_intrinsic_createPromise): (JSC::BytecodeIntrinsicNode::emit_intrinsic_newPromise): (JSC::FunctionNode::emitBytecode): * dfg/DFGAbstractHeap.h: * dfg/DFGAbstractInterpreterInlines.h: (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): * dfg/DFGByteCodeParser.cpp: (JSC::DFG::ByteCodeParser::parseBlock): * dfg/DFGCapabilities.cpp: (JSC::DFG::capabilityLevel): * dfg/DFGClobberize.h: (JSC::DFG::clobberize): * dfg/DFGClobbersExitState.cpp: (JSC::DFG::clobbersExitState): * dfg/DFGConstantFoldingPhase.cpp: (JSC::DFG::ConstantFoldingPhase::foldConstants): * dfg/DFGDoesGC.cpp: (JSC::DFG::doesGC): * dfg/DFGFixupPhase.cpp: (JSC::DFG::FixupPhase::fixupNode): * dfg/DFGGraph.cpp: (JSC::DFG::Graph::dump): * dfg/DFGHeapLocation.cpp: (WTF::printInternal): * dfg/DFGHeapLocation.h: * dfg/DFGMayExit.cpp: * dfg/DFGNode.h: (JSC::DFG::Node::convertToNewPromise): (JSC::DFG::Node::hasIsInternalPromise): (JSC::DFG::Node::isInternalPromise): (JSC::DFG::Node::hasInternalFieldIndex): (JSC::DFG::Node::internalFieldIndex): (JSC::DFG::Node::hasHeapPrediction): (JSC::DFG::Node::hasStructure): * dfg/DFGNodeType.h: * dfg/DFGOperations.cpp: * dfg/DFGOperations.h: * dfg/DFGPredictionPropagationPhase.cpp: * dfg/DFGPromotedHeapLocation.cpp: (WTF::printInternal): * dfg/DFGPromotedHeapLocation.h: * dfg/DFGSafeToExecute.h: (JSC::DFG::SafeToExecuteEdge::operator()): (JSC::DFG::safeToExecute): * dfg/DFGSpeculativeJIT.cpp: (JSC::DFG::SpeculativeJIT::compileNewFunctionCommon): (JSC::DFG::SpeculativeJIT::speculatePromiseObject): (JSC::DFG::SpeculativeJIT::speculate): (JSC::DFG::SpeculativeJIT::compileGetPromiseInternalField): (JSC::DFG::SpeculativeJIT::compilePutPromiseInternalField): (JSC::DFG::SpeculativeJIT::compileCreatePromise): (JSC::DFG::SpeculativeJIT::compileNewPromise): * dfg/DFGSpeculativeJIT.h: * dfg/DFGSpeculativeJIT32_64.cpp: (JSC::DFG::SpeculativeJIT::compile): * dfg/DFGSpeculativeJIT64.cpp: (JSC::DFG::SpeculativeJIT::compile): * dfg/DFGStoreBarrierInsertionPhase.cpp: * dfg/DFGUseKind.cpp: (WTF::printInternal): * dfg/DFGUseKind.h: (JSC::DFG::typeFilterFor): (JSC::DFG::isCell): * ftl/FTLAbstractHeapRepository.h: * ftl/FTLCapabilities.cpp: (JSC::FTL::canCompile): * ftl/FTLLowerDFGToB3.cpp: (JSC::FTL::DFG::LowerDFGToB3::compileNode): (JSC::FTL::DFG::LowerDFGToB3::compileNewFunction): (JSC::FTL::DFG::LowerDFGToB3::compileNewPromise): (JSC::FTL::DFG::LowerDFGToB3::compileCreatePromise): (JSC::FTL::DFG::LowerDFGToB3::compileGetPromiseInternalField): (JSC::FTL::DFG::LowerDFGToB3::compilePutPromiseInternalField): (JSC::FTL::DFG::LowerDFGToB3::speculate): (JSC::FTL::DFG::LowerDFGToB3::speculatePromiseObject): * jit/JIT.cpp: (JSC::JIT::privateCompileMainPass): (JSC::JIT::privateCompileSlowCases): * jit/JIT.h: * jit/JITOperations.cpp: * jit/JITOperations.h: * jit/JITPropertyAccess.cpp: (JSC::JIT::emit_op_get_promise_internal_field): (JSC::JIT::emit_op_put_promise_internal_field): * jit/JITPropertyAccess32_64.cpp: (JSC::JIT::emit_op_get_promise_internal_field): (JSC::JIT::emit_op_put_promise_internal_field): * llint/LowLevelInterpreter.asm: * llint/LowLevelInterpreter32_64.asm: * llint/LowLevelInterpreter64.asm: * parser/Parser.cpp: (JSC::Parser<LexerType>::Parser): (JSC::Parser<LexerType>::parseFunctionInfo): * parser/Parser.h: (JSC::parse): * parser/ParserModes.h: * runtime/CommonSlowPaths.cpp: (JSC::SLOW_PATH_DECL): * runtime/CommonSlowPaths.h: * runtime/ConstructAbility.h: * runtime/ConstructorKind.h: Copied from Source/JavaScriptCore/runtime/ConstructAbility.h. * runtime/FunctionRareData.cpp: (JSC::FunctionRareData::FunctionRareData): (JSC::FunctionRareData::initializeObjectAllocationProfile): (JSC::FunctionRareData::clear): * runtime/FunctionRareData.h: * runtime/InternalFunction.cpp: (JSC::InternalFunction::createSubclassStructureSlow): * runtime/InternalFunction.h: (JSC::InternalFunction::createSubclassStructure): * runtime/JSCast.h: * runtime/JSGlobalObject.cpp: (JSC::enqueueJob): (JSC::JSGlobalObject::init): (JSC::JSGlobalObject::visitChildren): * runtime/JSGlobalObject.h: (JSC::JSGlobalObject::arrayProtoValuesFunction const): (JSC::JSGlobalObject::promiseProtoThenFunction const): (JSC::JSGlobalObject::initializePromiseFunction const): Deleted. * runtime/JSInternalPromise.cpp: (JSC::JSInternalPromise::createStructure): * runtime/JSInternalPromiseConstructor.cpp: (JSC::JSInternalPromiseConstructor::create): (JSC::JSInternalPromiseConstructor::createStructure): (JSC::JSInternalPromiseConstructor::JSInternalPromiseConstructor): (JSC::constructPromise): Deleted. * runtime/JSInternalPromiseConstructor.h: * runtime/JSInternalPromisePrototype.cpp: (JSC::JSInternalPromisePrototype::create): * runtime/JSMicrotask.cpp: (JSC::createJSMicrotask): (JSC::JSMicrotask::run): * runtime/JSMicrotask.h: * runtime/JSPromise.cpp: (JSC::JSPromise::createStructure): (JSC::JSPromise::finishCreation): (JSC::JSPromise::visitChildren): (JSC::JSPromise::status const): (JSC::JSPromise::result const): (JSC::JSPromise::isHandled const): (JSC::JSPromise::initialize): Deleted. * runtime/JSPromise.h: (JSC::JSPromise::allocationSize): (JSC::JSPromise::offsetOfInternalFields): (JSC::JSPromise::offsetOfInternalField): * runtime/JSPromiseConstructor.cpp: (JSC::JSPromiseConstructor::create): (JSC::JSPromiseConstructor::createStructure): (JSC::JSPromiseConstructor::JSPromiseConstructor): (JSC::JSPromiseConstructor::finishCreation): (JSC::constructPromise): Deleted. (JSC::callPromise): Deleted. * runtime/JSPromiseConstructor.h: * runtime/JSPromisePrototype.cpp: (JSC::JSPromisePrototype::create): (JSC::JSPromisePrototype::finishCreation): (JSC::JSPromisePrototype::addOwnInternalSlots): * runtime/JSPromisePrototype.h: * runtime/JSType.cpp: (WTF::printInternal): * runtime/JSType.h: Source/WebCore: * Modules/streams/ReadableStream.js: (pipeThrough): * Modules/streams/ReadableStreamInternals.js: (readableStreamError): (readableStreamReaderGenericRelease): LayoutTests: * inspector/canvas/recording-bitmaprenderer-frameCount-expected.txt: * inspector/canvas/recording-bitmaprenderer-full-expected.txt: * inspector/canvas/recording-bitmaprenderer-memoryLimit-expected.txt: * inspector/console/message-stack-trace-expected.txt: * inspector/console/queryHolders-expected.txt: * js/Promise-types-expected.txt: * js/dom/Promise-resolve-with-itself-expected.txt: * js/dom/Promise-resolve-with-itself.html: * js/script-tests/Promise-types.js: Canonical link: https://commits.webkit.org/215115@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249509 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-09-05 01:23:46 +00:00
PASS Promise(1) threw exception TypeError: Cannot call a constructor without |new|.
PASS Promise('hello') threw exception TypeError: Cannot call a constructor without |new|.
PASS Promise([]) threw exception TypeError: Cannot call a constructor without |new|.
PASS Promise({}) threw exception TypeError: Cannot call a constructor without |new|.
PASS Promise(null) threw exception TypeError: Cannot call a constructor without |new|.
PASS Promise(undefined) threw exception TypeError: Cannot call a constructor without |new|.
Add support for Promises https://bugs.webkit.org/show_bug.cgi?id=120260 Reviewed by Darin Adler. Source/JavaScriptCore: Add an initial implementation of Promises - http://dom.spec.whatwg.org/#promises. - Despite Promises being defined in the DOM, the implementation is being put in JSC in preparation for the Promises eventually being defined in ECMAScript. * CMakeLists.txt: * DerivedSources.make: * DerivedSources.pri: * GNUmakefile.list.am: * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: * JavaScriptCore.xcodeproj/project.pbxproj: * Target.pri: Add new files. * jsc.cpp: Update jsc's GlobalObjectMethodTable to stub out the new QueueTaskToEventLoop callback. This mean's you can't quite use Promises with with the command line tool yet. * interpreter/CallFrame.h: (JSC::ExecState::promisePrototypeTable): (JSC::ExecState::promiseConstructorTable): (JSC::ExecState::promiseResolverPrototypeTable): * runtime/VM.cpp: (JSC::VM::VM): (JSC::VM::~VM): * runtime/VM.h: Add supporting code for the new static lookup tables. * runtime/CommonIdentifiers.h: Add 3 new identifiers, "Promise", "PromiseResolver", and "then". * runtime/JSGlobalObject.cpp: (JSC::JSGlobalObject::reset): (JSC::JSGlobalObject::visitChildren): Add supporting code Promise and PromiseResolver's constructors and structures. * runtime/JSGlobalObject.h: (JSC::TaskContext::~TaskContext): Add a new callback to the GlobalObjectMethodTable to post a task on the embedder's runloop. (JSC::JSGlobalObject::promisePrototype): (JSC::JSGlobalObject::promiseResolverPrototype): (JSC::JSGlobalObject::promiseStructure): (JSC::JSGlobalObject::promiseResolverStructure): (JSC::JSGlobalObject::promiseCallbackStructure): (JSC::JSGlobalObject::promiseWrapperCallbackStructure): Add supporting code Promise and PromiseResolver's constructors and structures. * runtime/JSPromise.cpp: Added. * runtime/JSPromise.h: Added. * runtime/JSPromiseCallback.cpp: Added. * runtime/JSPromiseCallback.h: Added. * runtime/JSPromiseConstructor.cpp: Added. * runtime/JSPromiseConstructor.h: Added. * runtime/JSPromisePrototype.cpp: Added. * runtime/JSPromisePrototype.h: Added. * runtime/JSPromiseResolver.cpp: Added. * runtime/JSPromiseResolver.h: Added. * runtime/JSPromiseResolverConstructor.cpp: Added. * runtime/JSPromiseResolverConstructor.h: Added. * runtime/JSPromiseResolverPrototype.cpp: Added. * runtime/JSPromiseResolverPrototype.h: Added. Add Promise implementation. Source/WebCore: Add an initial implementation of Promises - http://dom.spec.whatwg.org/#promises. - Despite Promises being defined in the DOM, the implementation is being put in JSC in preparation for the Promises eventually being defined in ECMAScript. Tests: fast/js/Promise-already-fulfilled.html fast/js/Promise-already-rejected.html fast/js/Promise-already-resolved.html fast/js/Promise-catch-in-workers.html fast/js/Promise-catch.html fast/js/Promise-chain.html fast/js/Promise-exception.html fast/js/Promise-fulfill-in-workers.html fast/js/Promise-fulfill.html fast/js/Promise-init-in-workers.html fast/js/Promise-init.html fast/js/Promise-reject-in-workers.html fast/js/Promise-reject.html fast/js/Promise-resolve-chain.html fast/js/Promise-resolve-in-workers.html fast/js/Promise-resolve-with-then-exception.html fast/js/Promise-resolve-with-then-fulfill.html fast/js/Promise-resolve-with-then-reject.html fast/js/Promise-resolve.html fast/js/Promise-simple-fulfill-inside-callback.html fast/js/Promise-simple-fulfill.html fast/js/Promise-simple-in-workers.html fast/js/Promise-simple.html fast/js/Promise-static-fulfill.html fast/js/Promise-static-reject.html fast/js/Promise-static-resolve.html fast/js/Promise-then-in-workers.html fast/js/Promise-then-without-callbacks-in-workers.html fast/js/Promise-then-without-callbacks.html fast/js/Promise-then.html fast/js/Promise-types.html fast/js/Promise.html * GNUmakefile.list.am: * Target.pri: * UseJSC.cmake: * WebCore.vcxproj/WebCore.vcxproj: * WebCore.vcxproj/WebCore.vcxproj.filters: * WebCore.xcodeproj/project.pbxproj: * bindings/js/JSBindingsAllInOne.cpp: Add new files. * bindings/js/JSDOMGlobalObjectTask.cpp: Added. (WebCore::JSGlobalObjectCallback::create): (WebCore::JSGlobalObjectCallback::~JSGlobalObjectCallback): (WebCore::JSGlobalObjectCallback::call): (WebCore::JSGlobalObjectCallback::JSGlobalObjectCallback): (WebCore::JSGlobalObjectTask::JSGlobalObjectTask): (WebCore::JSGlobalObjectTask::~JSGlobalObjectTask): (WebCore::JSGlobalObjectTask::performTask): * bindings/js/JSDOMGlobalObjectTask.h: Added. (WebCore::JSGlobalObjectTask::create): Add a new task type to be used with the GlobalObjectMethodTable's new QueueTaskToEventLoop callback. * bindings/js/JSDOMWindowBase.cpp: (WebCore::JSDOMWindowBase::queueTaskToEventLoop): * bindings/js/JSDOMWindowBase.h: Implement the GlobalObjectMethodTable callback, QueueTaskToEventLoop. * bindings/js/JSMainThreadExecState.h: All using JSMainThreadExecState as a simple RAII object. * bindings/js/JSWorkerGlobalScopeBase.cpp: (WebCore::JSWorkerGlobalScopeBase::JSWorkerGlobalScopeBase): (WebCore::JSWorkerGlobalScopeBase::allowsAccessFrom): (WebCore::JSWorkerGlobalScopeBase::supportsProfiling): (WebCore::JSWorkerGlobalScopeBase::supportsRichSourceInfo): (WebCore::JSWorkerGlobalScopeBase::shouldInterruptScript): (WebCore::JSWorkerGlobalScopeBase::javaScriptExperimentsEnabled): (WebCore::JSWorkerGlobalScopeBase::queueTaskToEventLoop): * bindings/js/JSWorkerGlobalScopeBase.h: Add a GlobalObjectMethodTable and implement QueueTaskToEventLoop. Forward the other callbacks to JSGlobalObject so they retain their existing behavior. LayoutTests: Add tests adapted from the Mozilla and Blink projects. * fast/js/Promise-already-fulfilled-expected.txt: Added. * fast/js/Promise-already-fulfilled.html: Added. * fast/js/Promise-already-rejected-expected.txt: Added. * fast/js/Promise-already-rejected.html: Added. * fast/js/Promise-already-resolved-expected.txt: Added. * fast/js/Promise-already-resolved.html: Added. * fast/js/Promise-catch-expected.txt: Added. * fast/js/Promise-catch-in-workers-expected.txt: Added. * fast/js/Promise-catch-in-workers.html: Added. * fast/js/Promise-catch.html: Added. * fast/js/Promise-chain-expected.txt: Added. * fast/js/Promise-chain.html: Added. * fast/js/Promise-exception-expected.txt: Added. * fast/js/Promise-exception.html: Added. * fast/js/Promise-expected.txt: Added. * fast/js/Promise-fulfill-expected.txt: Added. * fast/js/Promise-fulfill-in-workers-expected.txt: Added. * fast/js/Promise-fulfill-in-workers.html: Added. * fast/js/Promise-fulfill.html: Added. * fast/js/Promise-init-expected.txt: Added. * fast/js/Promise-init-in-workers-expected.txt: Added. * fast/js/Promise-init-in-workers.html: Added. * fast/js/Promise-init.html: Added. * fast/js/Promise-reject-expected.txt: Added. * fast/js/Promise-reject-in-workers-expected.txt: Added. * fast/js/Promise-reject-in-workers.html: Added. * fast/js/Promise-reject.html: Added. * fast/js/Promise-resolve-chain-expected.txt: Added. * fast/js/Promise-resolve-chain.html: Added. * fast/js/Promise-resolve-expected.txt: Added. * fast/js/Promise-resolve-in-workers-expected.txt: Added. * fast/js/Promise-resolve-in-workers.html: Added. * fast/js/Promise-resolve-with-then-exception-expected.txt: Added. * fast/js/Promise-resolve-with-then-exception.html: Added. * fast/js/Promise-resolve-with-then-fulfill-expected.txt: Added. * fast/js/Promise-resolve-with-then-fulfill.html: Added. * fast/js/Promise-resolve-with-then-reject-expected.txt: Added. * fast/js/Promise-resolve-with-then-reject.html: Added. * fast/js/Promise-resolve.html: Added. * fast/js/Promise-simple-expected.txt: Added. * fast/js/Promise-simple-fulfill-expected.txt: Added. * fast/js/Promise-simple-fulfill-inside-callback-expected.txt: Added. * fast/js/Promise-simple-fulfill-inside-callback.html: Added. * fast/js/Promise-simple-fulfill.html: Added. * fast/js/Promise-simple-in-workers-expected.txt: Added. * fast/js/Promise-simple-in-workers.html: Added. * fast/js/Promise-simple.html: Added. * fast/js/Promise-static-fulfill-expected.txt: Added. * fast/js/Promise-static-fulfill.html: Added. * fast/js/Promise-static-reject-expected.txt: Added. * fast/js/Promise-static-reject.html: Added. * fast/js/Promise-static-resolve-expected.txt: Added. * fast/js/Promise-static-resolve.html: Added. * fast/js/Promise-then-expected.txt: Added. * fast/js/Promise-then-in-workers-expected.txt: Added. * fast/js/Promise-then-in-workers.html: Added. * fast/js/Promise-then-without-callbacks-expected.txt: Added. * fast/js/Promise-then-without-callbacks-in-workers-expected.txt: Added. * fast/js/Promise-then-without-callbacks-in-workers.html: Added. * fast/js/Promise-then-without-callbacks.html: Added. * fast/js/Promise-then.html: Added. * fast/js/Promise-types-expected.txt: Added. * fast/js/Promise-types.html: Added. * fast/js/Promise.html: Added. * fast/js/resources/Promise-catch-in-workers.js: Added. * fast/js/resources/Promise-fulfill-in-workers.js: Added. * fast/js/resources/Promise-init-in-workers.js: Added. * fast/js/resources/Promise-reject-in-workers.js: Added. * fast/js/resources/Promise-resolve-in-workers.js: Added. * fast/js/resources/Promise-simple-in-workers.js: Added. * fast/js/resources/Promise-then-in-workers.js: Added. * fast/js/resources/Promise-then-without-callbacks-in-workers.js: Added. Canonical link: https://commits.webkit.org/138280@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@154629 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2013-08-26 19:19:50 +00:00
Promise statics
PASS Promise.resolve is an instance of Function
PASS Promise.resolve.length is 1
PASS Promise.resolve(1) did not throw exception.
PASS Promise.reject is an instance of Function
PASS Promise.reject.length is 1
PASS Promise.reject(1) did not throw exception.
PASS Promise.resolve(1) is an instance of Promise
PASS Promise.reject(1) is an instance of Promise
PASS successfullyParsed is true
TEST COMPLETE