From ca7fcf101ab1f7a41544c70545fbfea7dbe40ae3 Mon Sep 17 00:00:00 2001 From: Michael Himing Date: Mon, 27 Nov 2017 11:09:48 +1100 Subject: [PATCH] Cleanup transformer --- .../io/prplz/memoryfix/ClassTransformer.java | 124 ++++++++---------- 1 file changed, 54 insertions(+), 70 deletions(-) diff --git a/src/main/java/io/prplz/memoryfix/ClassTransformer.java b/src/main/java/io/prplz/memoryfix/ClassTransformer.java index e7abfd7..f71447c 100644 --- a/src/main/java/io/prplz/memoryfix/ClassTransformer.java +++ b/src/main/java/io/prplz/memoryfix/ClassTransformer.java @@ -12,6 +12,7 @@ import org.objectweb.asm.tree.MethodNode; import java.util.Iterator; +import java.util.function.BiConsumer; public class ClassTransformer implements IClassTransformer { @@ -22,14 +23,27 @@ public byte[] transform(String name, String transformedName, byte[] bytes) { return transformCapeUtils(bytes); } else if (name.equals("io.prplz.memoryfix.CapeImageBuffer")) { // Redirect our stub calls to optifine - return transformCapeImageBuffer(bytes); + return transformMethods(bytes, this::transformCapeImageBuffer); } else if (transformedName.equals("net.minecraft.client.resources.AbstractResourcePack")) { - return transformAbstractResourcePack(bytes); + return transformMethods(bytes, this::transformAbstractResourcePack); } else if (transformedName.equals("net.minecraft.client.Minecraft")) { // Remove System.gc calls (they all happen in this class) - return transformMinecraft(bytes); + return transformMethods(bytes, this::transformMinecraft); + } else { + return bytes; } - return bytes; + } + + private byte[] transformMethods(byte[] bytes, BiConsumer transformer) { + ClassReader classReader = new ClassReader(bytes); + ClassNode classNode = new ClassNode(); + classReader.accept(classNode, ClassReader.EXPAND_FRAMES); + + classNode.methods.forEach(m -> transformer.accept(classNode, m)); + + ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); + classNode.accept(classWriter); + return classWriter.toByteArray(); } private byte[] transformCapeUtils(byte[] bytes) { @@ -50,84 +64,54 @@ public String map(String typeName) { return classWriter.toByteArray(); } - private byte[] transformCapeImageBuffer(byte[] bytes) { - ClassReader classReader = new ClassReader(bytes); - ClassNode classNode = new ClassNode(); - classReader.accept(classNode, ClassReader.EXPAND_FRAMES); - - for (MethodNode method : classNode.methods) { - Iterator iter = method.instructions.iterator(); - while (iter.hasNext()) { - AbstractInsnNode insn = iter.next(); - if (insn instanceof MethodInsnNode) { - MethodInsnNode methodInsn = (MethodInsnNode) insn; - if (methodInsn.name.equals("parseCape")) { - methodInsn.owner = "CapeUtils"; - } else if (methodInsn.name.equals("setLocationOfCape")) { - methodInsn.setOpcode(Opcodes.INVOKEVIRTUAL); - methodInsn.owner = "net/minecraft/client/entity/AbstractClientPlayer"; - methodInsn.desc = "(Lnet/minecraft/util/ResourceLocation;)V"; - } + private void transformCapeImageBuffer(ClassNode clazz, MethodNode method) { + Iterator iter = method.instructions.iterator(); + while (iter.hasNext()) { + AbstractInsnNode insn = iter.next(); + if (insn instanceof MethodInsnNode) { + MethodInsnNode methodInsn = (MethodInsnNode) insn; + if (methodInsn.name.equals("parseCape")) { + methodInsn.owner = "CapeUtils"; + } else if (methodInsn.name.equals("setLocationOfCape")) { + methodInsn.setOpcode(Opcodes.INVOKEVIRTUAL); + methodInsn.owner = "net/minecraft/client/entity/AbstractClientPlayer"; + methodInsn.desc = "(Lnet/minecraft/util/ResourceLocation;)V"; } } } - - ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); - classNode.accept(classWriter); - return classWriter.toByteArray(); } - private byte[] transformAbstractResourcePack(byte[] bytes) { - ClassReader classReader = new ClassReader(bytes); - ClassNode classNode = new ClassNode(); - classReader.accept(classNode, ClassReader.EXPAND_FRAMES); - - for (MethodNode method : classNode.methods) { - if (DeobfUtil.matchMethod( - classNode, - method, - "func_110586_a", - "getPackImage", - "()Ljava/awt/image/BufferedImage;")) { - Iterator iter = method.instructions.iterator(); - while (iter.hasNext()) { - AbstractInsnNode insn = iter.next(); - if (insn.getOpcode() == Opcodes.ARETURN) { - method.instructions.insertBefore(insn, new MethodInsnNode( - Opcodes.INVOKESTATIC, - "io.prplz.memoryfix.ResourcePackImageScaler".replace('.', '/'), - "scalePackImage", - "(Ljava/awt/image/BufferedImage;)Ljava/awt/image/BufferedImage;")); - } + private void transformAbstractResourcePack(ClassNode clazz, MethodNode method) { + if (DeobfUtil.matchMethod( + clazz, + method, + "func_110586_a", + "getPackImage", + "()Ljava/awt/image/BufferedImage;")) { + Iterator iter = method.instructions.iterator(); + while (iter.hasNext()) { + AbstractInsnNode insn = iter.next(); + if (insn.getOpcode() == Opcodes.ARETURN) { + method.instructions.insertBefore(insn, new MethodInsnNode( + Opcodes.INVOKESTATIC, + "io.prplz.memoryfix.ResourcePackImageScaler".replace('.', '/'), + "scalePackImage", + "(Ljava/awt/image/BufferedImage;)Ljava/awt/image/BufferedImage;")); } } } - - ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); - classNode.accept(classWriter); - return classWriter.toByteArray(); } - private byte[] transformMinecraft(byte[] bytes) { - ClassReader classReader = new ClassReader(bytes); - ClassNode classNode = new ClassNode(); - classReader.accept(classNode, ClassReader.EXPAND_FRAMES); - - for (MethodNode method : classNode.methods) { - Iterator iter = method.instructions.iterator(); - while (iter.hasNext()) { - AbstractInsnNode insn = iter.next(); - if (insn.getOpcode() == Opcodes.INVOKESTATIC) { - MethodInsnNode methodInsn = (MethodInsnNode) insn; - if (methodInsn.owner.equals("java/lang/System") && methodInsn.name.equals("gc")) { - iter.remove(); - } + private void transformMinecraft(ClassNode clazz, MethodNode method) { + Iterator iter = method.instructions.iterator(); + while (iter.hasNext()) { + AbstractInsnNode insn = iter.next(); + if (insn.getOpcode() == Opcodes.INVOKESTATIC) { + MethodInsnNode methodInsn = (MethodInsnNode) insn; + if (methodInsn.owner.equals("java/lang/System") && methodInsn.name.equals("gc")) { + iter.remove(); } } } - - ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); - classNode.accept(classWriter); - return classWriter.toByteArray(); } }