[FIR] Add special kind for graph of init blocks and local functions

This commit is contained in:
Dmitriy Novozhilov
2023-02-15 18:50:04 +02:00
committed by Space Team
parent c87e489dc9
commit 914acd841f
2 changed files with 5 additions and 2 deletions
@@ -155,7 +155,8 @@ class ControlFlowGraphBuilder {
val localFunctionNode = runIf(function is FirSimpleFunction && function.isLocal && bodyBuildingMode) { val localFunctionNode = runIf(function is FirSimpleFunction && function.isLocal && bodyBuildingMode) {
createLocalFunctionDeclarationNode(function).also { addNewSimpleNode(it) } createLocalFunctionDeclarationNode(function).also { addNewSimpleNode(it) }
} }
val enterNode = enterGraph(function, name, ControlFlowGraph.Kind.Function) { val kind = if (localFunctionNode != null) ControlFlowGraph.Kind.LocalFunction else ControlFlowGraph.Kind.Function
val enterNode = enterGraph(function, name, kind) {
createFunctionEnterNode(it) to createFunctionExitNode(it).also { exit -> exitTargetsForReturn[it.symbol] = exit } createFunctionEnterNode(it) to createFunctionExitNode(it).also { exit -> exitTargetsForReturn[it.symbol] = exit }
} }
if (localFunctionNode != null) { if (localFunctionNode != null) {
@@ -1151,7 +1152,7 @@ class ControlFlowGraphBuilder {
fun enterInitBlock(initBlock: FirAnonymousInitializer): InitBlockEnterNode { fun enterInitBlock(initBlock: FirAnonymousInitializer): InitBlockEnterNode {
// TODO: questionable moment that we should pass data flow from init to init // TODO: questionable moment that we should pass data flow from init to init
return enterGraph(initBlock, "init block", ControlFlowGraph.Kind.Function) { return enterGraph(initBlock, "init block", ControlFlowGraph.Kind.ClassInitializer) {
createInitBlockEnterNode(it) to createInitBlockExitNode(it) createInitBlockEnterNode(it) to createInitBlockExitNode(it)
}.also { addEdgeIfLocalClassMember(it) } }.also { addEdgeIfLocalClassMember(it) }
} }
@@ -34,9 +34,11 @@ class ControlFlowGraph(val declaration: FirDeclaration?, val name: String, val k
enum class Kind { enum class Kind {
Class, Class,
Function, Function,
LocalFunction,
AnonymousFunction, AnonymousFunction,
AnonymousFunctionCalledInPlace, AnonymousFunctionCalledInPlace,
PropertyInitializer, PropertyInitializer,
ClassInitializer,
FieldInitializer, FieldInitializer,
FakeCall, FakeCall,
DefaultArgument, DefaultArgument,