FIR: Fork flow for anonymous initializer
This commit is contained in:
+7
-1
@@ -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) {
|
||||||
|
|||||||
+3
-2
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user