FIR CFA: add control flow between default parameter values

function enter -> default 1 -> default 2 -> rest of function
                   \----------^ \----------^

This probably has no effect (in non-stupid code, at least), but it makes
graph construction more architecturally correct (now value parameters'
subgraphs get attached to a node).
This commit is contained in:
pyos
2022-12-09 13:48:15 +01:00
committed by Dmitriy Novozhilov
parent 74758278d7
commit 5d4fb3ead8
9 changed files with 656 additions and 599 deletions
@@ -182,8 +182,14 @@ class LocalFunctionDeclarationNode(owner: ControlFlowGraph, override val fir: Fi
// ----------------------------------- Default arguments -----------------------------------
class EnterValueParameterNode(owner: ControlFlowGraph, override val fir: FirValueParameter, level: Int, id: Int) : CFGNodeWithCfgOwner<FirValueParameter>(owner, level, id) {
override fun <R, D> accept(visitor: ControlFlowGraphVisitor<R, D>, data: D): R {
return visitor.visitEnterValueParameterNode(this, data)
}
}
@OptIn(CfgInternals::class)
class EnterDefaultArgumentsNode(owner: ControlFlowGraph, override val fir: FirValueParameter, level: Int, id: Int) : CFGNodeWithCfgOwner<FirValueParameter>(owner, level, id),
class EnterDefaultArgumentsNode(owner: ControlFlowGraph, override val fir: FirValueParameter, level: Int, id: Int) : CFGNode<FirValueParameter>(owner, level, id),
EnterNodeMarker {
init {
owner.enterNode = this
@@ -206,6 +212,12 @@ class ExitDefaultArgumentsNode(owner: ControlFlowGraph, override val fir: FirVal
}
}
class ExitValueParameterNode(owner: ControlFlowGraph, override val fir: FirValueParameter, level: Int, id: Int) : CFGNode<FirValueParameter>(owner, level, id) {
override fun <R, D> accept(visitor: ControlFlowGraphVisitor<R, D>, data: D): R {
return visitor.visitExitValueParameterNode(this, data)
}
}
// ----------------------------------- Anonymous function -----------------------------------
class SplitPostponedLambdasNode(owner: ControlFlowGraph, override val fir: FirStatement, val lambdas: List<FirAnonymousFunction>, level: Int, id: Int)
@@ -115,8 +115,10 @@ fun CFGNode<*>.render(): String =
is ContractDescriptionEnterNode -> "Enter contract description"
is EnterValueParameterNode -> "Enter default value of ${fir.name}"
is EnterDefaultArgumentsNode -> "Enter default value of ${fir.name}"
is ExitDefaultArgumentsNode -> "Exit default value of ${fir.name}"
is ExitValueParameterNode -> "Exit default value of ${fir.name}"
is ElvisLhsExitNode -> "Exit lhs of ?:"
is ElvisLhsIsNotNullNode -> "Lhs of ?: is not null"
@@ -26,7 +26,7 @@ abstract class ControlFlowGraphVisitor<out R, in D> {
// ----------------------------------- Default arguments -----------------------------------
open fun visitExitDefaultArgumentsNode(node: ExitDefaultArgumentsNode, data: D): R {
open fun visitEnterValueParameterNode(node: EnterValueParameterNode, data: D): R {
return visitNode(node, data)
}
@@ -34,6 +34,14 @@ abstract class ControlFlowGraphVisitor<out R, in D> {
return visitNode(node, data)
}
open fun visitExitDefaultArgumentsNode(node: ExitDefaultArgumentsNode, data: D): R {
return visitNode(node, data)
}
open fun visitExitValueParameterNode(node: ExitValueParameterNode, data: D): R {
return visitNode(node, data)
}
// ----------------------------------- Anonymous function -----------------------------------
open fun visitSplitPostponedLambdasNode(node: SplitPostponedLambdasNode, data: D): R {