@@ -283,7 +283,7 @@ function logloads(loads) {
283283 return ;
284284
285285 if ( instantiateResult === undefined ) {
286- load . address = load . address || 'anon ' + ++ anonCnt ;
286+ load . address = load . address || '<Anonymous Module ' + ++ anonCnt + '>' ;
287287
288288 // NB instead of load.kind, use load.isDeclarative
289289 load . isDeclarative = true ;
@@ -357,8 +357,9 @@ function logloads(loads) {
357357 load . exception = exc ;
358358
359359 var linkSets = load . linkSets . concat ( [ ] ) ;
360- for ( var i = 0 , l = linkSets . length ; i < l ; i ++ )
361- linkSetFailed ( linkSets [ i ] , exc ) ;
360+ for ( var i = 0 , l = linkSets . length ; i < l ; i ++ ) {
361+ linkSetFailed ( linkSets [ i ] , load , exc ) ;
362+ }
362363
363364 console . assert ( load . linkSets . length == 0 , 'linkSets not removed' ) ;
364365 } ) ;
@@ -463,14 +464,21 @@ function logloads(loads) {
463464 // snapshot(linkSet.loader);
464465 }
465466
467+ // linking errors can be generic or load-specific
468+ // this is necessary for debugging info
466469 function doLink ( linkSet ) {
470+ var error = false ;
467471 try {
468- link ( linkSet ) ;
472+ link ( linkSet , function ( load , exc ) {
473+ linkSetFailed ( linkSet , load , exc ) ;
474+ error = true ;
475+ } ) ;
469476 }
470- catch ( exc ) {
471- linkSetFailed ( linkSet , exc ) ;
472- return true ;
477+ catch ( e ) {
478+ linkSetFailed ( linkSet , null , e ) ;
479+ error = true ;
473480 }
481+ return error ;
474482 }
475483
476484 // 15.2.5.2.3
@@ -520,8 +528,14 @@ function logloads(loads) {
520528 }
521529
522530 // 15.2.5.2.4
523- function linkSetFailed ( linkSet , exc ) {
531+ function linkSetFailed ( linkSet , load , exc ) {
524532 var loader = linkSet . loader ;
533+
534+ if ( linkSet . loads [ 0 ] . name != load . name )
535+ exc = addToError ( exc , 'Error loading "' + load . name + '" from "' + linkSet . loads [ 0 ] . name + '" at ' + ( linkSet . loads [ 0 ] . address || '<unknown>' ) + '\n' ) ;
536+
537+ exc = addToError ( exc , 'Error loading "' + load . name + '" at ' + ( load . address || '<unknown>' ) + '\n' ) ;
538+
525539 var loads = linkSet . loads . concat ( [ ] ) ;
526540 for ( var i = 0 , l = loads . length ; i < l ; i ++ ) {
527541 var load = loads [ i ] ;
@@ -631,8 +645,22 @@ function logloads(loads) {
631645 }
632646 }
633647
648+ function doDynamicExecute ( linkSet , load , linkError ) {
649+ try {
650+ var module = load . execute ( ) ;
651+ }
652+ catch ( e ) {
653+ linkError ( load , e ) ;
654+ return ;
655+ }
656+ if ( ! module || ! ( module instanceof Module ) )
657+ linkError ( load , new TypeError ( 'Execution must define a Module instance' ) ) ;
658+ else
659+ return module ;
660+ }
661+
634662 // 15.2.5.4
635- function link ( linkSet ) {
663+ function link ( linkSet , linkError ) {
636664
637665 var loader = linkSet . loader ;
638666
@@ -667,9 +695,9 @@ function logloads(loads) {
667695 }
668696 // 15.2.5.6 LinkDynamicModules adjusted
669697 else {
670- var module = load . execute ( ) ;
671- if ( ! module || ! ( module instanceof Module ) )
672- throw new TypeError ( 'Execution must define a Module instance' ) ;
698+ var module = doDynamicExecute ( linkSet , load , linkError ) ;
699+ if ( ! module )
700+ return ;
673701 load . module = {
674702 name : load . name ,
675703 module : module
@@ -832,8 +860,10 @@ function logloads(loads) {
832860 if ( indexOf . call ( seen , dep ) == - 1 ) {
833861 err = ensureEvaluated ( dep , seen , loader ) ;
834862 // stop on error, see https://bugs.ecmascript.org/show_bug.cgi?id=2996
835- if ( err )
836- return err + '\n in module ' + dep . name ;
863+ if ( err ) {
864+ err = addToError ( err , 'Error evaluating ' + dep . name + '\n' ) ;
865+ return err ;
866+ }
837867 }
838868 }
839869
@@ -847,7 +877,8 @@ function logloads(loads) {
847877 err = doExecute ( module ) ;
848878 if ( err ) {
849879 module . failed = true ;
850- } else if ( Object . preventExtensions ) {
880+ }
881+ else if ( Object . preventExtensions ) {
851882 // spec variation
852883 // we don't create a new module here because it was created and ammended
853884 // we just disable further extensions instead
@@ -858,6 +889,14 @@ function logloads(loads) {
858889 return err ;
859890 }
860891
892+ function addToError ( err , msg ) {
893+ if ( err instanceof Error )
894+ err . message = msg + err . message ;
895+ else
896+ err = msg + err ;
897+ return err ;
898+ }
899+
861900 // 26.3 Loader
862901
863902 // 26.3.1.1
@@ -1058,6 +1097,16 @@ function logloads(loads) {
10581097 // parse function is used to parse a load record
10591098 // Returns an array of ModuleSpecifiers
10601099 var traceur ;
1100+
1101+ function doCompile ( source , compiler , filename ) {
1102+ try {
1103+ return compiler . compile ( source , filename ) ;
1104+ }
1105+ catch ( e ) {
1106+ // traceur throws an error array
1107+ throw e [ 0 ] ;
1108+ }
1109+ }
10611110 Loader . prototype . parse = function ( load ) {
10621111 if ( ! traceur ) {
10631112 if ( typeof window == 'undefined' &&
@@ -1075,19 +1124,26 @@ function logloads(loads) {
10751124
10761125 load . isDeclarative = true ;
10771126
1078- var options = traceur . options || { } ;
1127+ var options = this . traceurOptions || { } ;
10791128 options . modules = 'instantiate' ;
10801129 options . script = false ;
10811130 options . sourceMaps = true ;
10821131 options . filename = load . address ;
10831132
10841133 var compiler = new traceur . Compiler ( options ) ;
1085- var source = compiler . compile ( load . source , options . filename ) ;
1134+
1135+ var source = doCompile ( load . source , compiler , options . filename ) ;
1136+
1137+ if ( ! source )
1138+ throw new Error ( 'Error evaluating module ' + load . address ) ;
1139+
10861140 var sourceMap = compiler . getSourceMap ( ) ;
10871141
10881142 if ( __global . btoa && sourceMap )
10891143 source += '\n//# sourceMappingURL=data:application/json;base64,' + btoa ( unescape ( encodeURIComponent ( sourceMap ) ) ) + '\n' ;
10901144
1145+ source = 'var __moduleAddress = "' + load . address + '";' + source ;
1146+
10911147 __eval ( source , __global , load ) ;
10921148 }
10931149 } ) ( ) ;
@@ -1119,12 +1175,13 @@ function logloads(loads) {
11191175( function ( ) {
11201176 var isWorker = typeof self !== 'undefined' && typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope ;
11211177 var isBrowser = typeof window != 'undefined' && ! isWorker ;
1178+ var isWindows = typeof process != 'undefined' && ! ! process . platform . match ( / ^ w i n / ) ;
11221179 var Promise = __global . Promise || require ( 'when/es6-shim/Promise' ) ;
11231180
11241181 // Helpers
11251182 // Absolute URL parsing, from https://gist.github.com/Yaffle/1088850
11261183 function parseURI ( url ) {
1127- var m = String ( url ) . replace ( / ^ \s + | \s + $ / g, '' ) . match ( / ^ ( [ ^ : \/ ? # ] + : ) ? ( \/ \/ (?: [ ^ : @ ] * (?: : [ ^ : @ ] * ) ? @ ) ? ( ( [ ^ : \/ ? # ] * ) (?: : ( \d * ) ) ? ) ) ? ( [ ^ ? # ] * ) ( \? [ ^ # ] * ) ? ( # [ \s \S ] * ) ? / ) ;
1184+ var m = String ( url ) . replace ( / ^ \s + | \s + $ / g, '' ) . match ( / ^ ( [ ^ : \/ ? # ] + : ) ? ( \/ \/ (?: [ ^ : @ \/ ? # ] * (?: : [ ^ : @ \/ ? # ] * ) ? @ ) ? ( ( [ ^ : \/ ? # ] * ) (?: : ( \d * ) ) ? ) ) ? ( [ ^ ? # ] * ) ( \? [ ^ # ] * ) ? ( # [ \s \S ] * ) ? / ) ;
11281185 // authority = '//' + user + ':' + pass '@' + hostname + ':' port
11291186 return ( m ? {
11301187 href : m [ 0 ] || '' ,
@@ -1213,7 +1270,12 @@ function logloads(loads) {
12131270 else if ( typeof require != 'undefined' ) {
12141271 var fs ;
12151272 fetchTextFromURL = function ( url , fulfill , reject ) {
1273+ if ( url . substr ( 0 , 5 ) != 'file:' )
1274+ throw 'Only file URLs of the form file: allowed running in Node.' ;
12161275 fs = fs || require ( 'fs' ) ;
1276+ url = url . substr ( 5 ) ;
1277+ if ( isWindows )
1278+ url = url . replace ( / \/ / g, '\\' ) ;
12171279 return fs . readFile ( url , function ( err , data ) {
12181280 if ( err )
12191281 return reject ( err ) ;
@@ -1228,15 +1290,17 @@ function logloads(loads) {
12281290
12291291 var SystemLoader = function ( $__super ) {
12301292 function SystemLoader ( options ) {
1231- $__Object$getPrototypeOf ( SystemLoader . prototype ) . constructor . call ( this , options || { } ) ;
1293+ $__super . call ( this , options || { } ) ;
12321294
12331295 // Set default baseURL and paths
12341296 if ( typeof location != 'undefined' && location . href ) {
12351297 var href = __global . location . href . split ( '#' ) [ 0 ] . split ( '?' ) [ 0 ] ;
12361298 this . baseURL = href . substring ( 0 , href . lastIndexOf ( '/' ) + 1 ) ;
12371299 }
12381300 else if ( typeof process != 'undefined' && process . cwd ) {
1239- this . baseURL = process . cwd ( ) + '/' ;
1301+ this . baseURL = 'file:' + process . cwd ( ) + '/' ;
1302+ if ( isWindows )
1303+ this . baseURL = this . baseURL . replace ( / \\ / g, '/' ) ;
12401304 }
12411305 else {
12421306 throw new TypeError ( 'No environment baseURL' ) ;
@@ -1410,11 +1474,10 @@ function logloads(loads) {
14101474
14111475 function ready ( ) {
14121476 var scripts = document . getElementsByTagName ( 'script' ) ;
1413-
14141477 for ( var i = 0 ; i < scripts . length ; i ++ ) {
14151478 var script = scripts [ i ] ;
14161479 if ( script . type == 'module' ) {
1417- var source = script . innerHTML ;
1480+ var source = script . innerHTML . substr ( 1 ) ;
14181481 System . module ( source ) [ 'catch' ] ( function ( err ) { setTimeout ( function ( ) { throw err ; } ) ; } ) ;
14191482 }
14201483 }
0 commit comments