Force the descriptors to the right type for the field they're referencing. Fixes
the sand issue
This commit is contained in:
parent
6aae913919
commit
237c28b6cb
2 changed files with 58 additions and 0 deletions
|
@ -405,4 +405,21 @@ public class FMLDeobfuscatingRemapper extends Remapper {
|
||||||
{
|
{
|
||||||
return ImmutableSet.copyOf(classNameBiMap.keySet());
|
return ImmutableSet.copyOf(classNameBiMap.keySet());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getStaticFieldType(String oldType, String oldName, String newType, String newName)
|
||||||
|
{
|
||||||
|
String fType = getFieldType(oldType, oldName);
|
||||||
|
if (oldType.equals(newType))
|
||||||
|
{
|
||||||
|
return fType;
|
||||||
|
}
|
||||||
|
Map<String,String> newClassMap = fieldDescriptions.get(newType);
|
||||||
|
if (newClassMap == null)
|
||||||
|
{
|
||||||
|
newClassMap = Maps.newHashMap();
|
||||||
|
fieldDescriptions.put(newType, newClassMap);
|
||||||
|
}
|
||||||
|
newClassMap.put(newName, fType);
|
||||||
|
return fType;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,11 @@
|
||||||
package cpw.mods.fml.common.asm.transformers.deobf;
|
package cpw.mods.fml.common.asm.transformers.deobf;
|
||||||
|
|
||||||
import org.objectweb.asm.ClassVisitor;
|
import org.objectweb.asm.ClassVisitor;
|
||||||
|
import org.objectweb.asm.MethodVisitor;
|
||||||
|
import org.objectweb.asm.Opcodes;
|
||||||
|
import org.objectweb.asm.commons.Remapper;
|
||||||
import org.objectweb.asm.commons.RemappingClassAdapter;
|
import org.objectweb.asm.commons.RemappingClassAdapter;
|
||||||
|
import org.objectweb.asm.commons.RemappingMethodAdapter;
|
||||||
|
|
||||||
public class FMLRemappingAdapter extends RemappingClassAdapter {
|
public class FMLRemappingAdapter extends RemappingClassAdapter {
|
||||||
public FMLRemappingAdapter(ClassVisitor cv)
|
public FMLRemappingAdapter(ClassVisitor cv)
|
||||||
|
@ -31,4 +35,41 @@ public class FMLRemappingAdapter extends RemappingClassAdapter {
|
||||||
FMLDeobfuscatingRemapper.INSTANCE.mergeSuperMaps(name, superName, interfaces);
|
FMLDeobfuscatingRemapper.INSTANCE.mergeSuperMaps(name, superName, interfaces);
|
||||||
super.visit(version, access, name, signature, superName, interfaces);
|
super.visit(version, access, name, signature, superName, interfaces);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue