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

File tree

7 files changed

+12
-14
lines changed

7 files changed

+12
-14
lines changed

lib/internal/bootstrap/loaders.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -135,9 +135,6 @@ let internalBinding;
135135
};
136136
}
137137

138-
// Create this WeakMap in js-land because V8 has no C++ API for WeakMap.
139-
internalBinding('module_wrap').callbackMap = new WeakMap();
140-
141138
// Think of this as module.exports in this file even though it is not
142139
// written in CommonJS style.
143140
const loaderExports = {

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
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ const {
2929
isContext: _isContext,
3030
compileFunction: _compileFunction
3131
} = internalBinding('contextify');
32-
const { callbackMap } = internalBinding('module_wrap');
3332
const {
3433
ERR_INVALID_ARG_TYPE,
3534
ERR_VM_MODULE_NOT_MODULE,
@@ -100,6 +99,7 @@ class Script extends ContextifyScript {
10099
}
101100
const { wrapMap, linkingStatusMap } =
102101
require('internal/vm/source_text_module');
102+
const { callbackMap } = internalBinding('module_wrap');
103103
callbackMap.set(this, { importModuleDynamically: async (...args) => {
104104
const m = await importModuleDynamically(...args);
105105
if (isModuleNamespaceObject(m)) {

0 commit comments

Comments
 (0)