CFA merge for definition / initialization : more accurate handling of unknown variables #KT-13969 Fixed
(cherry picked from commit 4a96589)
This commit is contained in:
committed by
Mikhail Glukhikh
parent
797f7ab28e
commit
436b0ec873
@@ -63,7 +63,6 @@ fun <I : ControlFlowInfo<*>> Pseudocode.collectData(
|
||||
initialInfo: I
|
||||
): Map<Instruction, Edges<I>> {
|
||||
val edgesMap = LinkedHashMap<Instruction, Edges<I>>()
|
||||
initializeEdgesMap(edgesMap, initialInfo)
|
||||
edgesMap.put(getStartInstruction(traversalOrder), Edges(initialInfo, initialInfo))
|
||||
|
||||
val changed = BooleanArray(1)
|
||||
@@ -77,20 +76,6 @@ fun <I : ControlFlowInfo<*>> Pseudocode.collectData(
|
||||
return edgesMap
|
||||
}
|
||||
|
||||
private fun <I> Pseudocode.initializeEdgesMap(
|
||||
edgesMap: MutableMap<Instruction, Edges<I>>,
|
||||
initialInfo: I
|
||||
) {
|
||||
val instructions = instructions
|
||||
val initialEdge = Edges(initialInfo, initialInfo)
|
||||
for (instruction in instructions) {
|
||||
edgesMap.put(instruction, initialEdge)
|
||||
if (instruction is LocalFunctionDeclarationInstruction) {
|
||||
instruction.body.initializeEdgesMap(edgesMap, initialInfo)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun <I : ControlFlowInfo<*>> Pseudocode.collectDataFromSubgraph(
|
||||
traversalOrder: TraversalOrder,
|
||||
mergeDataWithLocalDeclarations: Boolean,
|
||||
|
||||
@@ -221,12 +221,10 @@ class PseudocodeVariablesData(val pseudocode: Pseudocode, private val bindingCon
|
||||
var initState: InitState? = null
|
||||
var isDeclared = true
|
||||
for (edgeData in incomingEdgesData) {
|
||||
val varControlFlowState = edgeData[variable]
|
||||
if (varControlFlowState != null) {
|
||||
initState = initState?.merge(varControlFlowState.initState) ?: varControlFlowState.initState
|
||||
if (!varControlFlowState.isDeclared) {
|
||||
isDeclared = false
|
||||
}
|
||||
val varControlFlowState = edgeData[variable] ?: VariableControlFlowState.create(isInitialized = false)
|
||||
initState = initState?.merge(varControlFlowState.initState) ?: varControlFlowState.initState
|
||||
if (!varControlFlowState.isDeclared) {
|
||||
isDeclared = false
|
||||
}
|
||||
}
|
||||
if (initState == null) {
|
||||
|
||||
Reference in New Issue
Block a user