module: initialize module_wrap.callbackMap during pre-execution · nodejs/node@4dfe54a · GitHub
Skip to content

Commit 4dfe54a

Browse files
joyeecheungtargos
authored andcommitted
module: initialize module_wrap.callbackMap during pre-execution
Since the bootstrap does not actually use ESM at all, there is no need to create this map so early. This patch moves the initialization of the map to pre-execution, so that the only binding loaded in loaders is native_module. In addition, switch to SafeWeakMap. PR-URL: #27323 Reviewed-By: Gus Caplan <me@gus.host> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
1 parent dd709fc commit 4dfe54a

7 files changed

Lines changed: 12 additions & 14 deletions

File tree

lib/internal/bootstrap/loaders.js

Lines changed: 0 additions & 3 deletions

lib/internal/bootstrap/pre_execution.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict';
22

3-
const { Object } = primordials;
3+
const { Object, SafeWeakMap } = primordials;
44

55
const { getOptionValue } = require('internal/options');
66
const { Buffer } = require('buffer');
@@ -342,6 +342,9 @@ function initializeCJSLoader() {
342342
}
343343

344344
function initializeESMLoader() {
345+
// Create this WeakMap in js-land because V8 has no C++ API for WeakMap.
346+
internalBinding('module_wrap').callbackMap = new SafeWeakMap();
347+
345348
const experimentalModules = getOptionValue('--experimental-modules');
346349
const experimentalVMModules = getOptionValue('--experimental-vm-modules');
347350
if (experimentalModules || experimentalVMModules) {

lib/internal/modules/esm/create_dynamic_module.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
const { ArrayPrototype } = primordials;
44

5-
const { ModuleWrap, callbackMap } = internalBinding('module_wrap');
65
const debug = require('internal/util/debuglog').debuglog('esm');
76

87
const createDynamicModule = (exports, url = '', evaluate) => {
@@ -21,7 +20,7 @@ import.meta.exports.${name} = {
2120
2221
import.meta.done();
2322
`;
24-
23+
const { ModuleWrap, callbackMap } = internalBinding('module_wrap');
2524
const m = new ModuleWrap(source, `${url}`);
2625
m.link(() => 0);
2726
m.instantiate();

lib/internal/modules/esm/translators.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ const {
77
} = primordials;
88

99
const { NativeModule } = require('internal/bootstrap/loaders');
10-
const { ModuleWrap, callbackMap } = internalBinding('module_wrap');
1110
const {
1211
stripShebang,
1312
stripBOM
@@ -45,6 +44,7 @@ async function importModuleDynamically(specifier, { url }) {
4544
translators.set('module', async function moduleStrategy(url) {
4645
const source = `${await readFileAsync(new URL(url))}`;
4746
debug(`Translating StandardModule ${url}`);
47+
const { ModuleWrap, callbackMap } = internalBinding('module_wrap');
4848
const module = new ModuleWrap(stripShebang(source), url);
4949
callbackMap.set(module, {
5050
initializeImportMeta,

lib/internal/process/esm_loader.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
'use strict';
22

3-
const {
4-
callbackMap,
5-
} = internalBinding('module_wrap');
63
const {
74
ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING,
85
} = require('internal/errors').codes;
@@ -14,6 +11,7 @@ const {
1411
} = require('internal/vm/source_text_module');
1512

1613
exports.initializeImportMetaObject = function(wrap, meta) {
14+
const { callbackMap } = internalBinding('module_wrap');
1715
if (callbackMap.has(wrap)) {
1816
const { initializeImportMeta } = callbackMap.get(wrap);
1917
if (initializeImportMeta !== undefined) {
@@ -23,6 +21,7 @@ exports.initializeImportMetaObject = function(wrap, meta) {
2321
};
2422

2523
exports.importModuleDynamicallyCallback = async function(wrap, specifier) {
24+
const { callbackMap } = internalBinding('module_wrap');
2625
if (callbackMap.has(wrap)) {
2726
const { importModuleDynamically } = callbackMap.get(wrap);
2827
if (importModuleDynamically !== undefined) {

lib/internal/vm/source_text_module.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,16 @@ const {
2525
validateString
2626
} = require('internal/validators');
2727

28+
const binding = internalBinding('module_wrap');
2829
const {
2930
ModuleWrap,
30-
callbackMap,
3131
kUninstantiated,
3232
kInstantiating,
3333
kInstantiated,
3434
kEvaluating,
3535
kEvaluated,
3636
kErrored,
37-
} = internalBinding('module_wrap');
37+
} = binding;
3838

3939
const STATUS_MAP = {
4040
[kUninstantiated]: 'uninstantiated',
@@ -116,7 +116,7 @@ class SourceTextModule {
116116
linkingStatusMap.set(this, 'unlinked');
117117
wrapToModuleMap.set(wrap, this);
118118

119-
callbackMap.set(wrap, {
119+
binding.callbackMap.set(wrap, {
120120
initializeImportMeta,
121121
importModuleDynamically: importModuleDynamically ? async (...args) => {
122122
const m = await importModuleDynamically(...args);

lib/vm.js

Lines changed: 1 addition & 1 deletion

0 commit comments

Comments
 (0)