[JSC] Add core semantics of import defer#40453
Conversation
|
EWS run on previous version of this PR (hash 990aba9) Details |
990aba9 to
7c6ef14
Compare
|
EWS run on previous version of this PR (hash 7c6ef14) Details |
|
In the latest version I fixed two bugs, one in which cyclic module graphs would non-terminate when the cycles were between deferred/non-evaluated modules, and one due to the "ready for sync execution" check. Fixed API tests as well. Also refactored some of the module loader JS code. |
7c6ef14 to
d4a1b37
Compare
|
EWS run on previous version of this PR (hash d4a1b37) Details |
d4a1b37 to
66474d3
Compare
|
EWS run on previous version of this PR (hash 66474d3) Details |
Safer C++ Build #23293 (66474d3)❌ Found 1 new failure. Please address these issues before landing. See WebKit Guidelines for Safer C++ Programming. |
66474d3 to
c75cedc
Compare
|
EWS run on previous version of this PR (hash c75cedc) Details |
There was a problem hiding this comment.
Adjusted this signature (use RefPtr) due to Safe C++ checks
There was a problem hiding this comment.
While fixing the throw scope handling, I found that there's a check needed here (and in readyForSyncExecution as well). I believe the exception handling should be correct now as the module tests run fine in debug mode.
|
Het fyi, the proposal reached stage 3 at this week's TC39 meeting :) |
There was a problem hiding this comment.
BTW, I forgot to note this earlier (I can put it in the commit message) but this change is here to fix what I think is an old bug in which m_moduleProgramExecutable never actually got cleared because this state check wouldn't be true.
There was a problem hiding this comment.
Can we split this into a separate patch?
|
There were some bugs in a few test262 tests (tc39/test262#4416) but it affected this PR in only minor ways (I'll just revise the commit comment). |
c75cedc to
bb54087
Compare
|
EWS run on previous version of this PR (hash bb54087) Details |
There was a problem hiding this comment.
Just a general question, is it normal for these to be numbers? It's not necessarily a problem, I just wish the JSValue was more expressive somehow
There was a problem hiding this comment.
I believe so, that's how it's done for other intrinsic values listed in BytecodeIntrinsicRegistry.cpp for example. It's true that it's a bit error-prone if you read the JSValue incorrectly (this PR fixes an existing bug related to that). If there's a better way I'm happy to change it though.
justinmichaud
left a comment
There was a problem hiding this comment.
Overall, LGTM. I would like to see some more tests for the different places where we can throw an exception (basically, one for every place where we RETURN_IF_EXCEPTION).
Some tests for cycles would be nice, even if they are skipped for now.
I am not super familiar with this code, so I don't feel comfortable r+ing.
bb54087 to
ce53daf
Compare
|
EWS run on previous version of this PR (hash ce53daf) Details |
|
Thanks for taking a look!
I just added a few more tests for the
Some of the test262 tests related to cycles are indeed skipped, but there should already be tests for other kinds of cycles in the module tests (e.g., |
https://bugs.webkit.org/show_bug.cgi?id=286272 Reviewed by NOBODY (OOPS!). Implements the semantics of `import defer` along with deferred namespace objects. The proposal semantics can be found at: https://github.com/tc39/proposal-defer-import-eval/ This doesn't include the dynamic form `import.defer()` yet. There are a few limitations of the implementation that mostly stem from other bugs in the module loader. The following test262 tests do not pass yet and have test expectations set: - import-defer/errors/module-throws/trigger-evaluation.js - import-defer/errors/module-throws/defer-import-after-evaluation.js - import-defer/errors/module-throws/third-party-evaluation-after-defer-import.js (because JSC does not store and re-throw module eval errors) - import-defer/errors/get-other-while-evaluating-async - import-defer/errors/get-other-while-dep-evaluating-async (in debug mode, due to a assertion that can be triggered already in JSC) - import-defer/evaluation-top-level-await/flattening-order (due to async module behavior in JSC) - import-defer/deferred-namespace-object/exotic-object-behavior.js - import-defer/errors/get-self-while-defer-evaluating/main.js - import-defer/errors/resolution-error/import-defer-of-missing-module-fails.js: (These tests fail temporarily due to upstream test bugs, should get fixed after test262 gets updated) Many of these issues will be fixed by the general module refactoring for the following bug: https://bugs.webkit.org/show_bug.cgi?id=242740 * JSTests/modules/import-defer-1-1-cycle.js: Added. * JSTests/modules/import-defer-1-1-cycle/a.js: Added. * JSTests/modules/import-defer-1-1-cycle/b.js: Added. * JSTests/modules/import-defer-1-1-cycle/c.js: Added. * JSTests/modules/import-defer-1-1-cycle/d.js: Added. * JSTests/modules/import-defer-1-1-cycle/e.js: Added. * JSTests/modules/import-defer-1-cycle.js: Added. * JSTests/modules/import-defer-1-cycle/a.js: Added. * JSTests/modules/import-defer-1-cycle/c.js: Added. * JSTests/modules/import-defer-1-cycle/e.js: Added. * JSTests/modules/import-defer-2-1-deferred-cycle.js: Added. * JSTests/modules/import-defer-2-1-deferred-cycle/a.js: Added. * JSTests/modules/import-defer-2-1-deferred-cycle/b.js: Added. * JSTests/modules/import-defer-2-1-deferred-cycle/c.js: Added. * JSTests/modules/import-defer-2-1-deferred-cycle/d.js: Added. * JSTests/modules/import-defer-2-1-deferred-cycle/e.js: Added. * JSTests/modules/import-defer-2-1-force-evaluation.js: Added. * JSTests/modules/import-defer-2-1-force-evaluation/a.js: Added. * JSTests/modules/import-defer-2-1-force-evaluation/b.js: Added. * JSTests/modules/import-defer-2-1-force-evaluation/c.js: Added. * JSTests/modules/import-defer-2-1-force-evaluation/d.js: Added. * JSTests/modules/import-defer-2-1-force-evaluation/e.js: Added. * JSTests/modules/import-defer-2-deferred-cycle.js: Added. * JSTests/modules/import-defer-2-deferred-cycle/a.js: Added. * JSTests/modules/import-defer-2-deferred-cycle/c.js: Added. * JSTests/modules/import-defer-2-deferred-cycle/e.js: Added. * JSTests/modules/import-defer-2-force-evaluation.js: Added. * JSTests/modules/import-defer-2-force-evaluation/a.js: Added. * JSTests/modules/import-defer-2-force-evaluation/c.js: Added. * JSTests/modules/import-defer-2-force-evaluation/e.js: Added. * JSTests/modules/import-defer-3-1-force-evaluation.js: Added. * JSTests/modules/import-defer-3-1-force-evaluation/a.js: Added. * JSTests/modules/import-defer-3-1-force-evaluation/b.js: Added. * JSTests/modules/import-defer-3-1-force-evaluation/c.js: Added. * JSTests/modules/import-defer-3-1-force-evaluation/d.js: Added. * JSTests/modules/import-defer-3-1-force-evaluation/e.js: Added. * JSTests/modules/import-defer-3-1-indirect-cycle.js: Added. * JSTests/modules/import-defer-3-1-indirect-cycle/a.js: Added. * JSTests/modules/import-defer-3-1-indirect-cycle/b.js: Added. * JSTests/modules/import-defer-3-1-indirect-cycle/c.js: Added. * JSTests/modules/import-defer-3-1-indirect-cycle/d.js: Added. * JSTests/modules/import-defer-3-1-indirect-cycle/e.js: Added. * JSTests/modules/import-defer-3-force-evaluation.js: Added. * JSTests/modules/import-defer-3-force-evaluation/a.js: Added. * JSTests/modules/import-defer-3-force-evaluation/c.js: Added. * JSTests/modules/import-defer-3-force-evaluation/e.js: Added. * JSTests/modules/import-defer-3-indirect-cycle.js: Added. * JSTests/modules/import-defer-3-indirect-cycle/a.js: Added. * JSTests/modules/import-defer-3-indirect-cycle/c.js: Added. * JSTests/modules/import-defer-3-indirect-cycle/e.js: Added. * JSTests/modules/import-defer-4-both-imports.js: Added. * JSTests/modules/import-defer-4-both-imports/a.js: Added. * JSTests/modules/import-defer-4-both-imports/b.js: Added. * JSTests/modules/import-defer-4-both-imports/c.js: Added. * JSTests/modules/import-defer-5-force-evaluation-b-a.js: Added. * JSTests/modules/import-defer-5-force-evaluation-b-a/a.js: Added. * JSTests/modules/import-defer-5-force-evaluation-b-a/b.js: Added. * JSTests/modules/import-defer-5-force-evaluation-b-a/c.js: Added. * JSTests/modules/import-defer-5-force-evaluation-b-a/d.js: Added. * JSTests/modules/import-defer-5-force-evaluation-b-a/e.js: Added. * JSTests/modules/import-defer-5-force-evaluation-b-a/f.js: Added. * JSTests/modules/import-defer-5-force-evaluation-e-a-b-a.js: Added. * JSTests/modules/import-defer-5-force-evaluation-e-a-b-a/a.js: Added. * JSTests/modules/import-defer-5-force-evaluation-e-a-b-a/b.js: Added. * JSTests/modules/import-defer-5-force-evaluation-e-a-b-a/c.js: Added. * JSTests/modules/import-defer-5-force-evaluation-e-a-b-a/d.js: Added. * JSTests/modules/import-defer-5-force-evaluation-e-a-b-a/e.js: Added. * JSTests/modules/import-defer-5-force-evaluation-e-a-b-a/f.js: Added. * JSTests/modules/import-defer-5-force-evaluation-e-d-b-a.js: Added. * JSTests/modules/import-defer-5-force-evaluation-e-d-b-a/a.js: Added. * JSTests/modules/import-defer-5-force-evaluation-e-d-b-a/b.js: Added. * JSTests/modules/import-defer-5-force-evaluation-e-d-b-a/c.js: Added. * JSTests/modules/import-defer-5-force-evaluation-e-d-b-a/d.js: Added. * JSTests/modules/import-defer-5-force-evaluation-e-d-b-a/e.js: Added. * JSTests/modules/import-defer-5-force-evaluation-e-d-b-a/f.js: Added. * JSTests/modules/import-defer-5-force-evaluation-e-d.js: Added. * JSTests/modules/import-defer-5-force-evaluation-e-d/a.js: Added. * JSTests/modules/import-defer-5-force-evaluation-e-d/b.js: Added. * JSTests/modules/import-defer-5-force-evaluation-e-d/c.js: Added. * JSTests/modules/import-defer-5-force-evaluation-e-d/d.js: Added. * JSTests/modules/import-defer-5-force-evaluation-e-d/e.js: Added. * JSTests/modules/import-defer-5-force-evaluation-e-d/f.js: Added. * JSTests/modules/import-defer-5-multiple-async.js: Added. * JSTests/modules/import-defer-5-multiple-async/a.js: Added. * JSTests/modules/import-defer-5-multiple-async/b.js: Added. * JSTests/modules/import-defer-5-multiple-async/c.js: Added. * JSTests/modules/import-defer-5-multiple-async/d.js: Added. * JSTests/modules/import-defer-5-multiple-async/e.js: Added. * JSTests/modules/import-defer-5-multiple-async/f.js: Added. * JSTests/modules/import-defer-6-force-eval-order.js: Added. * JSTests/modules/import-defer-6-force-eval-order/a.js: Added. * JSTests/modules/import-defer-6-force-eval-order/b.js: Added. * JSTests/modules/import-defer-6-force-eval-order/c.js: Added. * JSTests/modules/import-defer-6-force-eval-order/d.js: Added. * JSTests/modules/import-defer-6-force-eval-order/e.js: Added. * JSTests/modules/import-defer-6-force-eval-order/f.js: Added. * JSTests/modules/import-defer-basic.js: Added. * JSTests/modules/import-defer-basic/1.js: Added. (export.foo): * JSTests/modules/import-defer-basic/2.js: Added. * JSTests/modules/import-defer-default.js: Added. * JSTests/modules/import-defer-default/foo.js: Added. * JSTests/modules/import-defer-defineownproperty.js: Added. * JSTests/modules/import-defer-deleteproperty.js: Added. * JSTests/modules/import-defer-getownproperty.js: Added. * JSTests/modules/import-defer-hasproperty.js: Added. * JSTests/modules/import-defer-ownpropertykeys.js: Added. * JSTests/modules/import-defer-ready-for-sync-execution-cycle-delete.js: Added. * JSTests/modules/import-defer-ready-for-sync-execution-cycle-delete/a.js: Added. * JSTests/modules/import-defer-ready-for-sync-execution-cycle-delete/b.js: Added. * JSTests/modules/import-defer-ready-for-sync-execution-cycle-delete/c.js: Added. * JSTests/modules/import-defer-ready-for-sync-execution-cycle-delete/d.js: Added. (shouldThrow): * JSTests/modules/import-defer-ready-for-sync-execution-cycle-keys.js: Added. * JSTests/modules/import-defer-ready-for-sync-execution-cycle-keys/a.js: Added. * JSTests/modules/import-defer-ready-for-sync-execution-cycle-keys/b.js: Added. * JSTests/modules/import-defer-ready-for-sync-execution-cycle-keys/c.js: Added. * JSTests/modules/import-defer-ready-for-sync-execution-cycle-keys/d.js: Added. (shouldThrow): * JSTests/modules/import-defer-ready-for-sync-execution-cycle.js: Added. * JSTests/modules/import-defer-ready-for-sync-execution-cycle/a.js: Added. * JSTests/modules/import-defer-ready-for-sync-execution-cycle/b.js: Added. * JSTests/modules/import-defer-ready-for-sync-execution-cycle/c.js: Added. * JSTests/modules/import-defer-ready-for-sync-execution-cycle/d.js: Added. (shouldThrow): * JSTests/modules/import-defer-then.js: Added. * JSTests/modules/import-defer-then/export-then.js: Added. * JSTests/modules/import-defer-tla.js: Added. * JSTests/modules/import-defer-tla/b.js: Added. * JSTests/modules/import-defer-tla/c.js: Added. * JSTests/modules/import-defer-tla/d.js: Added. * JSTests/modules/import-defer-tla/e.js: Added. * JSTests/modules/import-defer-tla/f.js: Added. * JSTests/test262/config.yaml: * JSTests/test262/expectations.yaml: * Source/JavaScriptCore/builtins/ModuleLoader.js: (linkTimeConstant.newRegistryEntry): (visibility.PrivateRecursive.requestSatisfyUtil): (visibility.PrivateRecursive.link): (visibility.PrivateRecursive.moduleEvaluation): (visibility.PrivateRecursive.async asyncModuleEvaluation): (visibility.PrivateRecursive.async asyncModuleDeferredEvaluation): (visibility.PrivateRecursive.async requestImportModule): (visibility.PrivateRecursive.dependencyKeysIfEvaluated): * Source/JavaScriptCore/bytecode/BytecodeIntrinsicRegistry.cpp: (JSC::BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry): * Source/JavaScriptCore/bytecode/BytecodeIntrinsicRegistry.h: * Source/JavaScriptCore/parser/ModuleAnalyzer.cpp: (JSC::ModuleAnalyzer::appendRequestedModule): * Source/JavaScriptCore/parser/ModuleAnalyzer.h: * Source/JavaScriptCore/parser/NodesAnalyzeModule.cpp: (JSC::ImportDeclarationNode::analyzeModule): (JSC::ExportAllDeclarationNode::analyzeModule): (JSC::ExportNamedDeclarationNode::analyzeModule): * Source/JavaScriptCore/runtime/AbstractModuleRecord.cpp: (JSC::AbstractModuleRecord::visitChildrenImpl): (JSC::AbstractModuleRecord::appendRequestedModule): (JSC::AbstractModuleRecord::getModuleNamespace): (JSC::AbstractModuleRecord::dump): * Source/JavaScriptCore/runtime/AbstractModuleRecord.h: * Source/JavaScriptCore/runtime/JSModuleLoader.cpp: (JSC::JSModuleLoader::finishCreation): (JSC::JSModuleLoader::getModuleNamespaceObject): (JSC::JSC_DEFINE_HOST_FUNCTION): * Source/JavaScriptCore/runtime/JSModuleLoader.h: * Source/JavaScriptCore/runtime/JSModuleNamespaceObject.cpp: (JSC::JSModuleNamespaceObject::JSModuleNamespaceObject): (JSC::JSModuleNamespaceObject::finishCreation): (JSC::JSModuleNamespaceObject::ensureDeferredNamespaceEvaluation): (JSC::JSModuleNamespaceObject::isSymbolLikeNamespaceKey): (JSC::JSModuleNamespaceObject::getOwnPropertySlotCommon): (JSC::JSModuleNamespaceObject::moduleExportsListContains): (JSC::JSModuleNamespaceObject::deleteProperty): (JSC::JSModuleNamespaceObject::deletePropertyByIndex): (JSC::JSModuleNamespaceObject::getOwnPropertyNames): (JSC::JSModuleNamespaceObject::defineOwnProperty): * Source/JavaScriptCore/runtime/JSModuleNamespaceObject.h: * Source/JavaScriptCore/runtime/JSModuleRecord.cpp: (JSC::JSModuleRecord::instantiateDeclarations): (JSC::JSModuleRecord::evaluate): (JSC::JSModuleRecord::readyForSyncExecution): * Source/JavaScriptCore/runtime/JSModuleRecord.h: * Source/JavaScriptCore/wasm/js/JSWebAssemblyInstance.cpp: (JSC::JSWebAssemblyInstance::tryCreate):
ce53daf to
76b9ea9
Compare
|
EWS run on current version of this PR (hash 76b9ea9) Details |
🛠 win
76b9ea9
76b9ea9
🧪 api-ios