[FIR] Don't assume that exit lambda node is target for exceptional exit for inplace lambdas
#KT-39709 Fixed #KT-43156 Fixed
This commit is contained in:
committed by
teamcityserver
parent
440cf78884
commit
87380d1913
+9
-4
@@ -270,7 +270,9 @@ class ControlFlowGraphBuilder {
|
||||
val exitNode = createFunctionExitNode(anonymousFunction).also {
|
||||
exitsOfAnonymousFunctions[symbol] = it
|
||||
exitTargetsForReturn.push(it)
|
||||
exitTargetsForTry.push(it)
|
||||
if (!invocationKind.isInPlace) {
|
||||
exitTargetsForTry.push(it)
|
||||
}
|
||||
}
|
||||
|
||||
if (invocationKind.hasTowardEdge) {
|
||||
@@ -299,13 +301,16 @@ class ControlFlowGraphBuilder {
|
||||
else -> false
|
||||
}
|
||||
|
||||
private val EventOccurrencesRange?.isInPlace: Boolean
|
||||
get() = this != null
|
||||
|
||||
fun exitAnonymousFunction(anonymousFunction: FirAnonymousFunction): Triple<FunctionExitNode, PostponedLambdaExitNode?, ControlFlowGraph> {
|
||||
|
||||
|
||||
val symbol = anonymousFunction.symbol
|
||||
val exitNode = exitsOfAnonymousFunctions.remove(symbol)!!.also {
|
||||
require(it == exitTargetsForReturn.pop())
|
||||
require(it == exitTargetsForTry.pop())
|
||||
if (!anonymousFunction.invocationKind.isInPlace) {
|
||||
require(it == exitTargetsForTry.pop())
|
||||
}
|
||||
}
|
||||
popAndAddEdge(exitNode)
|
||||
exitNode.updateDeadStatus()
|
||||
|
||||
Reference in New Issue
Block a user