From 814f245ff284732e036e021a89500852077bbed5 Mon Sep 17 00:00:00 2001 From: ctw-ian Date: Thu, 25 Aug 2022 16:27:24 +0800 Subject: [PATCH] Fix env context implementation in switch statement Issue:I5O40H Signed-off-by: ctw-ian Change-Id: I09b803ce62a9db629780aead752aef1af245dabe --- ts2panda/src/compiler.ts | 13 +++++++++++-- ts2panda/src/statement/labelTarget.ts | 6 +++++- ts2panda/src/statement/switchStatement.ts | 5 ++++- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/ts2panda/src/compiler.ts b/ts2panda/src/compiler.ts index fcc8536e36..6be3ca23ea 100644 --- a/ts2panda/src/compiler.ts +++ b/ts2panda/src/compiler.ts @@ -609,8 +609,17 @@ export class Compiler { this.popLoopEnv(node, popTimes); break; } - // SwitchStatement & BlockStatement could also have break labelTarget which changes - // the control flow out of their inner env loop. We should pop Loop env with such cases either. + case ts.SyntaxKind.SwitchStatement: { + if (!isContinue) { + return; + } + this.popLoopEnv(node, loopEnvLevel); + break; + } + /** + * BlockStatement could also have break labelTarget which changes the control flow + * out of their inner env loop. We should pop Loop env with such cases either. + */ default: { this.popLoopEnv(node, loopEnvLevel); } diff --git a/ts2panda/src/statement/labelTarget.ts b/ts2panda/src/statement/labelTarget.ts index 889cb8c947..1c6cf17fa8 100644 --- a/ts2panda/src/statement/labelTarget.ts +++ b/ts2panda/src/statement/labelTarget.ts @@ -38,6 +38,10 @@ export class LabelTarget { this.tryStatement = TryStatement.getCurrentTryStatement(); } + containLoopEnv() { + return this.hasLoopEnv; + } + getBreakTargetLabel() { return this.breakTargetLabel; } @@ -73,7 +77,7 @@ export class LabelTarget { return false; } - private static getCloseLabelTarget(): LabelTarget | undefined { + static getCloseLabelTarget(): LabelTarget | undefined { if (!LabelTarget.isLabelTargetsEmpty()) { return LabelTarget.labelTargetStack[LabelTarget.labelTargetStack.length - 1]; } diff --git a/ts2panda/src/statement/switchStatement.ts b/ts2panda/src/statement/switchStatement.ts index 7c4213bafa..438bf7b7a5 100644 --- a/ts2panda/src/statement/switchStatement.ts +++ b/ts2panda/src/statement/switchStatement.ts @@ -45,7 +45,10 @@ export class SwitchBase { * switchStatements doesn't have continue target * so we use the uplevel continue label as it's continue target. */ - let labelTarget = new LabelTarget(stmt, switchEndLabel, LabelTarget.getCloseContinueTarget()); + let continueLabel = LabelTarget.getCloseContinueTarget(); + let closeLabelTarget = LabelTarget.getCloseLabelTarget(); + let hasLoopEnv = closeLabelTarget ? closeLabelTarget.containLoopEnv() : false; + let labelTarget = new LabelTarget(stmt, switchEndLabel, continueLabel, hasLoopEnv); LabelTarget.pushLabelTarget(labelTarget); LabelTarget.updateName2LabelTarget(stmt.parent, labelTarget); } -- Gitee