From 32459b01b6879ceef3afc8f8c0b42e0d7ee35cde Mon Sep 17 00:00:00 2001 From: Mumfrey Date: Wed, 29 Jun 2016 15:33:27 +0100 Subject: [PATCH] Store member field mappings in the mapping table, possible fix for #3043 --- .../deobf/FMLDeobfuscatingRemapper.java | 46 ++++++++++++++++++- .../deobf/FMLRemappingAdapter.java | 11 +++++ 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/minecraftforge/fml/common/asm/transformers/deobf/FMLDeobfuscatingRemapper.java b/src/main/java/net/minecraftforge/fml/common/asm/transformers/deobf/FMLDeobfuscatingRemapper.java index c445baaa7..cff890688 100644 --- a/src/main/java/net/minecraftforge/fml/common/asm/transformers/deobf/FMLDeobfuscatingRemapper.java +++ b/src/main/java/net/minecraftforge/fml/common/asm/transformers/deobf/FMLDeobfuscatingRemapper.java @@ -259,14 +259,42 @@ public class FMLDeobfuscatingRemapper extends Remapper { rawMethodMaps.get(cl).put(oldName+sig, newName); } + String mapMemberFieldName(String owner, String name, String desc) + { + String remappedName = mapFieldName(owner, name, desc, true); + storeMemberFieldMapping(owner, name, desc, remappedName); + return remappedName; + } + + private void storeMemberFieldMapping(String owner, String name, String desc, String remappedName) { + Map fieldMap = getRawFieldMap(owner); + + String key = name + ":" + desc; + String altKey = name + ":null"; + + if (!fieldMap.containsKey(key)) { + fieldMap.put(key, remappedName); + fieldMap.put(altKey, remappedName); + + // Alternatively, maps could be made mutable and we could just set the relevant entry, saving + // the need to regenerate the super map each time + fieldNameMaps.remove(owner); + } + } + @Override public String mapFieldName(String owner, String name, String desc) + { + return mapFieldName(owner, name, desc, false); + } + + String mapFieldName(String owner, String name, String desc, boolean raw) { if (classNameBiMap == null || classNameBiMap.isEmpty()) { return name; } - Map fieldMap = getFieldMap(owner); + Map fieldMap = getFieldMap(owner, raw); return fieldMap!=null && fieldMap.containsKey(name+":"+desc) ? fieldMap.get(name+":"+desc) : fieldMap!=null && fieldMap.containsKey(name+":null") ? fieldMap.get(name+":null") :name; } @@ -332,8 +360,22 @@ public class FMLDeobfuscatingRemapper extends Remapper { return super.mapSignature(signature, typeSignature); } - private Map getFieldMap(String className) + private Map getRawFieldMap(String className) { + if (!rawFieldMaps.containsKey(className)) + { + rawFieldMaps.put(className, Maps.newHashMap()); + } + return rawFieldMaps.get(className); + } + + private Map getFieldMap(String className, boolean raw) + { + if (raw) + { + return getRawFieldMap(className); + } + if (!fieldNameMaps.containsKey(className) && !negativeCacheFields.contains(className)) { findAndMergeSuperMaps(className); 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 5236be4f2..64aa59a57 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 @@ -20,6 +20,7 @@ package net.minecraftforge.fml.common.asm.transformers.deobf; import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.FieldVisitor; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.commons.Remapper; @@ -43,6 +44,16 @@ public class FMLRemappingAdapter extends RemappingClassAdapter { super.visit(version, access, name, signature, superName, interfaces); } + @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); + } + @Override protected MethodVisitor createRemappingMethodAdapter(int access, String newDesc, MethodVisitor mv) {