diff options
| author | 2021-09-23 20:51:41 +0200 | |
|---|---|---|
| committer | 2021-09-23 20:51:41 +0200 | |
| commit | 1077604237059f898e562f91b2eb859b78b6c832 (patch) | |
| tree | fe442b868d80e6d91978648095bc976146e6d54d | |
| parent | Bump version (diff) | |
| download | enigma-fork-1077604237059f898e562f91b2eb859b78b6c832.tar.gz enigma-fork-1077604237059f898e562f91b2eb859b78b6c832.tar.xz enigma-fork-1077604237059f898e562f91b2eb859b78b6c832.zip | |
Fix resolveEquivalentMethods sometimes running into infinite recursion
| -rw-r--r-- | enigma/src/main/java/cuchaz/enigma/translation/mapping/IndexEntryResolver.java | 23 |
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 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 @@ | |||
| 1 | package cuchaz.enigma.translation.mapping; | 1 | package cuchaz.enigma.translation.mapping; |
| 2 | 2 | ||
| 3 | import com.google.common.collect.Sets; | 3 | import java.util.*; |
| 4 | |||
| 5 | import javax.annotation.Nullable; | ||
| 6 | |||
| 4 | import cuchaz.enigma.analysis.IndexTreeBuilder; | 7 | import cuchaz.enigma.analysis.IndexTreeBuilder; |
| 5 | import cuchaz.enigma.analysis.MethodImplementationsTreeNode; | 8 | import cuchaz.enigma.analysis.MethodImplementationsTreeNode; |
| 6 | import cuchaz.enigma.analysis.MethodInheritanceTreeNode; | 9 | import cuchaz.enigma.analysis.MethodInheritanceTreeNode; |
| @@ -14,9 +17,6 @@ import cuchaz.enigma.translation.representation.entry.ClassEntry; | |||
| 14 | import cuchaz.enigma.translation.representation.entry.Entry; | 17 | import cuchaz.enigma.translation.representation.entry.Entry; |
| 15 | import cuchaz.enigma.translation.representation.entry.MethodEntry; | 18 | import cuchaz.enigma.translation.representation.entry.MethodEntry; |
| 16 | 19 | ||
| 17 | import javax.annotation.Nullable; | ||
| 18 | import java.util.*; | ||
| 19 | |||
| 20 | public class IndexEntryResolver implements EntryResolver { | 20 | public 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 | ||