java-topology/defects/minecraft/patch/minecraft-0001-dependency-sorter-visited-set.patch

21 lines
1.3 KiB
Diff

# UNDF: UNDF-2026-000000366
--- a/src/main/java/net/minecraft/util/DependencySorter.java
+++ b/src/main/java/net/minecraft/util/DependencySorter.java
@@ -20,11 +20,12 @@ public class DependencySorter<K, V extends DependencySorter.Entry<K>> {
* Check whether adding an edge from→to would create a cycle.
* BEFORE: no visited set — exponential revisiting of shared ancestors.
+ * AFTER: visited set prevents O(E^D) blowup on diamond dependency graphs.
*/
- private static <K> boolean isCyclic(Multimap<K, K> directDependencies, K from, K to) {
+ private static <K> boolean isCyclic(Multimap<K, K> directDependencies, K from, K to, Set<K> visited) {
+ if (!visited.add(to)) return false;
Collection<K> dependencies = directDependencies.get(to);
if (dependencies.contains(from)) return true;
- return dependencies.stream().anyMatch(dep -> isCyclic(directDependencies, from, dep));
+ return dependencies.stream().anyMatch(dep -> isCyclic(directDependencies, from, dep, visited));
}
private static <K> void addDependencyIfNotCyclic(Multimap<K, K> directDependencies, K from, K to) {
- if (!isCyclic(directDependencies, from, to)) directDependencies.put(from, to);
+ if (!isCyclic(directDependencies, from, to, new HashSet<>())) directDependencies.put(from, to);
}