@@ -171,8 +171,8 @@ export enum LocalFlags {
171
171
172
172
/** Flags indicating the current state of an instance field. */
173
173
export enum FieldFlags {
174
- NONE = 0 ,
175
- INITIALIZED = 1 << 0 ,
174
+ NONE = 1 ,
175
+ INITIALIZED = 1 << 1 ,
176
176
}
177
177
178
178
/** Condition kinds. */
@@ -207,7 +207,7 @@ export class Flow {
207
207
/** Local flags. */
208
208
localFlags : LocalFlags [ ] ;
209
209
/** Field flags. */
210
- fieldFlags : Map < string , FieldFlags > ;
210
+ fieldFlags : Map < string , FieldFlags > | null = null ;
211
211
/** Function being inlined, when inlining. */
212
212
inlineFunction : Function | null ;
213
213
/** The label we break to when encountering a return statement, when inlining. */
@@ -224,7 +224,9 @@ export class Flow {
224
224
flow . returnType = parentFunction . signature . returnType ;
225
225
flow . contextualTypeArguments = parentFunction . contextualTypeArguments ;
226
226
flow . localFlags = [ ] ;
227
- flow . fieldFlags = new Map ( ) ;
227
+ if ( parentFunction . is ( CommonFlags . CONSTRUCTOR ) ) {
228
+ flow . fieldFlags = new Map ( ) ;
229
+ }
228
230
flow . inlineFunction = null ;
229
231
flow . inlineReturnLabel = null ;
230
232
return flow ;
@@ -285,7 +287,9 @@ export class Flow {
285
287
branch . localFlags = this . localFlags . slice ( ) ;
286
288
branch . inlineFunction = this . inlineFunction ;
287
289
branch . inlineReturnLabel = this . inlineReturnLabel ;
288
- branch . fieldFlags = new Map ( this . fieldFlags ) ;
290
+ if ( branch . parentFunction . is ( CommonFlags . CONSTRUCTOR ) ) {
291
+ branch . fieldFlags = new Map ( this . fieldFlags ! ) ;
292
+ }
289
293
return branch ;
290
294
}
291
295
@@ -531,13 +535,17 @@ export class Flow {
531
535
532
536
setFieldFlag ( name : string , flag : FieldFlags ) : void {
533
537
let fieldFlags = this . fieldFlags ;
534
- const flags = fieldFlags . get ( name ) || 0 ;
535
- fieldFlags . set ( name , flags | flag ) ;
538
+ if ( fieldFlags ) {
539
+ const flags = fieldFlags . has ( name ) ? assert ( fieldFlags . get ( name ) ) : FieldFlags . NONE ;
540
+ fieldFlags . set ( name , flags | flag ) ;
541
+ }
536
542
}
537
543
538
544
isFieldFlag ( name : string , flag : FieldFlags ) : bool {
539
- const flags = this . fieldFlags . get ( name ) ;
540
- if ( flags ) {
545
+ const fieldFlags = this . fieldFlags ;
546
+
547
+ if ( fieldFlags && fieldFlags . has ( name ) ) {
548
+ const flags = assert ( fieldFlags . get ( name ) ) ;
541
549
return ( flags & flag ) == flag ;
542
550
}
543
551
return false ;
@@ -831,17 +839,22 @@ export class Flow {
831
839
}
832
840
}
833
841
834
- // Only the most right flow will have an effect
835
- // on the resulting flow.
836
- const rightFieldFlags = right . fieldFlags ;
837
- const rightKeys = Map_keys ( rightFieldFlags ) ;
838
842
839
- for ( let _values = Map_values ( rightFieldFlags ) , i = 0 , k = _values . length ; i < k ; ++ i ) {
840
- const rightValue = unchecked ( _values [ i ] ) ;
841
- const currentKey = unchecked ( rightKeys [ i ] ) ;
843
+ if ( left . fieldFlags && right . fieldFlags && right . fieldFlags . size > 0 ) {
844
+ const rightFieldFlags = right . fieldFlags ;
845
+ const rightKeys = Map_keys ( rightFieldFlags ) ;
846
+ const rightValues = Map_values ( rightFieldFlags ) ;
847
+
848
+ const leftFieldFlags = left . fieldFlags ;
842
849
843
- if ( rightValue & FieldFlags . INITIALIZED ) {
844
- this . setFieldFlag ( currentKey , FieldFlags . INITIALIZED ) ;
850
+ for ( let i = 0 , k = rightValues . length ; i < k ; ++ i ) {
851
+ const rightValue = unchecked ( rightValues [ i ] ) ;
852
+ const rightKey = unchecked ( rightKeys [ i ] ) ;
853
+ const leftValue = leftFieldFlags . has ( rightKey ) ? assert ( leftFieldFlags . get ( rightKey ) ) : FieldFlags . NONE ;
854
+
855
+ if ( ( rightValue & FieldFlags . INITIALIZED ) && ( leftValue & FieldFlags . INITIALIZED ) ) {
856
+ this . setFieldFlag ( rightKey , FieldFlags . INITIALIZED ) ;
857
+ }
845
858
}
846
859
}
847
860
}
0 commit comments