Commit 2fbe188c50f0b959ae103eab5c8653ea3ec65e75

Authored by Mumfrey
1 parent cf1835df

prevent duplicate method in generated handler when superinterfaces have identical methods

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&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;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&lt;T&gt; extends LinkedList&lt;T&gt; implements FastIterableDeque&lt;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  
... ...