Skip to content

Commit

Permalink
Fix test-require-cache-without-stat.js
Browse files Browse the repository at this point in the history
This path adds an additional cache to the module system for caching the
location of previously required modules. Since it is embedded in the
loop that iterates over all require.paths, this patch also handles the
case where require.paths is being modified.

The patch also cleans up some code around it.

See: https://groups.google.com/forum/#!topic/nodejs-dev/QGGlrvLDHVs
  • Loading branch information
felixge authored and ry committed Jan 16, 2011
1 parent f39fdf2 commit 0263f01
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 14 deletions.
40 changes: 30 additions & 10 deletions src/node.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 = [];

Expand Down Expand Up @@ -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;
}
Expand Down
7 changes: 3 additions & 4 deletions test/simple/test-require-cache-without-stat.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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
Expand Down

0 comments on commit 0263f01

Please sign in to comment.