From 1077604237059f898e562f91b2eb859b78b6c832 Mon Sep 17 00:00:00 2001 From: Marco Rebhan Date: Thu, 23 Sep 2021 20:51:41 +0200 Subject: Fix resolveEquivalentMethods sometimes running into infinite recursion --- .../translation/mapping/IndexEntryResolver.java | 23 +++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/IndexEntryResolver.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/IndexEntryResolver.java index 1a89df7..00168ba 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/IndexEntryResolver.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/mapping/IndexEntryResolver.java @@ -1,6 +1,9 @@ package cuchaz.enigma.translation.mapping; -import com.google.common.collect.Sets; +import java.util.*; + +import javax.annotation.Nullable; + import cuchaz.enigma.analysis.IndexTreeBuilder; import cuchaz.enigma.analysis.MethodImplementationsTreeNode; import cuchaz.enigma.analysis.MethodInheritanceTreeNode; @@ -14,9 +17,6 @@ import cuchaz.enigma.translation.representation.entry.ClassEntry; import cuchaz.enigma.translation.representation.entry.Entry; import cuchaz.enigma.translation.representation.entry.MethodEntry; -import javax.annotation.Nullable; -import java.util.*; - public class IndexEntryResolver implements EntryResolver { private final EntryIndex entryIndex; private final InheritanceIndex inheritanceIndex; @@ -155,18 +155,23 @@ public class IndexEntryResolver implements EntryResolver { @Override public Set resolveEquivalentMethods(MethodEntry methodEntry) { + Set set = new HashSet<>(); + resolveEquivalentMethods(set, methodEntry); + return set; + } + + private void resolveEquivalentMethods(Set methodEntries, MethodEntry methodEntry) { AccessFlags access = entryIndex.getMethodAccess(methodEntry); if (access == null) { throw new IllegalArgumentException("Could not find method " + methodEntry); } if (!canInherit(methodEntry, access)) { - return Collections.singleton(methodEntry); + methodEntries.add(methodEntry); + return; } - Set methodEntries = Sets.newHashSet(); resolveEquivalentMethods(methodEntries, treeBuilder.buildMethodInheritance(VoidTranslator.INSTANCE, methodEntry)); - return methodEntries; } private void resolveEquivalentMethods(Set methodEntries, MethodInheritanceTreeNode node) { @@ -184,7 +189,7 @@ public class IndexEntryResolver implements EntryResolver { // look at bridge methods! MethodEntry bridgedMethod = bridgeMethodIndex.getBridgeFromSpecialized(methodEntry); while (bridgedMethod != null) { - methodEntries.addAll(resolveEquivalentMethods(bridgedMethod)); + resolveEquivalentMethods(methodEntries, bridgedMethod); bridgedMethod = bridgeMethodIndex.getBridgeFromSpecialized(bridgedMethod); } @@ -210,7 +215,7 @@ public class IndexEntryResolver implements EntryResolver { // look at bridge methods! MethodEntry bridgedMethod = bridgeMethodIndex.getBridgeFromSpecialized(methodEntry); while (bridgedMethod != null) { - methodEntries.addAll(resolveEquivalentMethods(bridgedMethod)); + resolveEquivalentMethods(methodEntries, bridgedMethod); bridgedMethod = bridgeMethodIndex.getBridgeFromSpecialized(bridgedMethod); } -- cgit v1.2.3