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

Commit ddefbc8

Browse files
committed
Better error message stacks
1 parent 7d5c827 commit ddefbc8

File tree

4 files changed

+63
-23
lines changed

4 files changed

+63
-23
lines changed

src/loader.js

Lines changed: 54 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -321,8 +321,9 @@ function logloads(loads) {
321321
load.exception = exc;
322322

323323
var linkSets = load.linkSets.concat([]);
324-
for (var i = 0, l = linkSets.length; i < l; i++)
325-
linkSetFailed(linkSets[i], exc);
324+
for (var i = 0, l = linkSets.length; i < l; i++) {
325+
linkSetFailed(linkSets[i], load, exc);
326+
}
326327

327328
console.assert(load.linkSets.length == 0, 'linkSets not removed');
328329
});
@@ -427,14 +428,21 @@ function logloads(loads) {
427428
// snapshot(linkSet.loader);
428429
}
429430

431+
// linking errors can be generic or load-specific
432+
// this is necessary for debugging info
430433
function doLink(linkSet) {
434+
var error = false;
431435
try {
432-
link(linkSet);
436+
link(linkSet, function(load, exc) {
437+
linkSetFailed(linkSet, load, exc);
438+
error = true;
439+
});
433440
}
434-
catch(exc) {
435-
linkSetFailed(linkSet, exc);
436-
return true;
441+
catch(e) {
442+
linkSetFailed(linkSet, null, e);
443+
error = true;
437444
}
445+
return error;
438446
}
439447

440448
// 15.2.5.2.3
@@ -484,8 +492,14 @@ function logloads(loads) {
484492
}
485493

486494
// 15.2.5.2.4
487-
function linkSetFailed(linkSet, exc) {
495+
function linkSetFailed(linkSet, load, exc) {
488496
var loader = linkSet.loader;
497+
498+
if (linkSet.loads[0].name != load.name)
499+
exc = addToError(exc, 'Error loading "' + linkSet.loads[0].name + '" at ' + (linkSet.loads[0].address || '<unknown>') + '\n');
500+
501+
exc = addToError(exc, 'Error loading "' + load.name + '" at ' + (load.address || '<unknown>') + '\n');
502+
489503
var loads = linkSet.loads.concat([]);
490504
for (var i = 0, l = loads.length; i < l; i++) {
491505
var load = loads[i];
@@ -595,8 +609,22 @@ function logloads(loads) {
595609
}
596610
}
597611

612+
function doDynamicExecute(linkSet, load, linkError) {
613+
try {
614+
var module = load.execute();
615+
}
616+
catch(e) {
617+
linkError(load, e);
618+
return;
619+
}
620+
if (!module || !(module instanceof Module))
621+
linkError(load, new TypeError('Execution must define a Module instance'));
622+
else
623+
return module;
624+
}
625+
598626
// 15.2.5.4
599-
function link(linkSet) {
627+
function link(linkSet, linkError) {
600628

601629
var loader = linkSet.loader;
602630

@@ -631,9 +659,9 @@ function logloads(loads) {
631659
}
632660
// 15.2.5.6 LinkDynamicModules adjusted
633661
else {
634-
var module = load.execute();
635-
if (!module || !(module instanceof Module))
636-
throw new TypeError('Execution must define a Module instance');
662+
var module = doDynamicExecute(linkSet, load, linkError);
663+
if (!module)
664+
return;
637665
load.module = {
638666
name: load.name,
639667
module: module
@@ -796,8 +824,10 @@ function logloads(loads) {
796824
if (indexOf.call(seen, dep) == -1) {
797825
err = ensureEvaluated(dep, seen, loader);
798826
// stop on error, see https://bugs.ecmascript.org/show_bug.cgi?id=2996
799-
if (err)
800-
return err + '\n in module ' + dep.name;
827+
if (err) {
828+
err = addToError(err, 'Error evaluating ' + dep.name + '\n');
829+
return err;
830+
}
801831
}
802832
}
803833

@@ -811,7 +841,8 @@ function logloads(loads) {
811841
err = doExecute(module);
812842
if (err) {
813843
module.failed = true;
814-
} else if (Object.preventExtensions) {
844+
}
845+
else if (Object.preventExtensions) {
815846
// spec variation
816847
// we don't create a new module here because it was created and ammended
817848
// we just disable further extensions instead
@@ -822,6 +853,14 @@ function logloads(loads) {
822853
return err;
823854
}
824855

856+
function addToError(err, msg) {
857+
if (err instanceof Error)
858+
err.message = msg + err.message;
859+
else
860+
err = msg + err;
861+
return err;
862+
}
863+
825864
// 26.3 Loader
826865

827866
// 26.3.1.1
@@ -1060,7 +1099,7 @@ function logloads(loads) {
10601099
var source = doCompile(load.source, compiler, options.filename);
10611100

10621101
if (!source)
1063-
throw 'Error evaluating module ' + load.address;
1102+
throw new Error('Error evaluating module ' + load.address);
10641103

10651104
var sourceMap = compiler.getSourceMap();
10661105

test/loads/load-non-existent.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import 'non-existent';

test/test.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
<script src="../node_modules/when/es6-shim/Promise.js"></script>
1717

18-
<script src="../dist/es6-module-loader.js"></script>
18+
<script src="../dist/es6-module-loader.src.js"></script>
1919
<script>
2020
// test traceurOptions and anonymous errors
2121
// System.traceurOptions = { classes: false };

test/test.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -307,13 +307,13 @@ function runTests() {
307307
System['import']('loads/main').then(function(m) {
308308
assert(false, true);
309309
}, function(e) {
310-
assert(e, 'dep error\n in module loads/deperror');
310+
assert(e, 'Error evaluating loads/deperror\ndep error');
311311
});
312312
// System['import']('loads/deperror');
313313
});
314314

315315
test('Unhandled rejection test', function(assert) {
316-
System['import']('non-existent');
316+
System['import']('loads/load-non-existent')
317317
assert();
318318
});
319319

@@ -567,27 +567,27 @@ function runTests() {
567567
test('Custom loader hook - normalize error', function(assert) {
568568
customLoader['import']('loader/error1-parent').then(function(m) {
569569
})['catch'](function(e) {
570-
assert(e, 'error1');
570+
assert(e.toString(), 'Error loading "loader/error1-parent" at ' + System.baseURL + 'loader/error1-parent.js\nerror1');
571571
});
572572
});
573573
test('Custom loader hook - locate error', function(assert) {
574574
customLoader['import']('error2').then(function(m) {}, function(e) {
575-
assert(e, 'error2');
575+
assert(e.toString(), 'Error loading "error2" at <unknown>\nerror2');
576576
});
577577
});
578578
test('Custom loader hook - fetch error', function(assert) {
579579
customLoader['import']('error3').then(function(m) {}, function(e) {
580-
assert(e, 'error3');
580+
assert(e.toString(), 'Error loading "error3" at ' + System.baseURL + 'error3.js\nerror3');
581581
});
582582
});
583583
test('Custom loader hook - translate error', function(assert) {
584584
customLoader['import']('error4').then(function(m) {}, function(e) {
585-
assert(e, 'error4');
585+
assert(e.toString(), 'Error loading "error4" at ' + System.baseURL + 'error4.js\nerror4');
586586
});
587587
});
588588
test('Custom loader hook - instantiate error', function(assert) {
589589
customLoader['import']('error5').then(function(m) {}, function(e) {
590-
assert(e, 'error5');
590+
assert(e.toString(), 'Error loading "error5" at ' + System.baseURL + 'error5.js\nerror5');
591591
});
592592
});
593593

0 commit comments

Comments
 (0)