summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQinhui Chen <lianxuify@gmail.com>2020-04-14 10:58:01 +0800
committerAndrey Pechkurov <apechkurov@gmail.com>2020-04-17 12:35:00 +0300
commit6bcf96840121f2de61def5ad99700fb7eb6ac905 (patch)
tree671d9d71f71067554a6ef0ce930725d0333ed6ec
parent88560ce593f87da3e869813b98edad3330ddac72 (diff)
downloadnode-new-6bcf96840121f2de61def5ad99700fb7eb6ac905.tar.gz
module: fix memory leak when require error occurs
Delete useless module in parent module: parent.children array when error occurs, so that it can be garbage collected. Fixes: https://github.com/nodejs/node/issues/32836 PR-URL: https://github.com/nodejs/node/pull/32837 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: Andrey Pechkurov <apechkurov@gmail.com>
-rw-r--r--lib/internal/modules/cjs/loader.js7
-rw-r--r--test/sequential/test-module-loading.js3
2 files changed, 7 insertions, 3 deletions
diff --git a/lib/internal/modules/cjs/loader.js b/lib/internal/modules/cjs/loader.js
index 96aa4e2ebf..9db2b1e6c1 100644
--- a/lib/internal/modules/cjs/loader.js
+++ b/lib/internal/modules/cjs/loader.js
@@ -928,6 +928,13 @@ Module._load = function(request, parent, isMain) {
delete Module._cache[filename];
if (parent !== undefined) {
delete relativeResolveCache[relResolveCacheIdentifier];
+ const children = parent && parent.children;
+ if (ArrayIsArray(children)) {
+ const index = children.indexOf(module);
+ if (index !== -1) {
+ children.splice(index, 1);
+ }
+ }
}
} else if (module.exports &&
ObjectGetPrototypeOf(module.exports) ===
diff --git a/test/sequential/test-module-loading.js b/test/sequential/test-module-loading.js
index 2e55eb2936..2a5cb5edd0 100644
--- a/test/sequential/test-module-loading.js
+++ b/test/sequential/test-module-loading.js
@@ -302,17 +302,14 @@ assert.throws(
}
},
'fixtures/path.js': {},
- 'fixtures/throws_error.js': {},
'fixtures/registerExt.test': {},
'fixtures/registerExt.hello.world': {},
'fixtures/registerExt2.test': {},
'fixtures/module-load-order/file1': {},
'fixtures/module-load-order/file2.js': {},
- 'fixtures/module-load-order/file3.node': {},
'fixtures/module-load-order/file4.reg': {},
'fixtures/module-load-order/file5.reg2': {},
'fixtures/module-load-order/file6/index.js': {},
- 'fixtures/module-load-order/file7/index.node': {},
'fixtures/module-load-order/file8/index.reg': {},
'fixtures/module-load-order/file9/index.reg2': {},
'fixtures/module-require/parent/index.js': {