Skip to content

Commit

Permalink
Separate break and continue statements in execution context
Browse files Browse the repository at this point in the history
  • Loading branch information
lukastaegert committed Oct 17, 2019
1 parent 88d871f commit 36bc84f
Show file tree
Hide file tree
Showing 10 changed files with 34 additions and 32 deletions.
8 changes: 4 additions & 4 deletions src/ast/ExecutionContext.ts
Expand Up @@ -3,8 +3,8 @@ import { PathTracker } from './utils/PathTracker';
import ThisVariable from './variables/ThisVariable';

interface ExecutionContextIgnore {
breakAndContinue: boolean;
breakStatements: boolean;
breaks: boolean;
continues: boolean;
labels: Set<string>;
returnAwaitYield: boolean;
}
Expand Down Expand Up @@ -40,8 +40,8 @@ export function createHasEffectsContext(): HasEffectsContext {
breakFlow: BREAKFLOW_NONE,
called: new PathTracker(),
ignore: {
breakAndContinue: false,
breakStatements: false,
breaks: false,
continues: false,
labels: new Set(),
returnAwaitYield: false
},
Expand Down
4 changes: 2 additions & 2 deletions src/ast/nodes/ArrowFunctionExpression.ts
Expand Up @@ -58,8 +58,8 @@ export default class ArrowFunctionExpression extends NodeBase {
}
const { ignore, breakFlow } = context;
context.ignore = {
breakAndContinue: false,
breakStatements: false,
breaks: false,
continues: false,
labels: new Set(),
returnAwaitYield: true
};
Expand Down
6 changes: 1 addition & 5 deletions src/ast/nodes/BreakStatement.ts
Expand Up @@ -8,11 +8,7 @@ export default class BreakStatement extends StatementBase {
type!: NodeType.tBreakStatement;

hasEffects(context: HasEffectsContext) {
if (
!(this.label
? context.ignore.labels.has(this.label.name)
: context.ignore.breakStatements || context.ignore.breakAndContinue)
)
if (!(this.label ? context.ignore.labels.has(this.label.name) : context.ignore.breaks))
return true;
context.breakFlow = new Set([this.label && this.label.name]);
return false;
Expand Down
4 changes: 1 addition & 3 deletions src/ast/nodes/ContinueStatement.ts
Expand Up @@ -8,9 +8,7 @@ export default class ContinueStatement extends StatementBase {
type!: NodeType.tContinueStatement;

hasEffects(context: HasEffectsContext) {
if (
!(this.label ? context.ignore.labels.has(this.label.name) : context.ignore.breakAndContinue)
)
if (!(this.label ? context.ignore.labels.has(this.label.name) : context.ignore.continues))
return true;
context.breakFlow = new Set([this.label && this.label.name]);
return false;
Expand Down
8 changes: 5 additions & 3 deletions src/ast/nodes/DoWhileStatement.ts
Expand Up @@ -11,11 +11,13 @@ export default class DoWhileStatement extends StatementBase {
if (this.test.hasEffects(context)) return true;
const {
breakFlow,
ignore: { breakAndContinue }
ignore: { breaks, continues }
} = context;
context.ignore.breakAndContinue = true;
context.ignore.breaks = true;
context.ignore.continues = true;
if (this.body.hasEffects(context)) return true;
context.ignore.breakAndContinue = breakAndContinue;
context.ignore.breaks = breaks;
context.ignore.continues = continues;
if (context.breakFlow instanceof Set && context.breakFlow.has(null)) {
context.breakFlow = breakFlow;
}
Expand Down
8 changes: 5 additions & 3 deletions src/ast/nodes/ForInStatement.ts
Expand Up @@ -36,11 +36,13 @@ export default class ForInStatement extends StatementBase {
return true;
const {
breakFlow,
ignore: { breakAndContinue }
ignore: { breaks, continues }
} = context;
context.ignore.breakAndContinue = true;
context.ignore.breaks = true;
context.ignore.continues = true;
if (this.body.hasEffects(context)) return true;
context.ignore.breakAndContinue = breakAndContinue;
context.ignore.breaks = breaks;
context.ignore.continues = continues;
context.breakFlow = breakFlow;
return false;
}
Expand Down
8 changes: 5 additions & 3 deletions src/ast/nodes/ForStatement.ts
Expand Up @@ -27,11 +27,13 @@ export default class ForStatement extends StatementBase {
return true;
const {
breakFlow,
ignore: { breakAndContinue }
ignore: { breaks, continues }
} = context;
context.ignore.breakAndContinue = true;
context.ignore.breaks = true;
context.ignore.continues = true;
if (this.body.hasEffects(context)) return true;
context.ignore.breakAndContinue = breakAndContinue;
context.ignore.breaks = breaks;
context.ignore.continues = continues;
context.breakFlow = breakFlow;
return false;
}
Expand Down
8 changes: 4 additions & 4 deletions src/ast/nodes/SwitchStatement.ts
Expand Up @@ -47,10 +47,10 @@ export default class SwitchStatement extends StatementBase {
if (this.discriminant.hasEffects(context)) return true;
const {
breakFlow,
ignore: { breakStatements }
ignore: { breaks }
} = context;
let minBreakFlow: BreakFlow | false = BREAKFLOW_ERROR_RETURN;
context.ignore.breakStatements = true;
context.ignore.breaks = true;
for (const switchCase of this.cases) {
if (switchCase.hasEffects(context)) return true;
minBreakFlow = getMinBreakflowAfterCase(minBreakFlow, context);
Expand All @@ -59,7 +59,7 @@ export default class SwitchStatement extends StatementBase {
if (this.defaultCase !== null && !(minBreakFlow instanceof Set && minBreakFlow.has(null))) {
context.breakFlow = minBreakFlow;
}
context.ignore.breakStatements = breakStatements;
context.ignore.breaks = breaks;
return false;
}

Expand All @@ -78,7 +78,7 @@ export default class SwitchStatement extends StatementBase {
}
if (!isCaseIncluded) {
const hasEffectsContext = createHasEffectsContext();
hasEffectsContext.ignore.breakStatements = true;
hasEffectsContext.ignore.breaks = true;
isCaseIncluded = switchCase.hasEffects(hasEffectsContext);
}
if (isCaseIncluded) {
Expand Down
8 changes: 5 additions & 3 deletions src/ast/nodes/WhileStatement.ts
Expand Up @@ -11,11 +11,13 @@ export default class WhileStatement extends StatementBase {
if (this.test.hasEffects(context)) return true;
const {
breakFlow,
ignore: { breakAndContinue }
ignore: { breaks, continues }
} = context;
context.ignore.breakAndContinue = true;
context.ignore.breaks = true;
context.ignore.continues = true;
if (this.body.hasEffects(context)) return true;
context.ignore.breakAndContinue = breakAndContinue;
context.ignore.breaks = breaks;
context.ignore.continues = continues;
context.breakFlow = breakFlow;
return false;
}
Expand Down
4 changes: 2 additions & 2 deletions src/ast/nodes/shared/FunctionNode.ts
Expand Up @@ -74,8 +74,8 @@ export default class FunctionNode extends NodeBase {
);
const { breakFlow, ignore } = context;
context.ignore = {
breakAndContinue: false,
breakStatements: false,
breaks: false,
continues: false,
labels: new Set(),
returnAwaitYield: true
};
Expand Down

0 comments on commit 36bc84f

Please sign in to comment.