提交 56363754 编写于 作者: S Svyatoslav Kuzmich

KJS: Fix loop levels in ContinueReplacingVisitor (KT-24777)

上级 2ec8c4aa
......@@ -29,9 +29,9 @@ object LabeledBlockToDoWhileTransformation {
}
fun JsStatement.isLoop(): Boolean = when (this) {
is JsWhile -> true
is JsDoWhile -> true
is JsFor -> true
is JsWhile,
is JsDoWhile,
is JsFor,
is JsForIn -> true
else -> false
}
......
......@@ -26,6 +26,7 @@ class ContinueReplacingVisitor(val loopLabelName: JsName?, val guardLabelName: J
override fun visit(x: JsContinue, ctx: JsContext<JsNode>): Boolean {
val target = x.label?.name
val shouldReplace = if (target == null) loopNestingLevel == 0 else target == loopLabelName
assert(loopNestingLevel >= 0)
if (shouldReplace) {
ctx.replaceMe(JsBreak(guardLabelName.makeRef()))
}
......@@ -42,6 +43,7 @@ class ContinueReplacingVisitor(val loopLabelName: JsName?, val guardLabelName: J
override fun endVisit(x: JsWhile, ctx: JsContext<JsNode>) {
super.endVisit(x, ctx)
if (loopLabelName == null) return
loopNestingLevel--
}
......@@ -54,6 +56,7 @@ class ContinueReplacingVisitor(val loopLabelName: JsName?, val guardLabelName: J
override fun endVisit(x: JsDoWhile, ctx: JsContext<JsNode>) {
super.endVisit(x, ctx)
if (loopLabelName == null) return
loopNestingLevel--
}
......@@ -66,6 +69,7 @@ class ContinueReplacingVisitor(val loopLabelName: JsName?, val guardLabelName: J
override fun endVisit(x: JsFor, ctx: JsContext<JsNode>) {
super.endVisit(x, ctx)
if (loopLabelName == null) return
loopNestingLevel--
}
......@@ -78,6 +82,7 @@ class ContinueReplacingVisitor(val loopLabelName: JsName?, val guardLabelName: J
override fun endVisit(x: JsForIn, ctx: JsContext<JsNode>) {
super.endVisit(x, ctx)
if (loopLabelName == null) return
loopNestingLevel--
}
}
......@@ -3724,6 +3724,11 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest {
runTest("js/js.translator/testData/box/inline/classObject.kt");
}
@TestMetadata("continueInLoopWithInlinableCondition.kt")
public void testContinueInLoopWithInlinableCondition() throws Exception {
runTest("js/js.translator/testData/box/inline/continueInLoopWithInlinableCondition.kt");
}
@TestMetadata("dontInlineFunctionCall.kt")
public void testDontInlineFunctionCall() throws Exception {
runTest("js/js.translator/testData/box/inline/dontInlineFunctionCall.kt");
......
......@@ -3724,6 +3724,11 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest {
runTest("js/js.translator/testData/box/inline/classObject.kt");
}
@TestMetadata("continueInLoopWithInlinableCondition.kt")
public void testContinueInLoopWithInlinableCondition() throws Exception {
runTest("js/js.translator/testData/box/inline/continueInLoopWithInlinableCondition.kt");
}
@TestMetadata("dontInlineFunctionCall.kt")
public void testDontInlineFunctionCall() throws Exception {
runTest("js/js.translator/testData/box/inline/dontInlineFunctionCall.kt");
......
// EXPECTED_REACHABLE_NODES: 1122
/*
Modified test case from KT-24777
*/
package foo
inline fun condition() = false
fun run(x: Boolean): String {
var y = 0
do {
if (y > 0)
return "NOT OK"
y += 1
do {
} while (false)
if (x) continue
} while (condition())
return "OK"
}
fun box(): String {
return run(true)
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册