-
-
Notifications
You must be signed in to change notification settings - Fork 33.4k
vm: sync-ify SourceTextModule linkage #59000
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Review requested:
|
2262e98
to
af4a107
Compare
af4a107
to
9c18d11
Compare
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #59000 +/- ##
==========================================
+ Coverage 89.85% 89.89% +0.04%
==========================================
Files 667 666 -1
Lines 196260 196459 +199
Branches 38559 38593 +34
==========================================
+ Hits 176341 176608 +267
+ Misses 12368 12287 -81
- Partials 7551 7564 +13
🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is a huge simplification and I really like the new two phase model. Left a few comments.
While this results in three graph walks for a module execution, that is actually right from a development perspective - there is the walk of the developer providing their own graph definitions and hopefully in future these are just partial linking operations. Then there is the main V8 linking / instantiation operation. And finally execution.
// Even top-level Modules without dependencies must be explicitly linked. The | ||
// callback provided would never be called, however. | ||
// | ||
// The link() method returns a Promise that will be resolved when all the | ||
// Promises returned by the linker resolve. | ||
// array passed to `sourceTextModule.linkRequestedModules(modules)` can be | ||
// empty, however. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Shall we not just automatically do this at this point? This could pave the way for even allowing it to be optional even for modules with dependencies under certain linking mode configurations where you could opt-in to the the host fallback on the context say.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Would you mind elaborating on what's been automatically done here? The comment here means that if the moduleRequests
is empty, the sourceTextModule.linkRequestedModules(modules)
still needs to be invoked with an empty array, to indicate that the sourceTextModule
is been linked.
Updated.
doc/api/vm.md
Outdated
return requestedModule; | ||
}); | ||
|
||
module.linkRequestedModules(requestedModules); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is a great design! But I would like to suggest two simplifications:
- Call it
module.linkRequests
instead ofmodule.linkRequestedModules
- Support an object sugar form like
module.linkRequests({ 'foo': moduleMap.get('foo') })
. While this form does not support import attributes, it handles the ergonomic common usage.
In future we likely want to support partial linking as well with host fallbacks for non-explicit linkage. And while both the array form and the object form in (2) can support partial linkage by providing undefined
, it is still more ergonomic as well in the case of (2).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think such shorthands should be a userland pattern, rather than the built-in API pattern. The built-in API should prioritize correctness. It could be a footgun that the built-in API recommends ignoring import attributes.
const moduleRequests = foo.getModuleRequests(); | ||
assert.strictEqual(moduleRequests.length, 2); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is surprising to me - I'd have expected requests to be deduplicated on their unique identity, such that this would be a single request.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
V8 has to expose module requests with different phases, as a v8::ModuleRequest
contains source position info, and an embedder can throw an error with that source position info if the module can not be resolved.
For example, an embedder can throw an error for not supported source phase imports:
import source CssModule from 'index.css'; // Error: Not Supported
import CssModule from 'index.css'; // this is fine
However, duplicated import statements are coalesced into a single module request as the first import should fail for such case.
doc/api/errors.md
Outdated
A module can not be linked due to a mismatch of the requested modules, and the | ||
list of given dependency modules. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It might even make sense to split this into two separate errors:
- ERR_MODULE_PARTIAL_LINK
- ERR_MODULE_INVALID_LINK
Where the invalid case is for more than expected link arguments, but the case of fewer than expected is actually a different thing - it's missing linkage so a partial link, which I hope in future can be supported when enabled.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
IIUC, both of the cases are development time errors. Callers of vm.SourceTextModule.linkModuleRequests(modules)
should pass in an array with the exact length of requested modules.
src/module_wrap.cc
Outdated
context, requests->Get(context, i).As<ModuleRequest>()); | ||
dependent->resolve_cache_[module_cache_key].Reset(isolate, module_object); | ||
|
||
if (resolve_cache.find(module_cache_key) != resolve_cache.end() && |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If we dedupe requests, am I right in thinking this is no longer possible?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If the module requests are dedup-ed ignoring phase
, yes, this is not possible.
577ca22
to
d157629
Compare
38cd995
to
95d888c
Compare
Split `module.link(linker)` into two synchronous step `sourceTextModule.linkRequests()` and `sourceTextModule.instantiate()`. This allows creating vm modules and resolving the dependencies in a complete synchronous procedure. This also makes `syntheticModule.link()` redundant. The link step for a SyntheticModule is no-op and is already taken care in the constructor by initializing the binding slots with the given export names.
95d888c
to
b3e61f0
Compare
@guybedford @joyeecheung CI is green, would you mind taking a look again? Thank you! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Mostly LGTM with some comments
This comment was marked as outdated.
This comment was marked as outdated.
This comment was marked as outdated.
This comment was marked as outdated.
This comment was marked as outdated.
This comment was marked as outdated.
@guybedford @joyeecheung CI is green, would you mind taking a look again? Thanks! |
Landed in 95bef5a |
Split `module.link(linker)` into two synchronous step `sourceTextModule.linkRequests()` and `sourceTextModule.instantiate()`. This allows creating vm modules and resolving the dependencies in a complete synchronous procedure. This also makes `syntheticModule.link()` redundant. The link step for a SyntheticModule is no-op and is already taken care in the constructor by initializing the binding slots with the given export names. PR-URL: #59000 Refs: #37648 Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
This MR contains the following updates: | Package | Update | Change | |---|---|---| | [node](https://nodejs.org) ([source](https://github.com/nodejs/node)) | minor | `24.7.0` -> `24.8.0` | MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot). **Proposed changes to behavior should be submitted there as MRs.** --- ### Release Notes <details> <summary>nodejs/node (node)</summary> ### [`v24.8.0`](https://github.com/nodejs/node/releases/tag/v24.8.0): 2025-09-10, Version 24.8.0 (Current), @​targos [Compare Source](nodejs/node@v24.7.0...v24.8.0) ##### Notable Changes ##### HTTP/2 Network Inspection Support in Node.js Node.js now supports inspection of HTTP/2 network calls in Chrome DevTools for Node.js. ##### Usage Write a `test.js` script that makes HTTP/2 requests. ```js const http2 = require('node:http2'); const client = http2.connect('https://nghttp2.org'); const req = client.request([ ':path', '/', ':method', 'GET', ]); ``` Run it with these options: ```bash node --inspect-wait --experimental-network-inspection test.js ``` Open `about:inspect` on Google Chrome and click on `Open dedicated DevTools for Node`. The `Network` tab will let you track your HTTP/2 calls. Contributed by Darshan Sen in [#​59611](nodejs/node#59611). ##### Other Notable Changes - \[[`7a8e2c251d`](nodejs/node@7a8e2c251d)] - **(SEMVER-MINOR)** **crypto**: support Ed448 and ML-DSA context parameter in node:crypto (Filip Skokan) [#​59570](nodejs/node#59570) - \[[`4b631be0b0`](nodejs/node@4b631be0b0)] - **(SEMVER-MINOR)** **crypto**: support Ed448 and ML-DSA context parameter in Web Cryptography (Filip Skokan) [#​59570](nodejs/node#59570) - \[[`3e4b1e732c`](nodejs/node@3e4b1e732c)] - **(SEMVER-MINOR)** **crypto**: add KMAC Web Cryptography algorithms (Filip Skokan) [#​59647](nodejs/node#59647) - \[[`b1d28785b2`](nodejs/node@b1d28785b2)] - **(SEMVER-MINOR)** **crypto**: add Argon2 Web Cryptography algorithms (Filip Skokan) [#​59544](nodejs/node#59544) - \[[`430691d1af`](nodejs/node@430691d1af)] - **(SEMVER-MINOR)** **crypto**: support SLH-DSA KeyObject, sign, and verify (Filip Skokan) [#​59537](nodejs/node#59537) - \[[`d6d05ba397`](nodejs/node@d6d05ba397)] - **(SEMVER-MINOR)** **worker**: add cpu profile APIs for worker (theanarkh) [#​59428](nodejs/node#59428) ##### Commits - \[[`d913872369`](nodejs/node@d913872369)] - **assert**: cap input size in myersDiff to avoid Int32Array overflow (Haram Jeong) [#​59578](nodejs/node#59578) - \[[`7bbbcf6666`](nodejs/node@7bbbcf6666)] - **benchmark**: sqlite prevent create both tables on prepare selects (Bruno Rodrigues) [#​59709](nodejs/node#59709) - \[[`44d7b92271`](nodejs/node@44d7b92271)] - **benchmark**: calibrate config array-vs-concat (Rafael Gonzaga) [#​59587](nodejs/node#59587) - \[[`7f347fc551`](nodejs/node@7f347fc551)] - **build**: fix getting OpenSSL version on Windows (Michaël Zasso) [#​59609](nodejs/node#59609) - \[[`4a317150d5`](nodejs/node@4a317150d5)] - **build**: fix 'implicit-function-declaration' on OpenHarmony platform (hqzing) [#​59547](nodejs/node#59547) - \[[`bda32af587`](nodejs/node@bda32af587)] - **build**: use `windows-2025` runner (Michaël Zasso) [#​59673](nodejs/node#59673) - \[[`a4a8ed8f6e`](nodejs/node@a4a8ed8f6e)] - **build**: compile bundled uvwasi conditionally (Carlo Cabrera) [#​59622](nodejs/node#59622) - \[[`d944a87761`](nodejs/node@d944a87761)] - **crypto**: refactor subtle methods to use synchronous import (Filip Skokan) [#​59771](nodejs/node#59771) - \[[`7a8e2c251d`](nodejs/node@7a8e2c251d)] - **(SEMVER-MINOR)** **crypto**: support Ed448 and ML-DSA context parameter in node:crypto (Filip Skokan) [#​59570](nodejs/node#59570) - \[[`4b631be0b0`](nodejs/node@4b631be0b0)] - **(SEMVER-MINOR)** **crypto**: support Ed448 and ML-DSA context parameter in Web Cryptography (Filip Skokan) [#​59570](nodejs/node#59570) - \[[`3e4b1e732c`](nodejs/node@3e4b1e732c)] - **(SEMVER-MINOR)** **crypto**: add KMAC Web Cryptography algorithms (Filip Skokan) [#​59647](nodejs/node#59647) - \[[`b1d28785b2`](nodejs/node@b1d28785b2)] - **(SEMVER-MINOR)** **crypto**: add Argon2 Web Cryptography algorithms (Filip Skokan) [#​59544](nodejs/node#59544) - \[[`430691d1af`](nodejs/node@430691d1af)] - **(SEMVER-MINOR)** **crypto**: support SLH-DSA KeyObject, sign, and verify (Filip Skokan) [#​59537](nodejs/node#59537) - \[[`0d1e53d935`](nodejs/node@0d1e53d935)] - **deps**: update uvwasi to 0.0.23 (Node.js GitHub Bot) [#​59791](nodejs/node#59791) - \[[`68732cf426`](nodejs/node@68732cf426)] - **deps**: update histogram to 0.11.9 (Node.js GitHub Bot) [#​59689](nodejs/node#59689) - \[[`f12c1ad961`](nodejs/node@f12c1ad961)] - **deps**: update googletest to [`eb2d85e`](nodejs/node@eb2d85e) (Node.js GitHub Bot) [#​59335](nodejs/node#59335) - \[[`45af6966ae`](nodejs/node@45af6966ae)] - **deps**: upgrade npm to 11.6.0 (npm team) [#​59750](nodejs/node#59750) - \[[`57617244a4`](nodejs/node@57617244a4)] - **deps**: V8: cherry-pick [`6b1b9bc`](nodejs/node@6b1b9bca2a8) (Xiao-Tao) [#​59283](nodejs/node#59283) - \[[`2e6225a747`](nodejs/node@2e6225a747)] - **deps**: update amaro to 1.1.2 (Node.js GitHub Bot) [#​59616](nodejs/node#59616) - \[[`1f7f6dfae6`](nodejs/node@1f7f6dfae6)] - **diagnostics\_channel**: revoke DEP0163 (René) [#​59758](nodejs/node#59758) - \[[`8671a6cdb3`](nodejs/node@8671a6cdb3)] - **doc**: stabilize --disable-sigusr1 (Rafael Gonzaga) [#​59707](nodejs/node#59707) - \[[`583b1b255d`](nodejs/node@583b1b255d)] - **doc**: update OpenSSL default security level to 2 (Jeetu Suthar) [#​59723](nodejs/node#59723) - \[[`9b5eb6eb50`](nodejs/node@9b5eb6eb50)] - **doc**: fix missing links in the `errors` page (Nam Yooseong) [#​59427](nodejs/node#59427) - \[[`e7bf712c57`](nodejs/node@e7bf712c57)] - **doc**: update "Type stripping in dependencies" section (Josh Kelley) [#​59652](nodejs/node#59652) - \[[`96db47f91e`](nodejs/node@96db47f91e)] - **doc**: add Miles Guicent as triager (Miles Guicent) [#​59562](nodejs/node#59562) - \[[`87f829bd0c`](nodejs/node@87f829bd0c)] - **doc**: mark `path.matchesGlob` as stable (Aviv Keller) [#​59572](nodejs/node#59572) - \[[`062b2f705e`](nodejs/node@062b2f705e)] - **doc**: improve documentation for raw headers in HTTP/2 APIs (Tim Perry) [#​59633](nodejs/node#59633) - \[[`6ab9306370`](nodejs/node@6ab9306370)] - **doc**: update install\_tools.bat free disk space (Stefan Stojanovic) [#​59579](nodejs/node#59579) - \[[`c8d6b60da6`](nodejs/node@c8d6b60da6)] - **doc**: fix quic session instance typo (jakecastelli) [#​59642](nodejs/node#59642) - \[[`61d0a2d1ba`](nodejs/node@61d0a2d1ba)] - **doc**: fix filehandle.read typo (Ruy Adorno) [#​59635](nodejs/node#59635) - \[[`3276bfa0d0`](nodejs/node@3276bfa0d0)] - **doc**: update migration recomendations for `util.is**()` deprecations (Augustin Mauroy) [#​59269](nodejs/node#59269) - \[[`11de6c7ebb`](nodejs/node@11de6c7ebb)] - **doc**: fix missing link to the Error documentation in the `http` page (Alexander Makarenko) [#​59080](nodejs/node#59080) - \[[`f5b6829bba`](nodejs/node@f5b6829bba)] - **doc,crypto**: add description to the KEM and supports() methods (Filip Skokan) [#​59644](nodejs/node#59644) - \[[`5bfdc7ee74`](nodejs/node@5bfdc7ee74)] - **doc,crypto**: cleanup unlinked and self method references webcrypto.md (Filip Skokan) [#​59608](nodejs/node#59608) - \[[`010458d061`](nodejs/node@010458d061)] - **esm**: populate separate cache for require(esm) in imported CJS (Joyee Cheung) [#​59679](nodejs/node#59679) - \[[`dbe6e63baf`](nodejs/node@dbe6e63baf)] - **esm**: fix missed renaming in ModuleJob.runSync (Joyee Cheung) [#​59724](nodejs/node#59724) - \[[`8eb0d9d834`](nodejs/node@8eb0d9d834)] - **fs**: fix wrong order of file names in cpSync error message (Nicholas Paun) [#​59775](nodejs/node#59775) - \[[`e69be5611f`](nodejs/node@e69be5611f)] - **fs**: fix dereference: false on cpSync (Nicholas Paun) [#​59681](nodejs/node#59681) - \[[`2865d2ac20`](nodejs/node@2865d2ac20)] - **http**: unbreak keepAliveTimeoutBuffer (Robert Nagy) [#​59784](nodejs/node#59784) - \[[`ade1175475`](nodejs/node@ade1175475)] - **http**: use cached '1.1' http version string (Robert Nagy) [#​59717](nodejs/node#59717) - \[[`74a09482de`](nodejs/node@74a09482de)] - **inspector**: undici as shared-library should pass tests (Aras Abbasi) [#​59837](nodejs/node#59837) - \[[`772f8f415a`](nodejs/node@772f8f415a)] - **inspector**: add http2 tracking support (Darshan Sen) [#​59611](nodejs/node#59611) - \[[`3d225572d7`](nodejs/node@3d225572d7)] - ***Revert*** "**lib**: optimize writable stream buffer clearing" (Yoo) [#​59743](nodejs/node#59743) - \[[`4fd213ce73`](nodejs/node@4fd213ce73)] - **lib**: fix isReadable and isWritable return type value (Gabriel Quaresma) [#​59089](nodejs/node#59089) - \[[`39befddb87`](nodejs/node@39befddb87)] - **lib**: prefer TypedArrayPrototype primordials (Filip Skokan) [#​59766](nodejs/node#59766) - \[[`0748160d2e`](nodejs/node@0748160d2e)] - **lib**: fix DOMException subclass support (Chengzhong Wu) [#​59680](nodejs/node#59680) - \[[`1a93df808c`](nodejs/node@1a93df808c)] - **lib**: revert to using default derived class constructors (René) [#​59650](nodejs/node#59650) - \[[`bb0755df37`](nodejs/node@bb0755df37)] - **meta**: bump `codecov/codecov-action` (dependabot\[bot]) [#​59726](nodejs/node#59726) - \[[`45d148d9be`](nodejs/node@45d148d9be)] - **meta**: bump actions/download-artifact from 4.3.0 to 5.0.0 (dependabot\[bot]) [#​59729](nodejs/node#59729) - \[[`01b66b122e`](nodejs/node@01b66b122e)] - **meta**: bump github/codeql-action from 3.29.2 to 3.30.0 (dependabot\[bot]) [#​59728](nodejs/node#59728) - \[[`34f7ab5502`](nodejs/node@34f7ab5502)] - **meta**: bump actions/cache from 4.2.3 to 4.2.4 (dependabot\[bot]) [#​59727](nodejs/node#59727) - \[[`5806ea02af`](nodejs/node@5806ea02af)] - **meta**: bump actions/checkout from 4.2.2 to 5.0.0 (dependabot\[bot]) [#​59725](nodejs/node#59725) - \[[`f667215583`](nodejs/node@f667215583)] - **path**: refactor path joining logic for clarity and performance (Lee Jiho) [#​59781](nodejs/node#59781) - \[[`0340fe92a6`](nodejs/node@0340fe92a6)] - **repl**: do not cause side effects in tab completion (Anna Henningsen) [#​59774](nodejs/node#59774) - \[[`a414c1eb51`](nodejs/node@a414c1eb51)] - **repl**: fix REPL completion under unary expressions (Kingsword) [#​59744](nodejs/node#59744) - \[[`c206f8dd87`](nodejs/node@c206f8dd87)] - **repl**: add isValidParentheses check before wrap input (Xuguang Mei) [#​59607](nodejs/node#59607) - \[[`0bf9775ee2`](nodejs/node@0bf9775ee2)] - **sea**: implement sea.getAssetKeys() (Joyee Cheung) [#​59661](nodejs/node#59661) - \[[`bf26b478d8`](nodejs/node@bf26b478d8)] - **sea**: allow using inspector command line flags with SEA (Joyee Cheung) [#​59568](nodejs/node#59568) - \[[`92128a8fe2`](nodejs/node@92128a8fe2)] - **src**: use DictionaryTemplate for node\_url\_pattern (James M Snell) [#​59802](nodejs/node#59802) - \[[`bcb29fb84f`](nodejs/node@bcb29fb84f)] - **src**: correctly report memory changes to V8 (Yaksh Bariya) [#​59623](nodejs/node#59623) - \[[`44c24657d3`](nodejs/node@44c24657d3)] - **src**: fixup node\_messaging error handling (James M Snell) [#​59792](nodejs/node#59792) - \[[`2cd6a3b7ec`](nodejs/node@2cd6a3b7ec)] - **src**: track async resources via pointers to stack-allocated handles (Anna Henningsen) [#​59704](nodejs/node#59704) - \[[`34d752586f`](nodejs/node@34d752586f)] - **src**: fix build on NetBSD (Thomas Klausner) [#​59718](nodejs/node#59718) - \[[`15fa779ac5`](nodejs/node@15fa779ac5)] - **src**: fix race on process exit and off thread CA loading (Chengzhong Wu) [#​59632](nodejs/node#59632) - \[[`15cbd3966a`](nodejs/node@15cbd3966a)] - **src**: separate module.hasAsyncGraph and module.hasTopLevelAwait (Joyee Cheung) [#​59675](nodejs/node#59675) - \[[`88d1ca8990`](nodejs/node@88d1ca8990)] - **src**: use non-deprecated Get/SetPrototype methods (Michaël Zasso) [#​59671](nodejs/node#59671) - \[[`56ac9a2d46`](nodejs/node@56ac9a2d46)] - **src**: migrate WriteOneByte to WriteOneByteV2 (Chengzhong Wu) [#​59634](nodejs/node#59634) - \[[`3d88aa9f2f`](nodejs/node@3d88aa9f2f)] - **src**: remove duplicate code (theanarkh) [#​59649](nodejs/node#59649) - \[[`0718a70b2a`](nodejs/node@0718a70b2a)] - **src**: add name for more threads (theanarkh) [#​59601](nodejs/node#59601) - \[[`0379a8b254`](nodejs/node@0379a8b254)] - **src**: remove JSONParser (Joyee Cheung) [#​59619](nodejs/node#59619) - \[[`90d0a1b2e9`](nodejs/node@90d0a1b2e9)] - **src,sqlite**: refactor value conversion (Edy Silva) [#​59659](nodejs/node#59659) - \[[`5e025c7ca7`](nodejs/node@5e025c7ca7)] - **stream**: replace manual function validation with validateFunction (방진혁) [#​59529](nodejs/node#59529) - \[[`155a999bed`](nodejs/node@155a999bed)] - **test**: skip tests failing when run under root (Livia Medeiros) [#​59779](nodejs/node#59779) - \[[`6313706c69`](nodejs/node@6313706c69)] - **test**: update WPT for urlpattern to [`cff1ac1`](nodejs/node@cff1ac1123) (Node.js GitHub Bot) [#​59602](nodejs/node#59602) - \[[`41245ad4c7`](nodejs/node@41245ad4c7)] - **test**: skip more sea tests on Linux ppc64le (Richard Lau) [#​59755](nodejs/node#59755) - \[[`df63d37ec4`](nodejs/node@df63d37ec4)] - **test**: fix internet/test-dns (Michaël Zasso) [#​59660](nodejs/node#59660) - \[[`1f6c335e82`](nodejs/node@1f6c335e82)] - **test**: mark test-inspector-network-fetch as flaky again (Joyee Cheung) [#​59640](nodejs/node#59640) - \[[`1798683df1`](nodejs/node@1798683df1)] - **test**: skip test-fs-cp\* tests that are constantly failing on Windows (Joyee Cheung) [#​59637](nodejs/node#59637) - \[[`4c48ec09e5`](nodejs/node@4c48ec09e5)] - **test**: deflake test-http-keep-alive-empty-line (Luigi Pinca) [#​59595](nodejs/node#59595) - \[[`dcdb259e85`](nodejs/node@dcdb259e85)] - **test\_runner**: fix todo inheritance (Moshe Atlow) [#​59721](nodejs/node#59721) - \[[`24177973a2`](nodejs/node@24177973a2)] - **test\_runner**: set mock timer's interval undefined (hotpineapple) [#​59479](nodejs/node#59479) - \[[`83d11f8a7a`](nodejs/node@83d11f8a7a)] - **tools**: print appropriate output when test aborted (hotpineapple) [#​59794](nodejs/node#59794) - \[[`1eca2cc548`](nodejs/node@1eca2cc548)] - **tools**: use sparse checkout in `build-tarball.yml` (Antoine du Hamel) [#​59788](nodejs/node#59788) - \[[`89fa1a929d`](nodejs/node@89fa1a929d)] - **tools**: remove unused actions from `build-tarball.yml` (Antoine du Hamel) [#​59787](nodejs/node#59787) - \[[`794ca3511d`](nodejs/node@794ca3511d)] - **tools**: do not attempt to compress tgz archive (Antoine du Hamel) [#​59785](nodejs/node#59785) - \[[`377bdb9b7e`](nodejs/node@377bdb9b7e)] - **tools**: add v8windbg target (Chengzhong Wu) [#​59767](nodejs/node#59767) - \[[`6696d1d6c9`](nodejs/node@6696d1d6c9)] - **tools**: improve error handling in node\_mksnapshot (James M Snell) [#​59437](nodejs/node#59437) - \[[`8dbd0f13e8`](nodejs/node@8dbd0f13e8)] - **tools**: add sccache to `test-internet` workflow (Antoine du Hamel) [#​59720](nodejs/node#59720) - \[[`6523c2d7d9`](nodejs/node@6523c2d7d9)] - **tools**: update gyp-next to 0.20.4 (Node.js GitHub Bot) [#​59690](nodejs/node#59690) - \[[`19d633f40c`](nodejs/node@19d633f40c)] - **tools**: add script to make reviewing backport MRs easier (Antoine du Hamel) [#​59161](nodejs/node#59161) - \[[`15e547b3a4`](nodejs/node@15e547b3a4)] - **typings**: add typing for 'uv' (방진혁) [#​59606](nodejs/node#59606) - \[[`ad5cfcc901`](nodejs/node@ad5cfcc901)] - **typings**: add missing properties in ConfigBinding (Lee Jiho) [#​59585](nodejs/node#59585) - \[[`70d2d6d479`](nodejs/node@70d2d6d479)] - **url**: add err.input to ERR\_INVALID\_FILE\_URL\_PATH (Joyee Cheung) [#​59730](nodejs/node#59730) - \[[`e476e43c17`](nodejs/node@e476e43c17)] - **util**: fix numericSeparator with negative fractional numbers (sangwook) [#​59379](nodejs/node#59379) - \[[`b2e8f40d15`](nodejs/node@b2e8f40d15)] - **util**: remove unnecessary template strings (btea) [#​59201](nodejs/node#59201) - \[[`6f79450ea2`](nodejs/node@6f79450ea2)] - **util**: remove outdated TODO comment (haramjeong) [#​59760](nodejs/node#59760) - \[[`32731432ef`](nodejs/node@32731432ef)] - **util**: use getOptionValue('--no-deprecation') in deprecated() (haramjeong) [#​59760](nodejs/node#59760) - \[[`65e4e68c90`](nodejs/node@65e4e68c90)] - **util**: hide duplicated stack frames when using util.inspect (Ruben Bridgewater) [#​59447](nodejs/node#59447) - \[[`2086f3365f`](nodejs/node@2086f3365f)] - **vm**: sync-ify SourceTextModule linkage (Chengzhong Wu) [#​59000](nodejs/node#59000) - \[[`c16163511d`](nodejs/node@c16163511d)] - **wasi**: fix `clean` target in `test/wasi/Makefile` (Antoine du Hamel) [#​59576](nodejs/node#59576) - \[[`2e54411cb6`](nodejs/node@2e54411cb6)] - **worker**: optimize cpu profile implement (theanarkh) [#​59683](nodejs/node#59683) - \[[`d6d05ba397`](nodejs/node@d6d05ba397)] - **(SEMVER-MINOR)** **worker**: add cpu profile APIs for worker (theanarkh) [#​59428](nodejs/node#59428) </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this MR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box --- This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS45OS45IiwidXBkYXRlZEluVmVyIjoiNDEuOTkuOSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiUmVub3ZhdGUgQm90Il19-->
This doesn't land cleanly on v22.x-staging so a manual backport will be necessary if this is to be released there. |
Split
module.link(linker)
into two synchronous stepsourceTextModule.linkRequests()
andsourceTextModule.instantiate()
. This allows creating vm modules andresolving the dependencies in a complete synchronous procedure.
This also makes
syntheticModule.link()
redundant. The link step for aSyntheticModule is no-op and is already taken care in the constructor
by initializing the binding slots with the given export names.
This also enables (static) source phase import in
vm.SourceTextModule
s.Refs: #37648