From e8e7fa1054791a2666d98bd9310ee7348b4452ed Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Thu, 17 Oct 2019 12:01:39 +0200 Subject: [PATCH] Separate break and continue statements in execution context --- src/ast/ExecutionContext.ts | 4 ++-- src/ast/nodes/ArrowFunctionExpression.ts | 2 +- src/ast/nodes/BreakStatement.ts | 6 +----- src/ast/nodes/ContinueStatement.ts | 2 +- src/ast/nodes/DoWhileStatement.ts | 8 +++++--- src/ast/nodes/ForInStatement.ts | 8 +++++--- src/ast/nodes/ForStatement.ts | 8 +++++--- src/ast/nodes/WhileStatement.ts | 8 +++++--- src/ast/nodes/shared/FunctionNode.ts | 2 +- 9 files changed, 26 insertions(+), 22 deletions(-) diff --git a/src/ast/ExecutionContext.ts b/src/ast/ExecutionContext.ts index 041e8b66ed1..e981cb03fb7 100644 --- a/src/ast/ExecutionContext.ts +++ b/src/ast/ExecutionContext.ts @@ -3,8 +3,8 @@ import { PathTracker } from './utils/PathTracker'; import ThisVariable from './variables/ThisVariable'; interface ExecutionContextIgnore { - breakAndContinue: boolean; breakStatements: boolean; + continueStatements: boolean; labels: Set; returnAwaitYield: boolean; } @@ -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 }, diff --git a/src/ast/nodes/ArrowFunctionExpression.ts b/src/ast/nodes/ArrowFunctionExpression.ts index eac44039128..a912caec416 100644 --- a/src/ast/nodes/ArrowFunctionExpression.ts +++ b/src/ast/nodes/ArrowFunctionExpression.ts @@ -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 }; diff --git a/src/ast/nodes/BreakStatement.ts b/src/ast/nodes/BreakStatement.ts index c95f9975db3..d1c24b2a799 100644 --- a/src/ast/nodes/BreakStatement.ts +++ b/src/ast/nodes/BreakStatement.ts @@ -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; diff --git a/src/ast/nodes/ContinueStatement.ts b/src/ast/nodes/ContinueStatement.ts index 90e6d89f8e0..322afb91b8b 100644 --- a/src/ast/nodes/ContinueStatement.ts +++ b/src/ast/nodes/ContinueStatement.ts @@ -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]); diff --git a/src/ast/nodes/DoWhileStatement.ts b/src/ast/nodes/DoWhileStatement.ts index ec465737e87..627029ade3a 100644 --- a/src/ast/nodes/DoWhileStatement.ts +++ b/src/ast/nodes/DoWhileStatement.ts @@ -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; } diff --git a/src/ast/nodes/ForInStatement.ts b/src/ast/nodes/ForInStatement.ts index 4d46879a2ec..510d42813cc 100644 --- a/src/ast/nodes/ForInStatement.ts +++ b/src/ast/nodes/ForInStatement.ts @@ -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; } diff --git a/src/ast/nodes/ForStatement.ts b/src/ast/nodes/ForStatement.ts index 285d711d72a..ada2d255daa 100644 --- a/src/ast/nodes/ForStatement.ts +++ b/src/ast/nodes/ForStatement.ts @@ -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; } diff --git a/src/ast/nodes/WhileStatement.ts b/src/ast/nodes/WhileStatement.ts index 7a044349be4..f6134d7f071 100644 --- a/src/ast/nodes/WhileStatement.ts +++ b/src/ast/nodes/WhileStatement.ts @@ -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; } diff --git a/src/ast/nodes/shared/FunctionNode.ts b/src/ast/nodes/shared/FunctionNode.ts index 04e379caad0..cced5cd9ecc 100644 --- a/src/ast/nodes/shared/FunctionNode.ts +++ b/src/ast/nodes/shared/FunctionNode.ts @@ -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 };