FIR: Fork flow for anonymous initializer

This commit is contained in:
Denis Zharkov
2020-03-23 13:28:26 +03:00
parent f119839891
commit 0ca45deeef
2 changed files with 10 additions and 3 deletions
@@ -915,7 +915,13 @@ abstract class FirDataFlowAnalyzer<FLOW : Flow>(
// ----------------------------------- Init block ----------------------------------- // ----------------------------------- Init block -----------------------------------
fun enterInitBlock(initBlock: FirAnonymousInitializer) { fun enterInitBlock(initBlock: FirAnonymousInitializer) {
graphBuilder.enterInitBlock(initBlock).mergeIncomingFlow() graphBuilder.enterInitBlock(initBlock).let { (node, prevNode) ->
if (prevNode != null) {
node.flow = logicSystem.forkFlow(prevNode.flow)
} else {
node.mergeIncomingFlow()
}
}
} }
fun exitInitBlock(initBlock: FirAnonymousInitializer) { fun exitInitBlock(initBlock: FirAnonymousInitializer) {
@@ -728,7 +728,8 @@ class ControlFlowGraphBuilder {
// ----------------------------------- Block ----------------------------------- // ----------------------------------- Block -----------------------------------
fun enterInitBlock(initBlock: FirAnonymousInitializer): InitBlockEnterNode { fun enterInitBlock(initBlock: FirAnonymousInitializer): Pair<InitBlockEnterNode, CFGNode<*>?> {
val lastNode = lastNodes.topOrNull()
graphs.push(ControlFlowGraph(initBlock, "init block", ControlFlowGraph.Kind.ClassInitializer)) graphs.push(ControlFlowGraph(initBlock, "init block", ControlFlowGraph.Kind.ClassInitializer))
val enterNode = createInitBlockEnterNode(initBlock).also { val enterNode = createInitBlockEnterNode(initBlock).also {
lexicalScopes.push(stackOf(it)) lexicalScopes.push(stackOf(it))
@@ -737,7 +738,7 @@ class ControlFlowGraphBuilder {
initBlockExitNodes.push(exitNode) initBlockExitNodes.push(exitNode)
exitNodes.push(exitNode) exitNodes.push(exitNode)
levelCounter++ levelCounter++
return enterNode return enterNode to lastNode
} }
fun exitInitBlock(initBlock: FirAnonymousInitializer): InitBlockExitNode { fun exitInitBlock(initBlock: FirAnonymousInitializer): InitBlockExitNode {