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

Loading…
Cancel
Save