[FIR] Remove callbacks from stacks in DFA

This commit is contained in:
Dmitriy Novozhilov
2019-09-04 19:13:54 +03:00
parent beaab19eb9
commit 2f6f07bc7d
2 changed files with 13 additions and 31 deletions
@@ -17,39 +17,26 @@ interface Stack<T> {
fun push(value: T)
}
fun <T> stackOf(vararg values: T): Stack<T> = StackImpl(*values, pushCallback = null, popCallback = null)
fun <T> stackWithCallbacks(pushCallback: (T) -> Unit, popCallback: (T) -> Unit): Stack<T> =
StackImpl(pushCallback = pushCallback, popCallback = popCallback)
fun <T> stackOf(vararg values: T): Stack<T> = StackImpl(*values)
val Stack<*>.isEmpty: Boolean get() = size == 0
val Stack<*>.isNotEmpty: Boolean get() = size != 0
fun <T> Stack<T>.topOrNull(): T? = if (size == 0) null else top()
private class StackImpl<T>(
vararg values: T,
private val pushCallback: ((T) -> Unit)?,
private val popCallback: ((T) -> Unit)?
) : Stack<T> {
private class StackImpl<T>(vararg values: T) : Stack<T> {
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<T : FirElement, N : CFGNode<T>>(
pushCallback: ((N) -> Unit)? = null,
popCallback: ((N) -> Unit)? = null
) : Stack<N> {
private val stack: Stack<N> = StackImpl(pushCallback = pushCallback, popCallback = popCallback)
class NodeStorage<T : FirElement, N : CFGNode<T>>() : Stack<N> {
private val stack: Stack<N> = StackImpl()
private val map: MutableMap<T, N> = mutableMapOf()
override val size: Int get() = stack.size
@@ -70,11 +57,8 @@ class NodeStorage<T : FirElement, N : CFGNode<T>>(
}
}
class SymbolBasedNodeStorage<T, N : CFGNode<T>>(
pushCallback: ((N) -> Unit)? = null,
popCallback: ((N) -> Unit)? = null
) : Stack<N> where T : FirElement {
private val stack: Stack<N> = StackImpl(pushCallback = pushCallback, popCallback = popCallback)
class SymbolBasedNodeStorage<T, N : CFGNode<T>> : Stack<N> where T : FirElement {
private val stack: Stack<N> = StackImpl()
private val map: MutableMap<FirBasedSymbol<*>, N> = mutableMapOf()
override val size: Int get() = stack.size
@@ -39,15 +39,9 @@ class ControlFlowGraphBuilder {
private val binaryAndExitNodes: Stack<BinaryAndExitNode> = stackOf()
private val binaryOrExitNodes: Stack<BinaryOrExitNode> = stackOf()
private val topLevelVariableInitializerExitNodes: Stack<PropertyInitializerExitNode> = stackWithCallbacks(
pushCallback = { exitNodes.push(it) },
popCallback = { exitNodes.pop() }
)
private val topLevelVariableInitializerExitNodes: Stack<PropertyInitializerExitNode> = stackOf()
private val initBlockExitNodes: Stack<InitBlockExitNode> = stackWithCallbacks(
pushCallback = { exitNodes.push(it) },
popCallback = { exitNodes.pop() }
)
private val initBlockExitNodes: Stack<InitBlockExitNode> = 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()
}
}