Skip to content
This repository was archived by the owner on Jul 13, 2020. It is now read-only.

Commit 999ee5c

Browse files
committed
do propogate module errors with a trace
1 parent 438e344 commit 999ee5c

File tree

2 files changed

+29
-16
lines changed

2 files changed

+29
-16
lines changed

lib/loader.js

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -873,7 +873,7 @@ function logloads(loads) {
873873
function evaluateLoadedModule(loader, load) {
874874
console.assert(load.status == 'linked', 'is linked ' + load.name);
875875

876-
ensureEvaluated(load.module, [], loader);
876+
doEnsureEvaluated(load.module, [], loader);
877877
return load.module.module;
878878
}
879879

@@ -885,20 +885,22 @@ function logloads(loads) {
885885
* module.dependencies list of module objects for dependencies
886886
*
887887
*/
888-
889-
// execution errors don't propogate in the pipeline
890-
// see https://bugs.ecmascript.org/show_bug.cgi?id=2993
891888
function doExecute(module) {
892889
try {
893890
module.execute.call(__global);
894891
}
895892
catch(e) {
896-
setTimeout(function() {
897-
throw e;
898-
});
893+
return e;
899894
}
900895
}
901896

897+
// propogate execution errors
898+
// see https://bugs.ecmascript.org/show_bug.cgi?id=2993
899+
function doEnsureEvaluated(module, seen, loader) {
900+
var err = ensureEvaluated(module, seen, loader);
901+
if (err)
902+
throw err;
903+
}
902904
// 15.2.6.2 EnsureEvaluated adjusted
903905
function ensureEvaluated(module, seen, loader) {
904906
if (module.evaluated || !module.dependencies)
@@ -907,20 +909,31 @@ function logloads(loads) {
907909
seen.push(module);
908910

909911
var deps = module.dependencies;
912+
var err;
910913

911914
for (var i = 0; i < deps.length; i++) {
912915
var dep = deps[i];
913-
if (indexOf.call(seen, dep) == -1)
914-
ensureEvaluated(dep, seen, loader);
916+
if (indexOf.call(seen, dep) == -1) {
917+
err = ensureEvaluated(dep, seen, loader);
918+
// stop on error, see https://bugs.ecmascript.org/show_bug.cgi?id=2996
919+
if (err)
920+
return err + '\n in module ' + dep.name;
921+
}
915922
}
916923

924+
if (module.failed)
925+
return new Error('Module failed execution.');
926+
917927
if (module.evaluated)
918928
return;
919929

920930
module.evaluated = true;
921-
doExecute(module);
931+
err = doExecute(module);
932+
if (err)
933+
module.failed = true;
922934
module.module = _newModule(module.exports);
923-
delete module.execute;
935+
module.execute = undefined;
936+
return err;
924937
}
925938

926939
// 26.3 Loader
@@ -998,7 +1011,7 @@ function logloads(loads) {
9981011
get: function(key) {
9991012
if (!this._loader.modules[key])
10001013
return;
1001-
ensureEvaluated(this._loader.modules[key], [], this);
1014+
doEnsureEvaluated(this._loader.modules[key], [], this);
10021015
return this._loader.modules[key].module;
10031016
},
10041017
// 26.3.3.7
@@ -1016,7 +1029,7 @@ function logloads(loads) {
10161029
var loader = loaderObj._loader;
10171030

10181031
if (loader.modules[name]) {
1019-
ensureEvaluated(loader.modules[name], [], loader._loader);
1032+
doEnsureEvaluated(loader.modules[name], [], loader._loader);
10201033
return loader.modules[name].module;
10211034
}
10221035

@@ -1032,7 +1045,7 @@ function logloads(loads) {
10321045
// 26.3.3.10
10331046
load: function(name, options) {
10341047
if (this._loader.modules[name]) {
1035-
ensureEvaluated(this._loader.modules[name], [], this._loader);
1048+
doEnsureEvaluated(this._loader.modules[name], [], this._loader);
10361049
return Promise.resolve(this._loader.modules[name].module);
10371050
}
10381051
return importPromises[name] || createImportPromise(name, loadModule(this._loader, name, {}));

test/test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -297,9 +297,9 @@ function runTests() {
297297

298298
test('Error check 1', function(assert) {
299299
System['import']('loads/main').then(function(m) {
300-
assert(!!m, true);
300+
assert(false, true);
301301
}, function(e) {
302-
assert(false, 'caught');
302+
assert(e, 'dep error\n in module loads/deperror');
303303
});
304304
// System['import']('loads/deperror');
305305
});

0 commit comments

Comments
 (0)