From 7aea09f4ca2f087d59ff6cb0de1c8e3e8b9ea4df Mon Sep 17 00:00:00 2001 From: Agaricus Date: Sun, 14 Apr 2013 15:02:26 -0700 Subject: [PATCH] Add type info to properly deobfuscate overloaded fields. Fixes #210. --- .../deobf/FMLDeobfuscatingRemapper.java | 33 +++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/common/cpw/mods/fml/common/asm/transformers/deobf/FMLDeobfuscatingRemapper.java b/common/cpw/mods/fml/common/asm/transformers/deobf/FMLDeobfuscatingRemapper.java index 356a65f67c..c5d7f30ab1 100644 --- a/common/cpw/mods/fml/common/asm/transformers/deobf/FMLDeobfuscatingRemapper.java +++ b/common/cpw/mods/fml/common/asm/transformers/deobf/FMLDeobfuscatingRemapper.java @@ -49,6 +49,8 @@ import com.google.common.io.InputSupplier; import cpw.mods.fml.common.FMLLog; import cpw.mods.fml.relauncher.FMLRelaunchLog; import cpw.mods.fml.relauncher.RelaunchClassLoader; +import org.objectweb.asm.tree.ClassNode; +import org.objectweb.asm.tree.FieldNode; public class FMLDeobfuscatingRemapper extends Remapper { public static final FMLDeobfuscatingRemapper INSTANCE = new FMLDeobfuscatingRemapper(); @@ -142,7 +144,34 @@ public class FMLDeobfuscatingRemapper extends Remapper { { rawFieldMaps.put(cl, Maps.newHashMap()); } - rawFieldMaps.get(cl).put(oldName, newName); + rawFieldMaps.get(cl).put(oldName + ":" + getFieldType(cl, oldName), newName); + rawFieldMaps.get(cl).put(oldName + ":null", newName); + } + + @SuppressWarnings("unchecked") + private String getFieldType(String owner, String name) + { + try + { + byte[] classBytes = classLoader.getClassBytes(owner); + if (classBytes == null) + { + return null; + } + ClassReader cr = new ClassReader(classBytes); + ClassNode classNode = new ClassNode(); + cr.accept(classNode, ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES); + for (FieldNode fieldNode : (List) classNode.fields) { + if (fieldNode.name.equals(name)) { + return fieldNode.desc; + } + } + } + catch (IOException e) + { + e.printStackTrace(); + } + return null; } private void parseClass(Builder builder, String[] parts) @@ -181,7 +210,7 @@ public class FMLDeobfuscatingRemapper extends Remapper { return name; } Map fieldMap = getFieldMap(owner); - return fieldMap!=null && fieldMap.containsKey(name) ? fieldMap.get(name) : name; + return fieldMap!=null && fieldMap.containsKey(name+":"+desc) ? fieldMap.get(name+":"+desc) : name; } @Override