From 286be9cdd3133ad118477efaa4288647cc681155 Mon Sep 17 00:00:00 2001 From: Graham Date: Thu, 9 Apr 2020 20:04:13 +0100 Subject: [PATCH] Use work lists to speed up DataFlowAnalyzer Signed-off-by: Graham --- .../openrs2/deob/analysis/DataFlowAnalyzer.kt | 35 ++++++++++--------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/deob/src/main/java/dev/openrs2/deob/analysis/DataFlowAnalyzer.kt b/deob/src/main/java/dev/openrs2/deob/analysis/DataFlowAnalyzer.kt index 06692684..917c20e0 100644 --- a/deob/src/main/java/dev/openrs2/deob/analysis/DataFlowAnalyzer.kt +++ b/deob/src/main/java/dev/openrs2/deob/analysis/DataFlowAnalyzer.kt @@ -1,5 +1,6 @@ package dev.openrs2.deob.analysis +import dev.openrs2.util.collect.removeFirstOrNull import org.jgrapht.Graph import org.jgrapht.graph.DefaultEdge import org.jgrapht.graph.EdgeReversedGraph @@ -45,28 +46,30 @@ abstract class DataFlowAnalyzer(owner: String, private val method: MethodNode outSets[node] = createInitialSet() } - var changed: Boolean - do { - changed = false + val workList = LinkedHashSet(graph.vertexSet()) + while (true) { + val node = workList.removeFirstOrNull() ?: break - for (node in graph.vertexSet()) { - val predecessors = graph.incomingEdgesOf(node).map { edge -> outSets[graph.getEdgeSource(edge)]!! } + val predecessors = graph.incomingEdgesOf(node).map { edge -> outSets[graph.getEdgeSource(edge)]!! } - val inSet = if (predecessors.isEmpty()) { - createInitialSet() - } else { - predecessors.reduce(this::join) - } + val inSet = if (predecessors.isEmpty()) { + createInitialSet() + } else { + predecessors.reduce(this::join) + } - inSets[node] = inSet + inSets[node] = inSet - val outSet = transfer(inSet, method.instructions[node]) + val outSet = transfer(inSet, method.instructions[node]) - if (outSets[node] != outSet) { - outSets[node] = outSet - changed = true + if (outSets[node] != outSet) { + outSets[node] = outSet + + for (edge in graph.outgoingEdgesOf(node)) { + val successor = graph.getEdgeTarget(edge) + workList += successor } } - } while (changed) + } } }