Break/finally chain in suspend function test fix & workaround

This commit is contained in:
Roman Artemev
2018-07-05 23:38:02 +03:00
committed by romanart
parent efec82c0eb
commit 36a99da820
2 changed files with 15 additions and 4 deletions
@@ -1,5 +1,5 @@
// IGNORE_BACKEND: JS_IR
// IGNORE_BACKEND: JS
// IGNORE_BACKEND: JS_IR
// IGNORE_BACKEND: JVM_IR
// WITH_RUNTIME
// WITH_COROUTINES
@@ -47,8 +47,8 @@ fun box(): String {
result += "@"
for (y in listOf("F", "G")) {
try {
result += suspendWithResult(z)
if (z == "G") {
result += suspendWithResult(y)
if (y == "G") {
break
}
}
@@ -280,7 +280,18 @@ class CoroutineFunctionTransformer(private val function: JsFunction, name: Strin
statements += block.statements
}
}
val switchStatement = JsSwitch(stateRef.deepCopy(), cases)
// NOTE: temporary workaround to let tests run without hanging
// TODO: probably default statement should be removed asap the issue about nested break & finally is fixed
val defaultCase = JsDefault().apply {
val block = JsBlock(
assignment(stateRef, JsIntLiteral(indexOfGlobalCatch)).makeStmt(),
JsThrow(JsNew(JsNameRef("Error"), listOf(JsStringLiteral("State Machine Unreachable execution"))))
)
statements += block
}
val switchStatement = JsSwitch(stateRef.deepCopy(), cases + defaultCase)
val loop = JsDoWhile(JsBooleanLiteral(true), JsTry(JsBlock(switchStatement), catch, null))
return listOf(loop)