diff --git a/src/node.js b/src/node.js index 39cae19d60..413c4de464 100644 --- a/src/node.js +++ b/src/node.js @@ -166,6 +166,7 @@ // modules in thier own context. Module._contextLoad = (+process.env['NODE_MODULE_CONTEXTS'] > 0); Module._cache = {}; + Module._pathCache = {}; Module._extensions = {}; Module._paths = []; @@ -216,22 +217,41 @@ // given a path check a the file exists with any of the set extensions function tryExtensions(p, extension) { for (var i = 0, EL = exts.length; i < EL; i++) { - f = tryFile(p + exts[i]); - if (f) { return f; } + var filename = tryFile(p + exts[i]); + + if (filename) { + return filename; + } } return false; }; + var cacheKey = JSON.stringify({request: request, paths: paths}); + if (Module._pathCache[cacheKey]) { + return Module._pathCache[cacheKey]; + } + // For each path for (var i = 0, PL = paths.length; i < PL; i++) { - var p = paths[i], - // try to join the request to the path - f = tryFile(path.resolve(p, request)) || - // try it with each of the extensions - tryExtensions(path.resolve(p, request)) || - // try it with each of the extensions at "index" - tryExtensions(path.resolve(p, request, 'index')); - if (f) { return f; } + var basePath = path.resolve(paths[i], request); + + // try to join the request to the path + var filename = tryFile(basePath); + + if (!filename) { + // try it with each of the extensions + filename = tryExtensions(basePath) + } + + if (!filename) { + // try it with each of the extensions at "index" + filename = tryExtensions(path.resolve(basePath, 'index')) + } + + if (filename) { + Module._pathCache[cacheKey] = filename; + return filename; + } } return false; } diff --git a/test/simple/test-require-cache-without-stat.js b/test/simple/test-require-cache-without-stat.js index 3c76ea760c..b9f000a9a5 100644 --- a/test/simple/test-require-cache-without-stat.js +++ b/test/simple/test-require-cache-without-stat.js @@ -24,9 +24,8 @@ fs.stat = function() { }; // Load the module 'a' and 'http' once. It should become cached. - -var m = common.fixturesDir + '/a'; -require(m); +require.paths.push(common.fixturesDir); +require('a'); require('http'); console.log("counterBefore = %d", counter); @@ -35,7 +34,7 @@ var counterBefore = counter; // Now load the module a bunch of times. // stat should not be called. for (var i = 0; i < 100; i++) { - require(m); + require('a'); } // Do the same with a built-in module