diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/Stack.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/Stack.kt index e336b9b92a0..627a34ca8d2 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/Stack.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/Stack.kt @@ -17,39 +17,26 @@ interface Stack { fun push(value: T) } -fun stackOf(vararg values: T): Stack = StackImpl(*values, pushCallback = null, popCallback = null) -fun stackWithCallbacks(pushCallback: (T) -> Unit, popCallback: (T) -> Unit): Stack = - StackImpl(pushCallback = pushCallback, popCallback = popCallback) - +fun stackOf(vararg values: T): Stack = StackImpl(*values) val Stack<*>.isEmpty: Boolean get() = size == 0 val Stack<*>.isNotEmpty: Boolean get() = size != 0 fun Stack.topOrNull(): T? = if (size == 0) null else top() -private class StackImpl( - vararg values: T, - private val pushCallback: ((T) -> Unit)?, - private val popCallback: ((T) -> Unit)? -) : Stack { +private class StackImpl(vararg values: T) : Stack { private val stack = mutableListOf(*values) override fun top(): T = stack[stack.size - 1] - override fun pop(): T = stack.removeAt(stack.size - 1).also { element -> - popCallback?.let { it(element) } - } + override fun pop(): T = stack.removeAt(stack.size - 1) override fun push(value: T) { stack.add(value) - pushCallback?.let { it(value) } } override val size: Int get() = stack.size } -class NodeStorage>( - pushCallback: ((N) -> Unit)? = null, - popCallback: ((N) -> Unit)? = null -) : Stack { - private val stack: Stack = StackImpl(pushCallback = pushCallback, popCallback = popCallback) +class NodeStorage>() : Stack { + private val stack: Stack = StackImpl() private val map: MutableMap = mutableMapOf() override val size: Int get() = stack.size @@ -70,11 +57,8 @@ class NodeStorage>( } } -class SymbolBasedNodeStorage>( - pushCallback: ((N) -> Unit)? = null, - popCallback: ((N) -> Unit)? = null -) : Stack where T : FirElement { - private val stack: Stack = StackImpl(pushCallback = pushCallback, popCallback = popCallback) +class SymbolBasedNodeStorage> : Stack where T : FirElement { + private val stack: Stack = StackImpl() private val map: MutableMap, N> = mutableMapOf() override val size: Int get() = stack.size diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt index aa368ceab02..e67c16cb8d4 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt @@ -39,15 +39,9 @@ class ControlFlowGraphBuilder { private val binaryAndExitNodes: Stack = stackOf() private val binaryOrExitNodes: Stack = stackOf() - private val topLevelVariableInitializerExitNodes: Stack = stackWithCallbacks( - pushCallback = { exitNodes.push(it) }, - popCallback = { exitNodes.pop() } - ) + private val topLevelVariableInitializerExitNodes: Stack = stackOf() - private val initBlockExitNodes: Stack = stackWithCallbacks( - pushCallback = { exitNodes.push(it) }, - popCallback = { exitNodes.pop() } - ) + private val initBlockExitNodes: Stack = stackOf() var levelCounter: Int = 0 private set @@ -133,6 +127,7 @@ class ControlFlowGraphBuilder { val enterNode = createPropertyInitializerEnterNode(property) val exitNode = createPropertyInitializerExitNode(property) topLevelVariableInitializerExitNodes.push(exitNode) + exitNodes.push(exitNode) lexicalScopes.push(stackOf(enterNode)) graph.enterNode = enterNode graph.exitNode = exitNode @@ -146,6 +141,7 @@ class ControlFlowGraphBuilder { it.markAsDeadIfNecessary() } levelCounter-- + exitNodes.pop() lexicalScopes.pop() return topLevelVariableExitNode to graphs.pop() } @@ -522,6 +518,7 @@ class ControlFlowGraphBuilder { } val exitNode = createInitBlockExitNode(initBlock) initBlockExitNodes.push(exitNode) + exitNodes.push(exitNode) levelCounter++ return enterNode } @@ -532,6 +529,7 @@ class ControlFlowGraphBuilder { addNewSimpleNode(it) it.markAsDeadIfNecessary() lexicalScopes.pop() + exitNodes.pop() } }