21 lines
1.3 KiB
Diff
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);
|
|
}
|