@@ -321,8 +321,9 @@ function logloads(loads) {
321
321
load . exception = exc ;
322
322
323
323
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
+ }
326
327
327
328
console . assert ( load . linkSets . length == 0 , 'linkSets not removed' ) ;
328
329
} ) ;
@@ -427,14 +428,21 @@ function logloads(loads) {
427
428
// snapshot(linkSet.loader);
428
429
}
429
430
431
+ // linking errors can be generic or load-specific
432
+ // this is necessary for debugging info
430
433
function doLink ( linkSet ) {
434
+ var error = false ;
431
435
try {
432
- link ( linkSet ) ;
436
+ link ( linkSet , function ( load , exc ) {
437
+ linkSetFailed ( linkSet , load , exc ) ;
438
+ error = true ;
439
+ } ) ;
433
440
}
434
- catch ( exc ) {
435
- linkSetFailed ( linkSet , exc ) ;
436
- return true ;
441
+ catch ( e ) {
442
+ linkSetFailed ( linkSet , null , e ) ;
443
+ error = true ;
437
444
}
445
+ return error ;
438
446
}
439
447
440
448
// 15.2.5.2.3
@@ -484,8 +492,14 @@ function logloads(loads) {
484
492
}
485
493
486
494
// 15.2.5.2.4
487
- function linkSetFailed ( linkSet , exc ) {
495
+ function linkSetFailed ( linkSet , load , exc ) {
488
496
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
+
489
503
var loads = linkSet . loads . concat ( [ ] ) ;
490
504
for ( var i = 0 , l = loads . length ; i < l ; i ++ ) {
491
505
var load = loads [ i ] ;
@@ -595,8 +609,22 @@ function logloads(loads) {
595
609
}
596
610
}
597
611
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
+
598
626
// 15.2.5.4
599
- function link ( linkSet ) {
627
+ function link ( linkSet , linkError ) {
600
628
601
629
var loader = linkSet . loader ;
602
630
@@ -631,9 +659,9 @@ function logloads(loads) {
631
659
}
632
660
// 15.2.5.6 LinkDynamicModules adjusted
633
661
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 ;
637
665
load . module = {
638
666
name : load . name ,
639
667
module : module
@@ -796,8 +824,10 @@ function logloads(loads) {
796
824
if ( indexOf . call ( seen , dep ) == - 1 ) {
797
825
err = ensureEvaluated ( dep , seen , loader ) ;
798
826
// 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
+ }
801
831
}
802
832
}
803
833
@@ -811,7 +841,8 @@ function logloads(loads) {
811
841
err = doExecute ( module ) ;
812
842
if ( err ) {
813
843
module . failed = true ;
814
- } else if ( Object . preventExtensions ) {
844
+ }
845
+ else if ( Object . preventExtensions ) {
815
846
// spec variation
816
847
// we don't create a new module here because it was created and ammended
817
848
// we just disable further extensions instead
@@ -822,6 +853,14 @@ function logloads(loads) {
822
853
return err ;
823
854
}
824
855
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
+
825
864
// 26.3 Loader
826
865
827
866
// 26.3.1.1
@@ -1060,7 +1099,7 @@ function logloads(loads) {
1060
1099
var source = doCompile ( load . source , compiler , options . filename ) ;
1061
1100
1062
1101
if ( ! source )
1063
- throw 'Error evaluating module ' + load . address ;
1102
+ throw new Error ( 'Error evaluating module ' + load . address ) ;
1064
1103
1065
1104
var sourceMap = compiler . getSourceMap ( ) ;
1066
1105
0 commit comments