diff --git a/compiler/frontend/src/org/jetbrains/kotlin/cfg/PseudocodeTraverser.kt b/compiler/frontend/src/org/jetbrains/kotlin/cfg/PseudocodeTraverser.kt index a37de877b43..3768943a602 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/cfg/PseudocodeTraverser.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/cfg/PseudocodeTraverser.kt @@ -17,13 +17,13 @@ package org.jetbrains.kotlin.cfg.pseudocodeTraverser import org.jetbrains.kotlin.cfg.ControlFlowInfo -import org.jetbrains.kotlin.cfg.pseudocode.* -import java.util.* -import org.jetbrains.kotlin.cfg.pseudocodeTraverser.TraversalOrder.FORWARD -import org.jetbrains.kotlin.cfg.pseudocode.instructions.special.SubroutineSinkInstruction -import org.jetbrains.kotlin.cfg.pseudocode.instructions.special.LocalFunctionDeclarationInstruction +import org.jetbrains.kotlin.cfg.pseudocode.Pseudocode import org.jetbrains.kotlin.cfg.pseudocode.instructions.Instruction +import org.jetbrains.kotlin.cfg.pseudocode.instructions.special.LocalFunctionDeclarationInstruction import org.jetbrains.kotlin.cfg.pseudocode.instructions.special.SubroutineEnterInstruction +import org.jetbrains.kotlin.cfg.pseudocode.instructions.special.SubroutineSinkInstruction +import org.jetbrains.kotlin.cfg.pseudocodeTraverser.TraversalOrder.FORWARD +import java.util.* fun Pseudocode.traverse( traversalOrder: TraversalOrder, @@ -109,26 +109,7 @@ private fun > Pseudocode.collectDataFromSubgraph( if (!isLocal && isStart) continue - fun getPreviousIncludingSubGraphInstructions(): Collection { - val previous = instruction.getPreviousInstructions(traversalOrder) - if (instruction != startInstruction || previousSubGraphInstructions.isEmpty()) { - return previous - } - val result = ArrayList(previous) - result.addAll(previousSubGraphInstructions) - return result - } - val previousInstructions = getPreviousIncludingSubGraphInstructions() - - fun updateEdgeDataForInstruction( - previousValue: Edges?, - newValue: Edges? - ) { - if (previousValue != newValue && newValue != null) { - changed[0] = true - edgesMap.put(instruction, newValue) - } - } + val previousInstructions = getPreviousIncludingSubGraphInstructions(instruction, traversalOrder, startInstruction, previousSubGraphInstructions) if (instruction is LocalFunctionDeclarationInstruction) { val subroutinePseudocode = instruction.body @@ -146,7 +127,7 @@ private fun > Pseudocode.collectDataFromSubgraph( else Edges(updateEdge(lastInstruction, instruction, newValue.incoming), updateEdge(lastInstruction, instruction, newValue.outgoing)) - updateEdgeDataForInstruction(previousValue, updatedValue) + updateEdgeDataForInstruction(instruction, previousValue, updatedValue, edgesMap, changed) continue } } @@ -162,7 +143,30 @@ private fun > Pseudocode.collectDataFromSubgraph( } } val mergedData = mergeEdges(instruction, incomingEdgesData) - updateEdgeDataForInstruction(previousDataValue, mergedData) + updateEdgeDataForInstruction(instruction, previousDataValue, mergedData, edgesMap, changed) + } +} + +private fun getPreviousIncludingSubGraphInstructions( + instruction: Instruction, + traversalOrder: TraversalOrder, + startInstruction: Instruction, + previousSubGraphInstructions: Collection +): Collection { + val previous = instruction.getPreviousInstructions(traversalOrder) + if (instruction != startInstruction || previousSubGraphInstructions.isEmpty()) { + return previous + } + val result = ArrayList(previous) + result.addAll(previousSubGraphInstructions) + return result +} + +private fun > updateEdgeDataForInstruction( + instruction: Instruction, previousValue: Edges?, newValue: Edges?, edgesMap: MutableMap>, changed: BooleanArray) { + if (previousValue != newValue && newValue != null) { + changed[0] = true + edgesMap.put(instruction, newValue) } }