FIR CFA: remove some redundant node stacks
Honestly the amount of mutable state in the builder makes me somewhat uneasy.
This commit is contained in:
@@ -5,10 +5,6 @@
|
||||
|
||||
package org.jetbrains.kotlin.fir.resolve.dfa
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||
import org.jetbrains.kotlin.fir.resolve.dfa.cfg.CFGNode
|
||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||
import org.jetbrains.kotlin.fir.util.asReversedFrozen
|
||||
|
||||
abstract class Stack<T> {
|
||||
@@ -47,61 +43,3 @@ private class StackImpl<T>(vararg values: T) : Stack<T>() {
|
||||
|
||||
override fun all(): List<T> = stack.asReversedFrozen()
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
override fun top(): N = stack.top()
|
||||
|
||||
override fun pop(): N = stack.pop().also {
|
||||
map.remove(it.fir)
|
||||
}
|
||||
|
||||
override fun push(value: N) {
|
||||
stack.push(value)
|
||||
map[value.fir] = value
|
||||
}
|
||||
|
||||
operator fun get(key: T): N? {
|
||||
return map[key]
|
||||
}
|
||||
|
||||
override fun reset() {
|
||||
stack.reset()
|
||||
map.clear()
|
||||
}
|
||||
|
||||
override fun all(): List<N> = stack.all()
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
override fun top(): N = stack.top()
|
||||
|
||||
override fun pop(): N = stack.pop().also {
|
||||
map.remove((it.fir as FirDeclaration).symbol)
|
||||
}
|
||||
|
||||
override fun push(value: N) {
|
||||
stack.push(value)
|
||||
map[(value.fir as FirDeclaration).symbol] = value
|
||||
}
|
||||
|
||||
operator fun get(key: FirBasedSymbol<*>): N? {
|
||||
return map[key]
|
||||
}
|
||||
|
||||
override fun reset() {
|
||||
stack.reset()
|
||||
map.clear()
|
||||
}
|
||||
|
||||
override fun all(): List<N> = stack.all()
|
||||
}
|
||||
|
||||
@@ -746,7 +746,7 @@ object FirStub : FirExpression() {
|
||||
override fun replaceTypeRef(newTypeRef: FirTypeRef) { assert(newTypeRef.isNothing) }
|
||||
}
|
||||
|
||||
class FakeExpressionEnterNode(owner: ControlFlowGraph, level: Int) : CFGNode<FirStub>(owner, level) {
|
||||
class FakeExpressionEnterNode(owner: ControlFlowGraph, level: Int) : CFGNode<FirStub>(owner, level), GraphEnterNodeMarker, GraphExitNodeMarker {
|
||||
init { isDead = true }
|
||||
|
||||
override val fir: FirStub = FirStub
|
||||
|
||||
+1
@@ -37,6 +37,7 @@ class ControlFlowGraph(val declaration: FirDeclaration?, val name: String, val k
|
||||
Class,
|
||||
Function,
|
||||
AnonymousFunction,
|
||||
AnonymousFunctionCalledInPlace,
|
||||
PropertyInitializer,
|
||||
FieldInitializer,
|
||||
FakeCall,
|
||||
|
||||
Reference in New Issue
Block a user