Skip to content

[JSC] Add core semantics of import defer#40453

Open
takikawa wants to merge 1 commit intoWebKit:mainfrom
takikawa:deferred-imports-module-semantics-3
Open

[JSC] Add core semantics of import defer#40453
takikawa wants to merge 1 commit intoWebKit:mainfrom
takikawa:deferred-imports-module-semantics-3

Conversation

@takikawa
Copy link
Contributor

@takikawa takikawa commented Feb 12, 2025

76b9ea9

[JSC] Add core semantics of import defer

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):

76b9ea9

Misc iOS, visionOS, tvOS & watchOS macOS Linux Windows
✅ 🧪 style ✅ 🛠 ios ✅ 🛠 mac ✅ 🛠 wpe ✅ 🛠 win
✅ 🛠 ios-sim ✅ 🛠 mac-AS-debug ✅ 🧪 wpe-wk2 ⏳ 🧪 win-tests
✅ 🧪 webkitperl ✅ 🧪 ios-wk2 ✅ 🧪 api-mac ✅ 🧪 api-wpe
✅ 🧪 ios-wk2-wpt ✅ 🧪 mac-wk1 ✅ 🛠 wpe-cairo
✅ 🛠 🧪 jsc 🧪 api-ios ✅ 🧪 mac-wk2 ✅ 🛠 gtk
✅ 🛠 🧪 jsc-arm64 ✅ 🛠 vision ✅ 🧪 mac-AS-debug-wk2 ✅ 🧪 gtk-wk2
✅ 🛠 vision-sim ✅ 🧪 mac-wk2-stress ❌ 🧪 api-gtk
✅ 🧪 vision-wk2 ✅ 🧪 mac-intel-wk2 ✅ 🛠 playstation
✅ 🛠 tv ✅ 🛠 mac-safer-cpp ✅ 🛠 jsc-armv7
✅ 🛠 tv-sim ✅ 🧪 jsc-armv7-tests
✅ 🛠 watch
✅ 🛠 watch-sim

@takikawa takikawa self-assigned this Feb 12, 2025
@takikawa takikawa added the JavaScriptCore For bugs in JavaScriptCore, the JS engine used by WebKit, other than kxmlcore issues. label Feb 12, 2025
@takikawa takikawa force-pushed the deferred-imports-module-semantics-3 branch from 990aba9 to 7c6ef14 Compare February 14, 2025 00:56
@webkit-ews-buildbot webkit-ews-buildbot added the merging-blocked Applied to prevent a change from being merged label Feb 14, 2025
@takikawa
Copy link
Contributor Author

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.

@takikawa takikawa marked this pull request as ready for review February 14, 2025 18:39
@takikawa takikawa requested a review from a team as a code owner February 14, 2025 18:39
@takikawa takikawa removed the merging-blocked Applied to prevent a change from being merged label Feb 17, 2025
@takikawa takikawa force-pushed the deferred-imports-module-semantics-3 branch from 7c6ef14 to d4a1b37 Compare February 17, 2025 22:18
@webkit-ews-buildbot webkit-ews-buildbot added the merging-blocked Applied to prevent a change from being merged label Feb 18, 2025
@takikawa takikawa removed the merging-blocked Applied to prevent a change from being merged label Feb 19, 2025
@takikawa takikawa force-pushed the deferred-imports-module-semantics-3 branch from d4a1b37 to 66474d3 Compare February 19, 2025 23:04
@webkit-ews-buildbot webkit-ews-buildbot added the merging-blocked Applied to prevent a change from being merged label Feb 20, 2025
@webkit-ews-buildbot
Copy link
Collaborator

Safer C++ Build #23293 (66474d3)

❌ Found 1 new failure. Please address these issues before landing. See WebKit Guidelines for Safer C++ Programming.
(cc @rniwa)

@takikawa takikawa removed the merging-blocked Applied to prevent a change from being merged label Feb 20, 2025
@takikawa takikawa force-pushed the deferred-imports-module-semantics-3 branch from 66474d3 to c75cedc Compare February 20, 2025 07:15
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adjusted this signature (use RefPtr) due to Safe C++ checks

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@nicolo-ribaudo
Copy link
Contributor

Het fyi, the proposal reached stage 3 at this week's TC39 meeting :)

Copy link
Contributor Author

@takikawa takikawa Feb 21, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we split this into a separate patch?

@takikawa
Copy link
Contributor Author

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).

@takikawa takikawa force-pushed the deferred-imports-module-semantics-3 branch from c75cedc to bb54087 Compare March 15, 2025 01:37
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Contributor

@justinmichaud justinmichaud left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@takikawa takikawa force-pushed the deferred-imports-module-semantics-3 branch from bb54087 to ce53daf Compare March 26, 2025 22:36
@takikawa
Copy link
Contributor Author

takikawa commented Mar 26, 2025

Thanks for taking a look!

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).

I just added a few more tests for the readyForSyncExecution check to make sure it's being checked for different operations on namespaces. There are some other theoretical exception paths which I think are difficult to trigger with an actual test (e.g., having hostResolveImportModule fail in a readyForSyncExecution call).

Some tests for cycles would be nice, even if they are skipped for now.

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., JSTests/module/import-defer-1-1-cycle.js, etc).

@webkit-ews-buildbot webkit-ews-buildbot added the merging-blocked Applied to prevent a change from being merged label Mar 27, 2025
@kmiller68 kmiller68 requested a review from Constellation April 25, 2025 13:35
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):
@takikawa takikawa removed the merging-blocked Applied to prevent a change from being merged label May 16, 2025
@takikawa takikawa force-pushed the deferred-imports-module-semantics-3 branch from ce53daf to 76b9ea9 Compare May 16, 2025 01:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

JavaScriptCore For bugs in JavaScriptCore, the JS engine used by WebKit, other than kxmlcore issues.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants