Commit 2fbe188c50f0b959ae103eab5c8653ea3ec65e75
1 parent
cf1835df
prevent duplicate method in generated handler when superinterfaces have identical methods
Showing
1 changed file
with
11 additions
and
3 deletions
java/common/com/mumfrey/liteloader/core/event/HandlerList.java
... | ... | @@ -8,9 +8,11 @@ import java.net.URLClassLoader; |
8 | 8 | import java.util.ArrayList; |
9 | 9 | import java.util.Arrays; |
10 | 10 | import java.util.Collection; |
11 | +import java.util.HashSet; | |
11 | 12 | import java.util.Iterator; |
12 | 13 | import java.util.LinkedList; |
13 | 14 | import java.util.List; |
15 | +import java.util.Set; | |
14 | 16 | |
15 | 17 | import net.minecraft.launchwrapper.IClassTransformer; |
16 | 18 | import net.minecraft.launchwrapper.Launch; |
... | ... | @@ -710,7 +712,9 @@ public class HandlerList<T> extends LinkedList<T> implements FastIterableDeque<T |
710 | 712 | |
711 | 713 | this.populateClass(name, classNode); |
712 | 714 | this.transformMethods(name, classNode); |
713 | - this.injectInterfaceMethods(classNode, this.type.getName()); | |
715 | + | |
716 | + Set<String> generatedMethods = new HashSet<String>(); | |
717 | + this.injectInterfaceMethods(classNode, this.type.getName(), generatedMethods); | |
714 | 718 | } |
715 | 719 | |
716 | 720 | /** |
... | ... | @@ -832,9 +836,10 @@ public class HandlerList<T> extends LinkedList<T> implements FastIterableDeque<T |
832 | 836 | * |
833 | 837 | * @param classNode |
834 | 838 | * @param interfaceName |
839 | + * @param generatedMethods | |
835 | 840 | * @throws IOException |
836 | 841 | */ |
837 | - private void injectInterfaceMethods(ClassNode classNode, String interfaceName) throws IOException | |
842 | + private void injectInterfaceMethods(ClassNode classNode, String interfaceName, Set<String> generatedMethods) throws IOException | |
838 | 843 | { |
839 | 844 | ClassReader interfaceReader = new ClassReader(HandlerListClassLoader.getInterfaceBytes(interfaceName)); |
840 | 845 | ClassNode interfaceNode = new ClassNode(); |
... | ... | @@ -842,13 +847,16 @@ public class HandlerList<T> extends LinkedList<T> implements FastIterableDeque<T |
842 | 847 | |
843 | 848 | for (MethodNode interfaceMethod : interfaceNode.methods) |
844 | 849 | { |
850 | + String signature = interfaceMethod.name + interfaceMethod.desc; | |
851 | + if (generatedMethods.contains(signature)) continue; | |
852 | + generatedMethods.add(signature); | |
845 | 853 | classNode.methods.add(interfaceMethod); |
846 | 854 | this.populateInterfaceMethod(classNode, interfaceMethod); |
847 | 855 | } |
848 | 856 | |
849 | 857 | for (String parentInterface : interfaceNode.interfaces) |
850 | 858 | { |
851 | - this.injectInterfaceMethods(classNode, parentInterface.replace('/', '.')); | |
859 | + this.injectInterfaceMethods(classNode, parentInterface.replace('/', '.'), generatedMethods); | |
852 | 860 | } |
853 | 861 | } |
854 | 862 | ... | ... |