From 1f4007e5d86b68a2a951fcef6630b6f58bdff5c5 Mon Sep 17 00:00:00 2001 From: James Mitchell Date: Wed, 21 Dec 2016 11:15:13 -0800 Subject: [PATCH] Properly deobfuscate lambda expressions (#3552) --- .../deobf/FMLRemappingAdapter.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/main/java/net/minecraftforge/fml/common/asm/transformers/deobf/FMLRemappingAdapter.java b/src/main/java/net/minecraftforge/fml/common/asm/transformers/deobf/FMLRemappingAdapter.java index 64aa59a57f..dccd896dbd 100644 --- a/src/main/java/net/minecraftforge/fml/common/asm/transformers/deobf/FMLRemappingAdapter.java +++ b/src/main/java/net/minecraftforge/fml/common/asm/transformers/deobf/FMLRemappingAdapter.java @@ -21,18 +21,30 @@ package net.minecraftforge.fml.common.asm.transformers.deobf; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.FieldVisitor; +import org.objectweb.asm.Handle; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; +import org.objectweb.asm.Type; import org.objectweb.asm.commons.Remapper; import org.objectweb.asm.commons.RemappingClassAdapter; import org.objectweb.asm.commons.RemappingMethodAdapter; +import java.util.Arrays; +import java.util.List; + public class FMLRemappingAdapter extends RemappingClassAdapter { public FMLRemappingAdapter(ClassVisitor cv) { super(cv, FMLDeobfuscatingRemapper.INSTANCE); } + private static final List META_FACTORIES = Arrays.asList( + new Handle(Opcodes.H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory", "metafactory", + "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;"), + new Handle(Opcodes.H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory", "altMetafactory", + "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;") + ); + @Override public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { @@ -89,5 +101,19 @@ public class FMLRemappingAdapter extends RemappingClassAdapter { mv.visitFieldInsn(opcode, type, fieldName, newDesc); } } + + @Override + public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) + { + // Special case lambda metaFactory to get new name + if (META_FACTORIES.contains(bsm)) + { + String owner = Type.getReturnType(desc).getInternalName(); + String odesc = ((Type) bsmArgs[0]).getDescriptor(); // First constant argument is "samMethodType - Signature and return type of method to be implemented by the function object." + name = remapper.mapMethodName(owner, name, odesc); + } + + super.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs); + } } }