[FIR] Remove callbacks from stacks in DFA
This commit is contained in:
@@ -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
|
||||||
|
|||||||
+6
-8
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user