Properly deobfuscate lambda expressions (#3552)

This commit is contained in:
James Mitchell 2016-12-21 11:15:13 -08:00 committed by LexManos
parent 08a4f5f314
commit 1f4007e5d8
1 changed files with 26 additions and 0 deletions

View File

@ -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<Handle> 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);
}
}
}