Skip to content

Commit 3751313

Browse files
committed
Module loading no longer depends on Promise
The module loading code is looking extremely messy. It needs a refactor.
1 parent bcf163d commit 3751313

File tree

1 file changed

+49
-59
lines changed

1 file changed

+49
-59
lines changed

src/node.js

Lines changed: 49 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ function Module (id, parent) {
5757

5858
this.filename = null;
5959
this.loaded = false;
60-
this.loadPromise = null;
6160
this.exited = false;
6261
this.children = [];
6362
};
@@ -929,10 +928,8 @@ function loadModuleSync (request, parent) {
929928
}
930929

931930

932-
function loadModule (request, parent) {
931+
function loadModule (request, parent, callback) {
933932
var
934-
// The promise returned from require.async()
935-
loadPromise = new events.Promise(),
936933
resolvedModule = resolveModulePath(request, parent),
937934
id = resolvedModule[0],
938935
paths = resolvedModule[1];
@@ -942,23 +939,20 @@ function loadModule (request, parent) {
942939
var cachedModule = internalModuleCache[id] || parent.moduleCache[id];
943940
if (cachedModule) {
944941
debug("found " + JSON.stringify(id) + " in cache");
945-
process.nextTick(function() {
946-
loadPromise.emitSuccess(cachedModule.exports);
947-
});
942+
if (callback) callback(null, cachedModule.exports);
948943
} else {
949944
debug("looking for " + JSON.stringify(id) + " in " + JSON.stringify(paths));
950945
// Not in cache
951946
findModulePath(request, paths, function (filename) {
952947
if (!filename) {
953-
loadPromise.emitError(new Error("Cannot find module '" + request + "'"));
948+
var err = new Error("Cannot find module '" + request + "'");
949+
if (callback) callback(err);
954950
} else {
955951
var module = new Module(id, parent);
956-
module.load(filename, loadPromise);
952+
module.load(filename, callback);
957953
}
958954
});
959955
}
960-
961-
return loadPromise;
962956
};
963957

964958

@@ -976,19 +970,17 @@ Module.prototype.loadSync = function (filename) {
976970
};
977971

978972

979-
Module.prototype.load = function (filename, loadPromise) {
973+
Module.prototype.load = function (filename, callback) {
980974
debug("load " + JSON.stringify(filename) + " for module " + JSON.stringify(this.id));
981975

982976
process.assert(!this.loaded);
983-
process.assert(!this.loadPromise);
984977

985-
this.loadPromise = loadPromise;
986978
this.filename = filename;
987979

988980
if (filename.match(/\.node$/)) {
989-
this._loadObject(filename, loadPromise);
981+
this._loadObject(filename, callback);
990982
} else {
991-
this._loadScript(filename, loadPromise);
983+
this._loadScript(filename, callback);
992984
}
993985
};
994986

@@ -999,41 +991,40 @@ Module.prototype._loadObjectSync = function (filename) {
999991
};
1000992

1001993

1002-
Module.prototype._loadObject = function (filename, loadPromise) {
994+
Module.prototype._loadObject = function (filename, callback) {
1003995
var self = this;
1004996
// XXX Not yet supporting loading from HTTP. would need to download the
1005997
// file, store it to tmp then run dlopen on it.
1006-
process.nextTick(function () {
1007-
self.loaded = true;
1008-
process.dlopen(filename, self.exports); // FIXME synchronus
1009-
loadPromise.emitSuccess(self.exports);
1010-
});
998+
self.loaded = true;
999+
process.dlopen(filename, self.exports); // FIXME synchronus
1000+
if (callback) callback(null, self.exports);
10111001
};
10121002

10131003

1014-
function cat (id, loadPromise) {
1015-
var promise;
1016-
1004+
function cat (id, callback) {
10171005
if (id.match(/^http:\/\//)) {
1018-
promise = new events.Promise();
1019-
loadModule('http', process.mainModule)
1020-
.addCallback(function(http) {
1006+
loadModule('http', process.mainModule, function (err, http) {
1007+
if (err) {
1008+
if (callback) callback(err);
1009+
} else {
10211010
http.cat(id)
10221011
.addCallback(function(content) {
1023-
promise.emitSuccess(content);
1012+
if (callback) callback(null, content);
10241013
})
1025-
.addErrback(function() {
1026-
promise.emitError.apply(null, arguments);
1014+
.addErrback(function(err) {
1015+
if (callback) callback(err);
10271016
});
1017+
}
1018+
});
1019+
} else {
1020+
fs.readFile(id)
1021+
.addCallback(function(content) {
1022+
if (callback) callback(null, content);
10281023
})
1029-
.addErrback(function() {
1030-
loadPromise.emitError(new Error("could not load core module \"http\""));
1024+
.addErrback(function(err) {
1025+
if (callback) callback(err);
10311026
});
1032-
} else {
1033-
promise = fs.readFile(id);
10341027
}
1035-
1036-
return promise;
10371028
}
10381029

10391030

@@ -1042,8 +1033,8 @@ Module.prototype._loadContent = function (content, filename) {
10421033
// remove shebang
10431034
content = content.replace(/^\#\!.*/, '');
10441035

1045-
function requireAsync (url) {
1046-
return loadModule(url, self); // new child
1036+
function requireAsync (url, cb) {
1037+
loadModule(url, self, cb);
10471038
}
10481039

10491040
function require (path) {
@@ -1081,24 +1072,23 @@ Module.prototype._loadScriptSync = function (filename) {
10811072
};
10821073

10831074

1084-
Module.prototype._loadScript = function (filename, loadPromise) {
1075+
Module.prototype._loadScript = function (filename, callback) {
10851076
var self = this;
1086-
var catPromise = cat(filename, loadPromise);
1087-
1088-
catPromise.addErrback(function () {
1089-
loadPromise.emitError(new Error("Cannot read " + filename));
1090-
});
1091-
1092-
catPromise.addCallback(function (content) {
1093-
var e = self._loadContent(content, filename);
1094-
if (e) {
1095-
loadPromise.emitError(e);
1096-
return;
1077+
cat(filename, function (err, content) {
1078+
if (err) {
1079+
if (callback) callback(err);
1080+
} else {
1081+
var e = self._loadContent(content, filename);
1082+
if (e) {
1083+
if (callback) callback(e);
1084+
} else {
1085+
self._waitChildrenLoad(function () {
1086+
self.loaded = true;
1087+
if (self.onload) self.onload();
1088+
if (callback) callback(null, self.exports);
1089+
});
1090+
}
10971091
}
1098-
self._waitChildrenLoad(function () {
1099-
self.loaded = true;
1100-
loadPromise.emitSuccess(self.exports);
1101-
});
11021092
});
11031093
};
11041094

@@ -1111,10 +1101,11 @@ Module.prototype._waitChildrenLoad = function (callback) {
11111101
if (child.loaded) {
11121102
nloaded++;
11131103
} else {
1114-
child.loadPromise.addCallback(function () {
1104+
child.onload = function () {
1105+
child.onload = null;
11151106
nloaded++;
11161107
if (children.length == nloaded && callback) callback();
1117-
});
1108+
};
11181109
}
11191110
}
11201111
if (children.length == nloaded && callback) callback();
@@ -1139,8 +1130,7 @@ if (process.argv[1].charAt(0) != "/" && !(/^http:\/\//).exec(process.argv[1])) {
11391130

11401131
// Load the main module--the command line argument.
11411132
process.mainModule = new Module(".");
1142-
var loadPromise = new events.Promise();
1143-
process.mainModule.load(process.argv[1], loadPromise);
1133+
process.mainModule.load(process.argv[1]);
11441134

11451135
// All our arguments are loaded. We've evaluated all of the scripts. We
11461136
// might even have created TCP servers. Now we enter the main eventloop. If

0 commit comments

Comments
 (0)