@@ -764,35 +764,48 @@ export class Flow {
764764
765765 this . flags = newFlags | ( this . flags & FlowFlags . UNCHECKED_CONTEXT ) ;
766766
767- var leftLocalFlags = left . localFlags ;
768- var numLeftLocalFlags = leftLocalFlags . length ;
769- var rightLocalFlags = right . localFlags ;
770- var numRightLocalFlags = rightLocalFlags . length ;
771- var maxLocalFlags = max ( numLeftLocalFlags , numRightLocalFlags ) ;
772- var combinedFlags = new Array < LocalFlags > ( maxLocalFlags ) ;
773- for ( let i = 0 ; i < maxLocalFlags ; ++ i ) {
774- let leftFlags = i < numLeftLocalFlags ? leftLocalFlags [ i ] : 0 ;
775- let rightFlags = i < numRightLocalFlags ? rightLocalFlags [ i ] : 0 ;
776- let newFlags = leftFlags & rightFlags & (
777- LocalFlags . CONSTANT |
778- LocalFlags . WRAPPED |
779- LocalFlags . NONNULL |
780- LocalFlags . INITIALIZED
781- ) ;
782- if ( leftFlags & LocalFlags . RETAINED ) {
783- if ( rightFlags & LocalFlags . RETAINED ) {
784- newFlags |= LocalFlags . RETAINED ;
785- } else {
767+ var thisLocalFlags = this . localFlags ;
768+ if ( leftFlags & FlowFlags . TERMINATES ) {
769+ if ( ! ( rightFlags & FlowFlags . TERMINATES ) ) {
770+ let rightLocalFlags = right . localFlags ;
771+ for ( let i = 0 , k = rightLocalFlags . length ; i < k ; ++ i ) {
772+ thisLocalFlags [ i ] = rightLocalFlags [ i ] ;
773+ }
774+ }
775+ } else if ( rightFlags & FlowFlags . TERMINATES ) {
776+ let leftLocalFlags = left . localFlags ;
777+ for ( let i = 0 , k = leftLocalFlags . length ; i < k ; ++ i ) {
778+ thisLocalFlags [ i ] = leftLocalFlags [ i ] ;
779+ }
780+ } else {
781+ let leftLocalFlags = left . localFlags ;
782+ let numLeftLocalFlags = leftLocalFlags . length ;
783+ let rightLocalFlags = right . localFlags ;
784+ let numRightLocalFlags = rightLocalFlags . length ;
785+ let maxLocalFlags = max ( numLeftLocalFlags , numRightLocalFlags ) ;
786+ for ( let i = 0 ; i < maxLocalFlags ; ++ i ) {
787+ let leftFlags = i < numLeftLocalFlags ? leftLocalFlags [ i ] : 0 ;
788+ let rightFlags = i < numRightLocalFlags ? rightLocalFlags [ i ] : 0 ;
789+ let newFlags = leftFlags & rightFlags & (
790+ LocalFlags . CONSTANT |
791+ LocalFlags . WRAPPED |
792+ LocalFlags . NONNULL |
793+ LocalFlags . INITIALIZED
794+ ) ;
795+ if ( leftFlags & LocalFlags . RETAINED ) {
796+ if ( rightFlags & LocalFlags . RETAINED ) {
797+ newFlags |= LocalFlags . RETAINED ;
798+ } else {
799+ newFlags |= LocalFlags . CONDITIONALLY_RETAINED ;
800+ }
801+ } else if ( rightFlags & LocalFlags . RETAINED ) {
786802 newFlags |= LocalFlags . CONDITIONALLY_RETAINED ;
803+ } else {
804+ newFlags |= ( leftFlags | rightFlags ) & LocalFlags . CONDITIONALLY_RETAINED ;
787805 }
788- } else if ( rightFlags & LocalFlags . RETAINED ) {
789- newFlags |= LocalFlags . CONDITIONALLY_RETAINED ;
790- } else {
791- newFlags |= ( leftFlags | rightFlags ) & LocalFlags . CONDITIONALLY_RETAINED ;
806+ thisLocalFlags [ i ] = newFlags ;
792807 }
793- combinedFlags [ i ] = newFlags ;
794808 }
795- this . localFlags = combinedFlags ;
796809 }
797810
798811 /** Tests if the specified flows have differing local states. */
0 commit comments