summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/cuchaz/enigma/TranslatingTypeLoader.java28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/main/java/cuchaz/enigma/TranslatingTypeLoader.java b/src/main/java/cuchaz/enigma/TranslatingTypeLoader.java
index eb780ee9..8300f21c 100644
--- a/src/main/java/cuchaz/enigma/TranslatingTypeLoader.java
+++ b/src/main/java/cuchaz/enigma/TranslatingTypeLoader.java
@@ -22,7 +22,10 @@ import cuchaz.enigma.mapping.entry.ReferencedEntryPool;
22import cuchaz.enigma.mapping.Translator; 22import cuchaz.enigma.mapping.Translator;
23import org.objectweb.asm.ClassWriter; 23import org.objectweb.asm.ClassWriter;
24import org.objectweb.asm.Opcodes; 24import org.objectweb.asm.Opcodes;
25import org.objectweb.asm.tree.AbstractInsnNode;
25import org.objectweb.asm.tree.ClassNode; 26import org.objectweb.asm.tree.ClassNode;
27import org.objectweb.asm.tree.MethodInsnNode;
28import org.objectweb.asm.tree.MethodNode;
26 29
27import java.util.List; 30import java.util.List;
28 31
@@ -89,6 +92,31 @@ public class TranslatingTypeLoader extends CachingTypeLoader implements ITransla
89 return null; 92 return null;
90 } 93 }
91 94
95
96 // remove <obj>.getClass() calls that are seemingly injected
97 // DUP
98 // INVOKEVIRTUAL java/lang/Object.getClass ()Ljava/lang/Class;
99 // POP
100 for (MethodNode methodNode : node.methods){
101 AbstractInsnNode insnNode = methodNode.instructions.getFirst();
102 while (insnNode != null){
103 if (insnNode instanceof MethodInsnNode && insnNode.getOpcode() == Opcodes.INVOKEVIRTUAL){
104 MethodInsnNode methodInsnNode = (MethodInsnNode)insnNode;
105 if (methodInsnNode.name.equals("getClass") && methodInsnNode.owner.equals("java/lang/Object") && methodInsnNode.desc.equals("()Ljava/lang/Class")){
106 AbstractInsnNode previous = methodInsnNode.getPrevious();
107 AbstractInsnNode next = methodInsnNode.getNext();
108 if (previous.getOpcode() == Opcodes.DUP && next.getOpcode() == Opcodes.POP){
109 insnNode = previous.getPrevious();//reset the iterator so it gets the new next instruction
110 methodNode.instructions.remove(previous);
111 methodNode.instructions.remove(methodInsnNode);
112 methodNode.instructions.remove(next);
113 }
114 }
115 }
116 insnNode = insnNode.getNext();
117 }
118 }
119
92 ClassWriter writer = new ClassWriter(0); 120 ClassWriter writer = new ClassWriter(0);
93 transformInto(node, writer); 121 transformInto(node, writer);
94 122