summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Thiakil2018-07-23 13:07:16 +0800
committerGravatar Thiakil2018-07-23 13:07:16 +0800
commit8c5d13ed87f92e982a3de489543f77da8a06d7ff (patch)
tree4feb867b492818524559e4447dd5ef76e7ec40f7
parentfix source index tokens for inner classes that are not mapped (diff)
downloadenigma-8c5d13ed87f92e982a3de489543f77da8a06d7ff.tar.gz
enigma-8c5d13ed87f92e982a3de489543f77da8a06d7ff.tar.xz
enigma-8c5d13ed87f92e982a3de489543f77da8a06d7ff.zip
remove injected DUP + getClass() + POP instructions
-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