Skip to content

Commit ba39da9

Browse files
committed
Several improvements to field flags flows:
- Use `actualFunction` to check for constructor flows - Fix compilation errors regarding boolean comparisons
1 parent 96ce41f commit ba39da9

File tree

1 file changed

+24
-16
lines changed

1 file changed

+24
-16
lines changed

src/flow.ts

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -224,11 +224,12 @@ export class Flow {
224224
flow.returnType = parentFunction.signature.returnType;
225225
flow.contextualTypeArguments = parentFunction.contextualTypeArguments;
226226
flow.localFlags = [];
227-
if (parentFunction.is(CommonFlags.CONSTRUCTOR)) {
228-
flow.fieldFlags = new Map();
229-
}
230227
flow.inlineFunction = null;
231228
flow.inlineReturnLabel = null;
229+
230+
if (flow.actualFunction.is(CommonFlags.CONSTRUCTOR)) {
231+
flow.fieldFlags = new Map();
232+
}
232233
return flow;
233234
}
234235

@@ -287,9 +288,11 @@ export class Flow {
287288
branch.localFlags = this.localFlags.slice();
288289
branch.inlineFunction = this.inlineFunction;
289290
branch.inlineReturnLabel = this.inlineReturnLabel;
290-
if (branch.parentFunction.is(CommonFlags.CONSTRUCTOR)) {
291-
branch.fieldFlags = new Map(this.fieldFlags!);
291+
292+
if (branch.actualFunction.is(CommonFlags.CONSTRUCTOR)) {
293+
branch.fieldFlags = new Map();
292294
}
295+
293296
return branch;
294297
}
295298

@@ -544,12 +547,12 @@ export class Flow {
544547
isFieldFlag(name: string, flag: FieldFlags): bool {
545548
const fieldFlags = this.fieldFlags;
546549

547-
if (fieldFlags && fieldFlags.has(name)) {
548-
const flags = assert(fieldFlags.get(name));
549-
return (flags & flag) == flag;
550+
if ((fieldFlags !== null) && fieldFlags.has(name)) {
551+
const flags = assert(fieldFlags.get(name));
552+
return (flags & flag) == flag;
553+
}
554+
return false;
550555
}
551-
return false;
552-
}
553556

554557
/** Pushes a new break label to the stack, for example when entering a loop that one can `break` from. */
555558
pushBreakLabel(): string {
@@ -840,20 +843,25 @@ export class Flow {
840843
}
841844

842845

843-
if (left.fieldFlags && right.fieldFlags && right.fieldFlags.size > 0) {
846+
if ((left.fieldFlags !== null) &&
847+
(right.fieldFlags !== null) &&
848+
right.fieldFlags.size > 0
849+
) {
844850
const rightFieldFlags = right.fieldFlags;
845-
const rightKeys = Map_keys(rightFieldFlags);
846-
const rightValues = Map_values(rightFieldFlags);
851+
const rightKeys = Map_keys(rightFieldFlags!);
852+
const rightValues = Map_values(rightFieldFlags!);
847853

848854
const leftFieldFlags = left.fieldFlags;
849855

850856
for (let i = 0, k = rightValues.length; i < k; ++i) {
851857
const rightValue = unchecked(rightValues[i]);
852858
const rightKey = unchecked(rightKeys[i]);
853-
const leftValue = leftFieldFlags.has(rightKey) ? assert(leftFieldFlags.get(rightKey)) : FieldFlags.NONE;
859+
const leftValue = leftFieldFlags!.has(rightKey) ? assert(leftFieldFlags!.get(rightKey)) : FieldFlags.NONE;
854860

855-
if ((rightValue & FieldFlags.INITIALIZED) && (leftValue & FieldFlags.INITIALIZED)) {
856-
this.setFieldFlag(rightKey, FieldFlags.INITIALIZED);
861+
if (rightValue & FieldFlags.INITIALIZED) {
862+
if (leftValue & FieldFlags.INITIALIZED) {
863+
this.setFieldFlag(rightKey, FieldFlags.INITIALIZED);
864+
}
857865
}
858866
}
859867
}

0 commit comments

Comments
 (0)