summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Marco Rebhan2021-09-23 20:51:41 +0200
committerGravatar Marco Rebhan2021-09-23 20:51:41 +0200
commit1077604237059f898e562f91b2eb859b78b6c832 (patch)
treefe442b868d80e6d91978648095bc976146e6d54d
parentBump version (diff)
downloadenigma-1077604237059f898e562f91b2eb859b78b6c832.tar.gz
enigma-1077604237059f898e562f91b2eb859b78b6c832.tar.xz
enigma-1077604237059f898e562f91b2eb859b78b6c832.zip
Fix resolveEquivalentMethods sometimes running into infinite recursion
-rw-r--r--enigma/src/main/java/cuchaz/enigma/translation/mapping/IndexEntryResolver.java23
1 files 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 1a89df7b..00168ba7 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 @@
1package cuchaz.enigma.translation.mapping; 1package cuchaz.enigma.translation.mapping;
2 2
3import com.google.common.collect.Sets; 3import java.util.*;
4
5import javax.annotation.Nullable;
6
4import cuchaz.enigma.analysis.IndexTreeBuilder; 7import cuchaz.enigma.analysis.IndexTreeBuilder;
5import cuchaz.enigma.analysis.MethodImplementationsTreeNode; 8import cuchaz.enigma.analysis.MethodImplementationsTreeNode;
6import cuchaz.enigma.analysis.MethodInheritanceTreeNode; 9import cuchaz.enigma.analysis.MethodInheritanceTreeNode;
@@ -14,9 +17,6 @@ import cuchaz.enigma.translation.representation.entry.ClassEntry;
14import cuchaz.enigma.translation.representation.entry.Entry; 17import cuchaz.enigma.translation.representation.entry.Entry;
15import cuchaz.enigma.translation.representation.entry.MethodEntry; 18import cuchaz.enigma.translation.representation.entry.MethodEntry;
16 19
17import javax.annotation.Nullable;
18import java.util.*;
19
20public class IndexEntryResolver implements EntryResolver { 20public class IndexEntryResolver implements EntryResolver {
21 private final EntryIndex entryIndex; 21 private final EntryIndex entryIndex;
22 private final InheritanceIndex inheritanceIndex; 22 private final InheritanceIndex inheritanceIndex;
@@ -155,18 +155,23 @@ public class IndexEntryResolver implements EntryResolver {
155 155
156 @Override 156 @Override
157 public Set<MethodEntry> resolveEquivalentMethods(MethodEntry methodEntry) { 157 public Set<MethodEntry> resolveEquivalentMethods(MethodEntry methodEntry) {
158 Set<MethodEntry> set = new HashSet<>();
159 resolveEquivalentMethods(set, methodEntry);
160 return set;
161 }
162
163 private void resolveEquivalentMethods(Set<MethodEntry> methodEntries, MethodEntry methodEntry) {
158 AccessFlags access = entryIndex.getMethodAccess(methodEntry); 164 AccessFlags access = entryIndex.getMethodAccess(methodEntry);
159 if (access == null) { 165 if (access == null) {
160 throw new IllegalArgumentException("Could not find method " + methodEntry); 166 throw new IllegalArgumentException("Could not find method " + methodEntry);
161 } 167 }
162 168
163 if (!canInherit(methodEntry, access)) { 169 if (!canInherit(methodEntry, access)) {
164 return Collections.singleton(methodEntry); 170 methodEntries.add(methodEntry);
171 return;
165 } 172 }
166 173
167 Set<MethodEntry> methodEntries = Sets.newHashSet();
168 resolveEquivalentMethods(methodEntries, treeBuilder.buildMethodInheritance(VoidTranslator.INSTANCE, methodEntry)); 174 resolveEquivalentMethods(methodEntries, treeBuilder.buildMethodInheritance(VoidTranslator.INSTANCE, methodEntry));
169 return methodEntries;
170 } 175 }
171 176
172 private void resolveEquivalentMethods(Set<MethodEntry> methodEntries, MethodInheritanceTreeNode node) { 177 private void resolveEquivalentMethods(Set<MethodEntry> methodEntries, MethodInheritanceTreeNode node) {
@@ -184,7 +189,7 @@ public class IndexEntryResolver implements EntryResolver {
184 // look at bridge methods! 189 // look at bridge methods!
185 MethodEntry bridgedMethod = bridgeMethodIndex.getBridgeFromSpecialized(methodEntry); 190 MethodEntry bridgedMethod = bridgeMethodIndex.getBridgeFromSpecialized(methodEntry);
186 while (bridgedMethod != null) { 191 while (bridgedMethod != null) {
187 methodEntries.addAll(resolveEquivalentMethods(bridgedMethod)); 192 resolveEquivalentMethods(methodEntries, bridgedMethod);
188 bridgedMethod = bridgeMethodIndex.getBridgeFromSpecialized(bridgedMethod); 193 bridgedMethod = bridgeMethodIndex.getBridgeFromSpecialized(bridgedMethod);
189 } 194 }
190 195
@@ -210,7 +215,7 @@ public class IndexEntryResolver implements EntryResolver {
210 // look at bridge methods! 215 // look at bridge methods!
211 MethodEntry bridgedMethod = bridgeMethodIndex.getBridgeFromSpecialized(methodEntry); 216 MethodEntry bridgedMethod = bridgeMethodIndex.getBridgeFromSpecialized(methodEntry);
212 while (bridgedMethod != null) { 217 while (bridgedMethod != null) {
213 methodEntries.addAll(resolveEquivalentMethods(bridgedMethod)); 218 resolveEquivalentMethods(methodEntries, bridgedMethod);
214 bridgedMethod = bridgeMethodIndex.getBridgeFromSpecialized(bridgedMethod); 219 bridgedMethod = bridgeMethodIndex.getBridgeFromSpecialized(bridgedMethod);
215 } 220 }
216 221