@@ -226,8 +226,14 @@ class Compilation extends Tapable {
226226
227227 addModule ( module , cacheGroup ) {
228228 const identifier = module . identifier ( ) ;
229- if ( this . _modules . get ( identifier ) ) {
230- return false ;
229+ const alreadyAddedModule = this . _modules . get ( identifier ) ;
230+ if ( alreadyAddedModule ) {
231+ return {
232+ module : alreadyAddedModule ,
233+ issuer : false ,
234+ build : false ,
235+ dependencies : false
236+ } ;
231237 }
232238 const cacheName = ( cacheGroup || "m" ) + identifier ;
233239 if ( this . cache && this . cache [ cacheName ] ) {
@@ -244,16 +250,27 @@ class Compilation extends Tapable {
244250 this . modules . push ( cacheModule ) ;
245251 cacheModule . errors . forEach ( err => this . errors . push ( err ) ) ;
246252 cacheModule . warnings . forEach ( err => this . warnings . push ( err ) ) ;
247- return cacheModule ;
253+ return {
254+ module : cacheModule ,
255+ issuer : true ,
256+ build : false ,
257+ dependencies : true
258+ } ;
248259 }
249- module . unbuild ( ) ;
260+ cacheModule . unbuild ( ) ;
261+ module = cacheModule ;
250262 }
251263 this . _modules . set ( identifier , module ) ;
252264 if ( this . cache ) {
253265 this . cache [ cacheName ] = module ;
254266 }
255267 this . modules . push ( module ) ;
256- return true ;
268+ return {
269+ module : module ,
270+ issuer : true ,
271+ build : true ,
272+ dependencies : true
273+ } ;
257274 }
258275
259276 getModule ( module ) {
@@ -371,6 +388,7 @@ class Compilation extends Tapable {
371388 addModuleDependencies ( module , dependencies , bail , cacheGroup , recursive , callback ) {
372389 let _this = this ;
373390 const start = _this . profile && Date . now ( ) ;
391+ const currentProfile = _this . profile && { } ;
374392
375393 asyncLib . forEach ( dependencies , ( item , callback ) => {
376394 const dependencies = item . dependencies ;
@@ -420,14 +438,6 @@ class Compilation extends Tapable {
420438 }
421439 } ;
422440
423- const iterationDependencies = depend => {
424- for ( let index = 0 ; index < depend . length ; index ++ ) {
425- const dep = depend [ index ] ;
426- dep . module = dependentModule ;
427- dependentModule . addReason ( module , dep ) ;
428- }
429- } ;
430-
431441 if ( err ) {
432442 semaphore . release ( ) ;
433443 return errorOrWarningAndCallback ( new ModuleNotFoundError ( module , err , dependencies ) ) ;
@@ -436,94 +446,83 @@ class Compilation extends Tapable {
436446 semaphore . release ( ) ;
437447 return process . nextTick ( callback ) ;
438448 }
439- if ( _this . profile ) {
440- if ( ! dependentModule . profile ) {
441- dependentModule . profile = { } ;
442- }
449+ if ( currentProfile ) {
443450 afterFactory = Date . now ( ) ;
444- dependentModule . profile . factory = afterFactory - start ;
451+ currentProfile . factory = afterFactory - start ;
445452 }
446453
447- const newModule = _this . addModule ( dependentModule , cacheGroup ) ;
448-
449- if ( ! newModule ) { // from cache
450- dependentModule = _this . getModule ( dependentModule ) ;
451-
452- iterationDependencies ( dependencies ) ;
453-
454- if ( _this . profile ) {
455- if ( ! module . profile ) {
456- module . profile = { } ;
457- }
458- const time = Date . now ( ) - start ;
459- if ( ! module . profile . dependencies || time > module . profile . dependencies ) {
460- module . profile . dependencies = time ;
461- }
454+ const iterationDependencies = depend => {
455+ for ( let index = 0 ; index < depend . length ; index ++ ) {
456+ const dep = depend [ index ] ;
457+ dep . module = dependentModule ;
458+ dependentModule . addReason ( module , dep ) ;
462459 }
460+ } ;
463461
464- semaphore . release ( ) ;
465- _this . waitForBuildingFinished ( dependentModule , callback ) ;
466- return ;
467- }
462+ const addModuleResult = _this . addModule ( dependentModule , cacheGroup ) ;
463+ dependentModule = addModuleResult . module ;
464+ iterationDependencies ( dependencies ) ;
468465
469- if ( newModule instanceof Module ) {
470- if ( _this . profile ) {
471- newModule . profile = dependentModule . profile ;
466+ const afterBuild = ( ) => {
467+ if ( currentProfile ) {
468+ const afterBuilding = Date . now ( ) ;
469+ currentProfile . building = afterBuilding - afterFactory ;
472470 }
473471
474- newModule . issuer = module ;
475- dependentModule = newModule ;
476-
477- iterationDependencies ( dependencies ) ;
472+ if ( recursive && addModuleResult . dependencies ) {
473+ _this . processModuleDependencies ( dependentModule , callback ) ;
474+ } else {
475+ return callback ( ) ;
476+ }
477+ } ;
478478
479- if ( _this . profile ) {
480- const afterBuilding = Date . now ( ) ;
481- module . profile . building = afterBuilding - afterFactory ;
479+ if ( addModuleResult . issuer ) {
480+ if ( currentProfile ) {
481+ dependentModule . profile = currentProfile ;
482482 }
483483
484- semaphore . release ( ) ;
485- if ( recursive ) {
486- return process . nextTick ( _this . processModuleDependencies . bind ( _this , dependentModule , callback ) ) ;
487- } else {
488- return process . nextTick ( callback ) ;
484+ dependentModule . issuer = module ;
485+ } else {
486+ if ( _this . profile ) {
487+ if ( module . profile ) {
488+ const time = Date . now ( ) - start ;
489+ if ( ! module . profile . dependencies || time > module . profile . dependencies ) {
490+ module . profile . dependencies = time ;
491+ }
492+ }
489493 }
490494 }
491495
492- dependentModule . issuer = module ;
496+ if ( addModuleResult . build ) {
497+ _this . buildModule ( dependentModule , isOptional ( ) , module , dependencies , err => {
498+ if ( _this === null ) return semaphore . release ( ) ;
493499
494- iterationDependencies ( dependencies ) ;
500+ if ( err ) {
501+ semaphore . release ( ) ;
502+ return errorOrWarningAndCallback ( err ) ;
503+ }
495504
496- _this . buildModule ( dependentModule , isOptional ( ) , module , dependencies , err => {
497- if ( _this === null ) return semaphore . release ( ) ;
505+ if ( currentProfile ) {
506+ const afterBuilding = Date . now ( ) ;
507+ currentProfile . building = afterBuilding - afterFactory ;
508+ }
498509
499- if ( err ) {
500510 semaphore . release ( ) ;
501- return errorOrWarningAndCallback ( err ) ;
502- }
503-
504- if ( _this . profile ) {
505- const afterBuilding = Date . now ( ) ;
506- dependentModule . profile . building = afterBuilding - afterFactory ;
507- }
508-
511+ afterBuild ( ) ;
512+ } ) ;
513+ } else {
509514 semaphore . release ( ) ;
510- if ( recursive ) {
511- _this . processModuleDependencies ( dependentModule , callback ) ;
512- } else {
513- return callback ( ) ;
514- }
515- } ) ;
516-
515+ _this . waitForBuildingFinished ( dependentModule , afterBuild ) ;
516+ }
517517 } ) ;
518518 } ) ;
519519 } , err => {
520520 // In V8, the Error objects keep a reference to the functions on the stack. These warnings &
521521 // errors are created inside closures that keep a reference to the Compilation, so errors are
522- // leaking the Compilation object. Setting _this to null workarounds the following issue in V8.
523- // https://bugs.chromium.org/p/chromium/issues/detail?id=612191
524- _this = null ;
522+ // leaking the Compilation object.
525523
526524 if ( err ) {
525+ err . stack = err . stack ;
527526 return callback ( err ) ;
528527 }
529528
@@ -533,6 +532,7 @@ class Compilation extends Tapable {
533532
534533 _addModuleChain ( context , dependency , onModule , callback ) {
535534 const start = this . profile && Date . now ( ) ;
535+ const currentProfile = this . profile && { } ;
536536
537537 const errorAndCallback = this . bail ? ( err ) => {
538538 callback ( err ) ;
@@ -567,81 +567,60 @@ class Compilation extends Tapable {
567567
568568 let afterFactory ;
569569
570- if ( this . profile ) {
571- if ( ! module . profile ) {
572- module . profile = { } ;
573- }
570+ if ( currentProfile ) {
574571 afterFactory = Date . now ( ) ;
575- module . profile . factory = afterFactory - start ;
572+ currentProfile . factory = afterFactory - start ;
576573 }
577574
578- const result = this . addModule ( module ) ;
579- if ( ! result ) {
580- module = this . getModule ( module ) ;
575+ const addModuleResult = this . addModule ( module ) ;
576+ module = addModuleResult . module ;
581577
582- onModule ( module ) ;
578+ onModule ( module ) ;
583579
584- dependency . module = module ;
585- module . addReason ( null , dependency ) ;
580+ dependency . module = module ;
581+ module . addReason ( null , dependency ) ;
586582
587- if ( this . profile ) {
583+ const afterBuild = ( ) => {
584+ if ( currentProfile ) {
588585 const afterBuilding = Date . now ( ) ;
589- module . profile . building = afterBuilding - afterFactory ;
586+ currentProfile . building = afterBuilding - afterFactory ;
590587 }
591588
592- this . semaphore . release ( ) ;
593- this . waitForBuildingFinished ( module , err => {
594- if ( err ) return callback ( err ) ;
595- callback ( null , module ) ;
596- } ) ;
597- return ;
598- }
599-
600- const moduleReady = ( ) => {
601- this . semaphore . release ( ) ;
602- this . processModuleDependencies ( module , err => {
603- if ( err ) {
604- return callback ( err ) ;
605- }
606-
589+ if ( addModuleResult . dependencies ) {
590+ this . processModuleDependencies ( module , err => {
591+ if ( err ) return callback ( err ) ;
592+ callback ( null , module ) ;
593+ } ) ;
594+ } else {
607595 return callback ( null , module ) ;
608- } ) ;
596+ }
609597 } ;
610598
611- if ( result instanceof Module ) {
612- if ( this . profile ) {
613- result . profile = module . profile ;
599+ if ( addModuleResult . issuer ) {
600+ if ( currentProfile ) {
601+ module . profile = currentProfile ;
614602 }
615-
616- module = result ;
617-
618- onModule ( module ) ;
619-
620- dependency . module = module ;
621- module . addReason ( null , dependency ) ;
622-
623- moduleReady ( ) ;
624- return ;
625603 }
626604
627- onModule ( module ) ;
605+ if ( addModuleResult . build ) {
606+ this . buildModule ( module , false , null , null , err => {
607+ if ( err ) {
608+ this . semaphore . release ( ) ;
609+ return errorAndCallback ( err ) ;
610+ }
628611
629- dependency . module = module ;
630- module . addReason ( null , dependency ) ;
612+ if ( currentProfile ) {
613+ const afterBuilding = Date . now ( ) ;
614+ currentProfile . building = afterBuilding - afterFactory ;
615+ }
631616
632- this . buildModule ( module , false , null , null , err => {
633- if ( err ) {
634617 this . semaphore . release ( ) ;
635- return errorAndCallback ( err ) ;
636- }
637-
638- if ( this . profile ) {
639- const afterBuilding = Date . now ( ) ;
640- module . profile . building = afterBuilding - afterFactory ;
641- }
642-
643- moduleReady ( ) ;
644- } ) ;
618+ afterBuild ( ) ;
619+ } ) ;
620+ } else {
621+ this . semaphore . release ( ) ;
622+ this . waitForBuildingFinished ( module , afterBuild ) ;
623+ }
645624 } ) ;
646625 } ) ;
647626 }
0 commit comments