[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 push(value: T)
} }
fun <T> stackOf(vararg values: T): Stack<T> = StackImpl(*values, pushCallback = null, popCallback = null) fun <T> stackOf(vararg values: T): Stack<T> = StackImpl(*values)
fun <T> stackWithCallbacks(pushCallback: (T) -> Unit, popCallback: (T) -> Unit): Stack<T> =
StackImpl(pushCallback = pushCallback, popCallback = popCallback)
val Stack<*>.isEmpty: Boolean get() = size == 0 val Stack<*>.isEmpty: Boolean get() = size == 0
val Stack<*>.isNotEmpty: Boolean get() = size != 0 val Stack<*>.isNotEmpty: Boolean get() = size != 0
fun <T> Stack<T>.topOrNull(): T? = if (size == 0) null else top() fun <T> Stack<T>.topOrNull(): T? = if (size == 0) null else top()
private class StackImpl<T>( private class StackImpl<T>(vararg values: T) : Stack<T> {
vararg values: T,
private val pushCallback: ((T) -> Unit)?,
private val popCallback: ((T) -> Unit)?
) : Stack<T> {
private val stack = mutableListOf(*values) private val stack = mutableListOf(*values)
override fun top(): T = stack[stack.size - 1] override fun top(): T = stack[stack.size - 1]
override fun pop(): T = stack.removeAt(stack.size - 1).also { element -> override fun pop(): T = stack.removeAt(stack.size - 1)
popCallback?.let { it(element) }
}
override fun push(value: T) { override fun push(value: T) {
stack.add(value) stack.add(value)
pushCallback?.let { it(value) }
} }
override val size: Int get() = stack.size override val size: Int get() = stack.size
} }
class NodeStorage<T : FirElement, N : CFGNode<T>>( class NodeStorage<T : FirElement, N : CFGNode<T>>() : Stack<N> {
pushCallback: ((N) -> Unit)? = null, private val stack: Stack<N> = StackImpl()
popCallback: ((N) -> Unit)? = null
) : Stack<N> {
private val stack: Stack<N> = StackImpl(pushCallback = pushCallback, popCallback = popCallback)
private val map: MutableMap<T, N> = mutableMapOf() private val map: MutableMap<T, N> = mutableMapOf()
override val size: Int get() = stack.size override val size: Int get() = stack.size
@@ -70,11 +57,8 @@ class NodeStorage<T : FirElement, N : CFGNode<T>>(
} }
} }
class SymbolBasedNodeStorage<T, N : CFGNode<T>>( class SymbolBasedNodeStorage<T, N : CFGNode<T>> : Stack<N> where T : FirElement {
pushCallback: ((N) -> Unit)? = null, private val stack: Stack<N> = StackImpl()
popCallback: ((N) -> Unit)? = null
) : Stack<N> where T : FirElement {
private val stack: Stack<N> = StackImpl(pushCallback = pushCallback, popCallback = popCallback)
private val map: MutableMap<FirBasedSymbol<*>, N> = mutableMapOf() private val map: MutableMap<FirBasedSymbol<*>, N> = mutableMapOf()
override val size: Int get() = stack.size override val size: Int get() = stack.size
@@ -39,15 +39,9 @@ class ControlFlowGraphBuilder {
private val binaryAndExitNodes: Stack<BinaryAndExitNode> = stackOf() private val binaryAndExitNodes: Stack<BinaryAndExitNode> = stackOf()
private val binaryOrExitNodes: Stack<BinaryOrExitNode> = stackOf() private val binaryOrExitNodes: Stack<BinaryOrExitNode> = stackOf()
private val topLevelVariableInitializerExitNodes: Stack<PropertyInitializerExitNode> = stackWithCallbacks( private val topLevelVariableInitializerExitNodes: Stack<PropertyInitializerExitNode> = stackOf()
pushCallback = { exitNodes.push(it) },
popCallback = { exitNodes.pop() }
)
private val initBlockExitNodes: Stack<InitBlockExitNode> = stackWithCallbacks( private val initBlockExitNodes: Stack<InitBlockExitNode> = stackOf()
pushCallback = { exitNodes.push(it) },
popCallback = { exitNodes.pop() }
)
var levelCounter: Int = 0 var levelCounter: Int = 0
private set private set
@@ -133,6 +127,7 @@ class ControlFlowGraphBuilder {
val enterNode = createPropertyInitializerEnterNode(property) val enterNode = createPropertyInitializerEnterNode(property)
val exitNode = createPropertyInitializerExitNode(property) val exitNode = createPropertyInitializerExitNode(property)
topLevelVariableInitializerExitNodes.push(exitNode) topLevelVariableInitializerExitNodes.push(exitNode)
exitNodes.push(exitNode)
lexicalScopes.push(stackOf(enterNode)) lexicalScopes.push(stackOf(enterNode))
graph.enterNode = enterNode graph.enterNode = enterNode
graph.exitNode = exitNode graph.exitNode = exitNode
@@ -146,6 +141,7 @@ class ControlFlowGraphBuilder {
it.markAsDeadIfNecessary() it.markAsDeadIfNecessary()
} }
levelCounter-- levelCounter--
exitNodes.pop()
lexicalScopes.pop() lexicalScopes.pop()
return topLevelVariableExitNode to graphs.pop() return topLevelVariableExitNode to graphs.pop()
} }
@@ -522,6 +518,7 @@ class ControlFlowGraphBuilder {
} }
val exitNode = createInitBlockExitNode(initBlock) val exitNode = createInitBlockExitNode(initBlock)
initBlockExitNodes.push(exitNode) initBlockExitNodes.push(exitNode)
exitNodes.push(exitNode)
levelCounter++ levelCounter++
return enterNode return enterNode
} }
@@ -532,6 +529,7 @@ class ControlFlowGraphBuilder {
addNewSimpleNode(it) addNewSimpleNode(it)
it.markAsDeadIfNecessary() it.markAsDeadIfNecessary()
lexicalScopes.pop() lexicalScopes.pop()
exitNodes.pop()
} }
} }