@@ -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
0 commit comments