2013-03-08 00:25:48 +00:00
/ *
2016-06-23 03:49:47 +00:00
* Minecraft Forge
2018-07-01 21:17:28 +00:00
* Copyright ( c ) 2016 - 2018 .
2013-11-10 16:49:06 +00:00
*
2016-06-23 03:49:47 +00:00
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation version 2 . 1
* of the License .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* Lesser General Public License for more details .
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA
2013-03-08 00:25:48 +00:00
* /
2018-06-21 19:37:32 +00:00
package net.minecraftforge.fml.common.asm.deobf ;
2013-01-27 22:09:00 +00:00
import org.objectweb.asm.ClassVisitor ;
2016-06-29 14:33:27 +00:00
import org.objectweb.asm.FieldVisitor ;
2016-12-21 19:15:13 +00:00
import org.objectweb.asm.Handle ;
2014-06-24 19:37:39 +00:00
import org.objectweb.asm.MethodVisitor ;
import org.objectweb.asm.Opcodes ;
2016-12-21 19:15:13 +00:00
import org.objectweb.asm.Type ;
2014-06-24 19:37:39 +00:00
import org.objectweb.asm.commons.Remapper ;
2013-01-27 22:09:00 +00:00
import org.objectweb.asm.commons.RemappingClassAdapter ;
2014-06-24 19:37:39 +00:00
import org.objectweb.asm.commons.RemappingMethodAdapter ;
2013-01-27 22:09:00 +00:00
2016-12-21 19:15:13 +00:00
import java.util.Arrays ;
import java.util.List ;
2013-01-27 22:09:00 +00:00
public class FMLRemappingAdapter extends RemappingClassAdapter {
public FMLRemappingAdapter ( ClassVisitor cv )
{
super ( cv , FMLDeobfuscatingRemapper . INSTANCE ) ;
}
2016-12-21 19:15:13 +00:00
private static final List < Handle > META_FACTORIES = Arrays . asList (
new Handle ( Opcodes . H_INVOKESTATIC , " java/lang/invoke/LambdaMetafactory " , " metafactory " ,
2017-10-31 18:22:55 +00:00
" (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; " ,
false ) ,
2016-12-21 19:15:13 +00:00
new Handle ( Opcodes . H_INVOKESTATIC , " java/lang/invoke/LambdaMetafactory " , " altMetafactory " ,
2017-10-31 18:22:55 +00:00
" (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; " ,
false )
2016-12-21 19:15:13 +00:00
) ;
2013-01-27 22:09:00 +00:00
@Override
public void visit ( int version , int access , String name , String signature , String superName , String [ ] interfaces )
{
2013-01-28 03:42:36 +00:00
if ( interfaces = = null )
{
interfaces = new String [ 0 ] ;
}
FMLDeobfuscatingRemapper . INSTANCE . mergeSuperMaps ( name , superName , interfaces ) ;
2013-01-27 22:09:00 +00:00
super . visit ( version , access , name , signature , superName , interfaces ) ;
}
2014-06-24 19:37:39 +00:00
2016-06-29 14:33:27 +00:00
@Override
public FieldVisitor visitField ( int access , String name , String desc , String signature , Object value ) {
FMLDeobfuscatingRemapper remapper = FMLDeobfuscatingRemapper . INSTANCE ;
FieldVisitor fv = cv . visitField ( access ,
remapper . mapMemberFieldName ( className , name , desc ) ,
remapper . mapDesc ( desc ) , remapper . mapSignature ( signature , true ) ,
remapper . mapValue ( value ) ) ;
return createRemappingFieldAdapter ( fv ) ;
}
2014-06-24 19:37:39 +00:00
@Override
protected MethodVisitor createRemappingMethodAdapter ( int access , String newDesc , MethodVisitor mv )
{
return new StaticFixingMethodVisitor ( access , newDesc , mv , remapper ) ;
}
private static class StaticFixingMethodVisitor extends RemappingMethodAdapter
{
public StaticFixingMethodVisitor ( int access , String desc , MethodVisitor mv , Remapper remapper )
{
super ( access , desc , mv , remapper ) ;
}
@Override
public void visitFieldInsn ( int opcode , String originalType , String originalName , String desc )
{
// This method solves the problem of a static field reference changing type. In all probability it is a
// compatible change, however we need to fix up the desc to point at the new type
String type = remapper . mapType ( originalType ) ;
String fieldName = remapper . mapFieldName ( originalType , originalName , desc ) ;
String newDesc = remapper . mapDesc ( desc ) ;
if ( opcode = = Opcodes . GETSTATIC & & type . startsWith ( " net/minecraft/ " ) & & newDesc . startsWith ( " Lnet/minecraft/ " ) )
{
String replDesc = FMLDeobfuscatingRemapper . INSTANCE . getStaticFieldType ( originalType , originalName , type , fieldName ) ;
if ( replDesc ! = null )
{
newDesc = remapper . mapDesc ( replDesc ) ;
}
}
// super.super
if ( mv ! = null ) {
mv . visitFieldInsn ( opcode , type , fieldName , newDesc ) ;
}
}
2016-12-21 19:15:13 +00:00
@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 ) ;
}
2014-06-24 19:37:39 +00:00
}
2013-01-27 22:09:00 +00:00
}