@@ -764,35 +764,48 @@ export class Flow {
764
764
765
765
this . flags = newFlags | ( this . flags & FlowFlags . UNCHECKED_CONTEXT ) ;
766
766
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 ) {
786
802
newFlags |= LocalFlags . CONDITIONALLY_RETAINED ;
803
+ } else {
804
+ newFlags |= ( leftFlags | rightFlags ) & LocalFlags . CONDITIONALLY_RETAINED ;
787
805
}
788
- } else if ( rightFlags & LocalFlags . RETAINED ) {
789
- newFlags |= LocalFlags . CONDITIONALLY_RETAINED ;
790
- } else {
791
- newFlags |= ( leftFlags | rightFlags ) & LocalFlags . CONDITIONALLY_RETAINED ;
806
+ thisLocalFlags [ i ] = newFlags ;
792
807
}
793
- combinedFlags [ i ] = newFlags ;
794
808
}
795
- this . localFlags = combinedFlags ;
796
809
}
797
810
798
811
/** Tests if the specified flows have differing local states. */
0 commit comments