From bb08f0c219bf4ca99b1129f54ef415ce46b01f22 Mon Sep 17 00:00:00 2001 From: isaacs Date: Sun, 19 Sep 2010 16:00:46 -0700 Subject: [PATCH] Remove require.async This patch removes require.async from nodejs. 1. It complicated the code unnecessarily. 2. Everyone uses sync require anyway. 3. It's got a lot of weird edge cases when mixed with sync require. 4. It is many months behind the commonjs spec anyhow. --- src/node.js | 181 +++--------------- .../undefined_reference_in_new_context.out | 4 +- test/simple/test-module-loading.js | 31 --- 3 files changed, 28 insertions(+), 188 deletions(-) diff --git a/src/node.js b/src/node.js index ba07f1e435b..e1bac5a2412 100644 --- a/src/node.js +++ b/src/node.js @@ -106,7 +106,6 @@ var module = (function () { internalModuleCache[id] = m; var e = m._compile(natives[id], id); if (e) throw e; - m.loaded = true; return m; } @@ -172,44 +171,19 @@ var module = (function () { }; } - /* Sync unless callback given */ - function findModulePath (id, dirs, callback) { + function findModulePath (id, dirs) { process.assert(Array.isArray(dirs)); - if (/^https?:\/\//.exec(id)) { - if (callback) { - callback(id); - } else { - throw new Error("Sync http require not allowed."); - } - return; - } - var nextLoc = traverser(id, id.charAt(0) === '/' ? [''] : dirs); var fs = requireNative('fs'); - function searchLocations () { - var location, stats; - while (location = nextLoc()) { - try { stats = fs.statSync(location); } catch(e) { continue; } - if (stats && !stats.isDirectory()) return location; - } - return false; + var location, stats; + while (location = nextLoc()) { + try { stats = fs.statSync(location); } catch(e) { continue; } + if (stats && !stats.isDirectory()) return location; } - - function searchLocationsAsync (cb) { - var location = nextLoc(); - - if (!location) { cb(false); return; } - - fs.stat(location, function (err, stats) { - if (stats && !stats.isDirectory()) { cb(location); } - else { searchLocationsAsync(cb); } - }); - } - - return callback ? searchLocationsAsync(callback) : searchLocations(); + return false; } @@ -235,7 +209,7 @@ var module = (function () { } - function loadModule (request, parent, callback) { + function loadModule (request, parent) { var resolvedModule = resolveModulePath(request, parent), id = resolvedModule[0], paths = resolvedModule[1]; @@ -245,45 +219,27 @@ var module = (function () { // native modules always take precedence. var cachedNative = internalModuleCache[id]; if (cachedNative) { - return callback ? callback(null, cachedNative.exports) : cachedNative.exports; + return cachedNative.exports; } if (natives[id]) { debug('load native module ' + id); - var nativeMod = loadNative(id); - return callback ? callback(null, nativeMod.exports) : nativeMod.exports; + return loadNative(id).exports; } // look up the filename first, since that's the cache key. debug("looking for " + JSON.stringify(id) + " in " + JSON.stringify(paths)); - if (!callback) { - // sync - var filename = findModulePath(request, paths); - if (!filename) { - throw new Error("Cannot find module '" + request + "'"); - } - - var cachedModule = parent.moduleCache[filename]; - if (cachedModule) return cachedModule.exports; - - var module = new Module(id, parent); - module.moduleCache[filename] = module; - module.loadSync(filename); - return module.exports; + var filename = findModulePath(request, paths); + if (!filename) { + throw new Error("Cannot find module '" + request + "'"); } - // async - findModulePath(request, paths, function (filename) { - if (!filename) { - var err = new Error("Cannot find module '" + request + "'"); - return callback(err); - } - var cachedModule = parent.moduleCache[filename]; - if (cachedModule) return callback(null, cachedModule.exports); + var cachedModule = parent.moduleCache[filename]; + if (cachedModule) return cachedModule.exports; - var module = new Module(id, parent); - module.moduleCache[filename] = module; - module.load(filename, callback); - }); + var module = new Module(id, parent); + module.moduleCache[filename] = module; + module.load(filename); + return module.exports; }; @@ -313,63 +269,27 @@ var module = (function () { } - Module.prototype.loadSync = function (filename) { - debug("loadSync " + JSON.stringify(filename) + " for module " + JSON.stringify(this.id)); - - process.assert(!this.loaded); - this.filename = filename; - - if (filename.match(/\.node$/)) { - this._loadObjectSync(filename); - } else { - this._loadScriptSync(filename); - } - }; - - - Module.prototype.load = function (filename, callback) { + Module.prototype.load = function (filename) { debug("load " + JSON.stringify(filename) + " for module " + JSON.stringify(this.id)); process.assert(!this.loaded); - this.filename = filename; if (filename.match(/\.node$/)) { - this._loadObject(filename, callback); + this._loadObject(filename); } else { - this._loadScript(filename, callback); + this._loadScript(filename); } }; - Module.prototype._loadObjectSync = function (filename) { - this.loaded = true; + Module.prototype._loadObject = function (filename) { process.dlopen(filename, this.exports); }; - Module.prototype._loadObject = function (filename, callback) { - var self = this; - // XXX Not yet supporting loading from HTTP. would need to download the - // file, store it to tmp then run dlopen on it. - self.loaded = true; - process.dlopen(filename, self.exports); // FIXME synchronus - if (callback) callback(null, self.exports); - }; - - - function cat (id, callback) { - if (id.match(/^http:\/\//)) { - loadModule('http', process.mainModule, function (err, http) { - if (err) { - if (callback) callback(err); - } else { - http.cat(id, callback); - } - }); - } else { - requireNative('fs').readFile(id, 'utf8', callback); - } + function cat (id) { + requireNative('fs').readFile(id, 'utf8'); } @@ -390,16 +310,11 @@ var module = (function () { return; } - function requireAsync (url, cb) { - loadModule(url, self, cb); - } - function require (path) { return loadModule(path, self); } require.paths = modulePaths; - require.async = requireAsync; require.main = process.mainModule; require.registerExtension = registerExtension; @@ -451,62 +366,18 @@ var module = (function () { }; - Module.prototype._loadScriptSync = function (filename) { + Module.prototype._loadScript = function (filename) { var content = requireNative('fs').readFileSync(filename, 'utf8'); this._compile(content, filename); this.loaded = true; }; - Module.prototype._loadScript = function (filename, callback) { - var self = this; - cat(filename, function (err, content) { - debug('cat done'); - if (err) { - if (callback) callback(err); - } else { - try { - self._compile(content, filename); - } catch (err) { - if (callback) callback(err); - return; - } - - self._waitChildrenLoad(function () { - self.loaded = true; - if (self.onload) self.onload(); - if (callback) callback(null, self.exports); - }); - } - }); - }; - - - Module.prototype._waitChildrenLoad = function (callback) { - var nloaded = 0; - var children = this.children; - for (var i = 0; i < children.length; i++) { - var child = children[i]; - if (child.loaded) { - nloaded++; - } else { - child.onload = function () { - child.onload = null; - nloaded++; - if (children.length == nloaded && callback) callback(); - }; - } - } - if (children.length == nloaded && callback) callback(); - }; - - - // bootstrap main module. exports.runMain = function () { // Load the main module--the command line argument. process.mainModule = new Module("."); - process.mainModule.loadSync(process.argv[1]); + process.mainModule.load(process.argv[1]); } return exports; diff --git a/test/message/undefined_reference_in_new_context.out b/test/message/undefined_reference_in_new_context.out index 7d4e5c5b967..480ef9edd02 100644 --- a/test/message/undefined_reference_in_new_context.out +++ b/test/message/undefined_reference_in_new_context.out @@ -7,8 +7,8 @@ ReferenceError: foo is not defined at evalmachine.:* at *test/message/undefined_reference_in_new_context.js:* at Module._compile (node.js:*) - at Module._loadScriptSync (node.js:*) - at Module.loadSync (node.js:*) + at Module._loadScript (node.js:*) + at Module.load (node.js:*) at Object.runMain (node.js:*) at Array. (node.js:*) at EventEmitter._tickCallback (node.js:*) diff --git a/test/simple/test-module-loading.js b/test/simple/test-module-loading.js index d4ba5dc3dd3..8cadcb9a11d 100644 --- a/test/simple/test-module-loading.js +++ b/test/simple/test-module-loading.js @@ -64,23 +64,8 @@ try { assert.equal("blah", e.message); } -var errorThrownAsync = false; -require.async("../fixtures/throws_error1", function(err, a) { - if (err) { - errorThrownAsync = true; - assert.equal("blah", err.message); - } -}); - assert.equal(require('path').dirname(__filename), __dirname); -var asyncRun = false; -require.async('../fixtures/a1', function (err, a) { - if (err) throw err; - assert.equal("A", a.A()); - asyncRun = true; -}); - common.debug('load custom file types with registerExtension'); require.registerExtension('.test', function(content) { assert.equal("this is custom source\n", content); @@ -113,16 +98,6 @@ try { assert.equal(err.message, "Cannot find module '../fixtures/empty'"); } -var asyncRequireDir = false; -require.async("../fixtures/empty", function (err, a) { - assert.ok(err); - - if (err) { - asyncRequireDir = true; - assert.equal(err.message, "Cannot find module '../fixtures/empty'"); - } -}); - // Check load order is as expected common.debug('load order'); @@ -169,11 +144,5 @@ process.addListener("exit", function () { assert.equal(true, errorThrown); - assert.equal(true, asyncRun); - - assert.equal(true, errorThrownAsync); - - assert.equal(true, asyncRequireDir); - console.log("exit"); });