Skip to content

Commit 73be8cf

Browse files
committed
module: reduce ESM ModuleJob memory
Share the empty dependency arrays retained by leaf ModuleJobs instead of allocating separate arrays for each job. Remove unused per-job fields and avoid retaining a default import attributes object when it is not provided. Assisted-by: OpenCode Signed-off-by: Uzini <43294422+Uziniii@users.noreply.github.com>
1 parent ab11f83 commit 73be8cf

1 file changed

Lines changed: 17 additions & 9 deletions

File tree

‎lib/internal/modules/esm/module_job.js‎

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ const {
1010
ArrayPrototypeSort,
1111
FunctionPrototype,
1212
ObjectAssign,
13+
ObjectFreeze,
1314
ObjectSetPrototypeOf,
1415
PromisePrototypeThen,
1516
PromiseResolve,
@@ -61,6 +62,9 @@ const {
6162
} = require('internal/modules/helpers');
6263
const { getOptionValue } = require('internal/options');
6364
const noop = FunctionPrototype;
65+
// Module jobs retain both `linked` and `commonJsDeps`. Share their empty value
66+
// so leaf modules do not each retain two arrays.
67+
const kEmptyModuleDependencies = ObjectFreeze([]);
6468
const {
6569
ERR_REQUIRE_ASYNC_MODULE,
6670
ERR_REQUIRE_ESM_RACE_CONDITION,
@@ -296,9 +300,7 @@ class ModuleJobBase {
296300
constructor(loader, url, importAttributes, phase, isMain, inspectBrk) {
297301
assert(typeof phase === 'number');
298302
this.loader = loader;
299-
this.importAttributes = importAttributes;
300303
this.phase = phase;
301-
this.isMain = isMain;
302304
this.inspectBrk = inspectBrk;
303305

304306
this.url = url;
@@ -317,9 +319,12 @@ class ModuleJobBase {
317319
this.loader.loadCache.set(this.url, this.type, this);
318320
const moduleRequests = this.module.getModuleRequests();
319321
// Modules should be aligned with the moduleRequests array in order.
320-
const modules = Array(moduleRequests.length);
321-
const evaluationDepJobs = [];
322-
this.commonJsDeps = Array(moduleRequests.length);
322+
const modules = moduleRequests.length === 0 ?
323+
kEmptyModuleDependencies : Array(moduleRequests.length);
324+
const evaluationDepJobs = moduleRequests.length === 0 ?
325+
kEmptyModuleDependencies : [];
326+
this.commonJsDeps = moduleRequests.length === 0 ?
327+
kEmptyModuleDependencies : Array(moduleRequests.length);
323328
try {
324329
for (let idx = 0; idx < moduleRequests.length; idx++) {
325330
const request = moduleRequests[idx];
@@ -402,7 +407,7 @@ class ModuleJob extends ModuleJobBase {
402407
* first line paused in the debugger (because --inspect-brk is passed).
403408
* @param {ModuleRequestType} requestType Type of the module request.
404409
*/
405-
constructor(loader, url, importAttributes = { __proto__: null }, moduleOrModulePromise,
410+
constructor(loader, url, importAttributes, moduleOrModulePromise,
406411
phase = kEvaluationPhase, isMain, inspectBrk, requestType) {
407412
super(loader, url, importAttributes, phase, isMain, inspectBrk);
408413

@@ -452,9 +457,12 @@ class ModuleJob extends ModuleJobBase {
452457
// Create an ArrayLike to avoid calling into userspace with `.then`
453458
// when returned from the async function.
454459
// Modules should be aligned with the moduleRequests array in order.
455-
const modulePromises = Array(moduleRequests.length);
456-
const evaluationDepJobs = [];
457-
this.commonJsDeps = Array(moduleRequests.length);
460+
const modulePromises = moduleRequests.length === 0 ?
461+
kEmptyModuleDependencies : Array(moduleRequests.length);
462+
const evaluationDepJobs = moduleRequests.length === 0 ?
463+
kEmptyModuleDependencies : [];
464+
this.commonJsDeps = moduleRequests.length === 0 ?
465+
kEmptyModuleDependencies : Array(moduleRequests.length);
458466
for (let idx = 0; idx < moduleRequests.length; idx++) {
459467
const request = moduleRequests[idx];
460468
// Explicitly keeping track of dependency jobs is needed in order

0 commit comments

Comments
 (0)