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 e8e7fa1
Show file tree
Hide file tree
Showing 9 changed files with 26 additions and 22 deletions.
4 changes: 2 additions & 2 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;
continueStatements: 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,
continueStatements: false,
labels: new Set(),
returnAwaitYield: false
},
Expand Down
2 changes: 1 addition & 1 deletion 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,
continueStatements: 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.breakStatements))
return true;
context.breakFlow = new Set([this.label && this.label.name]);
return false;
Expand Down
2 changes: 1 addition & 1 deletion src/ast/nodes/ContinueStatement.ts
Expand Up @@ -9,7 +9,7 @@ export default class ContinueStatement extends StatementBase {

hasEffects(context: HasEffectsContext) {
if (
!(this.label ? context.ignore.labels.has(this.label.name) : context.ignore.breakAndContinue)
!(this.label ? context.ignore.labels.has(this.label.name) : context.ignore.continueStatements)
)
return true;
context.breakFlow = new Set([this.label && this.label.name]);
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: { breakStatements, continueStatements }
} = context;
context.ignore.breakAndContinue = true;
context.ignore.breakStatements = true;
context.ignore.continueStatements = true;
if (this.body.hasEffects(context)) return true;
context.ignore.breakAndContinue = breakAndContinue;
context.ignore.breakStatements = breakStatements;
context.ignore.continueStatements = continueStatements;
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: { breakStatements, continueStatements }
} = context;
context.ignore.breakAndContinue = true;
context.ignore.breakStatements = true;
context.ignore.continueStatements = true;
if (this.body.hasEffects(context)) return true;
context.ignore.breakAndContinue = breakAndContinue;
context.ignore.breakStatements = breakStatements;
context.ignore.continueStatements = continueStatements;
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: { breakStatements, continueStatements }
} = context;
context.ignore.breakAndContinue = true;
context.ignore.breakStatements = true;
context.ignore.continueStatements = true;
if (this.body.hasEffects(context)) return true;
context.ignore.breakAndContinue = breakAndContinue;
context.ignore.breakStatements = breakStatements;
context.ignore.continueStatements = continueStatements;
context.breakFlow = breakFlow;
return false;
}
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: { breakStatements, continueStatements }
} = context;
context.ignore.breakAndContinue = true;
context.ignore.breakStatements = true;
context.ignore.continueStatements = true;
if (this.body.hasEffects(context)) return true;
context.ignore.breakAndContinue = breakAndContinue;
context.ignore.breakStatements = breakStatements;
context.ignore.continueStatements = continueStatements;
context.breakFlow = breakFlow;
return false;
}
Expand Down
2 changes: 1 addition & 1 deletion 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,
continueStatements: false,
labels: new Set(),
returnAwaitYield: true
};
Expand Down

0 comments on commit e8e7fa1

Please sign in to comment.