Browse Source

Fix test-require-cache-without-stat.js

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
v0.7.4-release
Felix Geisendörfer 14 years ago
committed by Ryan Dahl
parent
commit
0263f01475
  1. 40
      src/node.js
  2. 7
      test/simple/test-require-cache-without-stat.js

40
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;
}

7
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

Loading…
Cancel
Save