From 9f4e8979cb6d4059819833d932d4ead284bea1db Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Wed, 13 Apr 2022 21:30:34 +0100 Subject: Fix remapping of field Handle's This fixes source export, tested with 1.18.2-pre1 --- .../enigma/bytecode/translators/AsmObjectTranslator.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/enigma/src/main/java/cuchaz/enigma/bytecode/translators/AsmObjectTranslator.java b/enigma/src/main/java/cuchaz/enigma/bytecode/translators/AsmObjectTranslator.java index 1a2b47fb..341cfce4 100644 --- a/enigma/src/main/java/cuchaz/enigma/bytecode/translators/AsmObjectTranslator.java +++ b/enigma/src/main/java/cuchaz/enigma/bytecode/translators/AsmObjectTranslator.java @@ -4,8 +4,10 @@ import cuchaz.enigma.translation.Translator; import cuchaz.enigma.translation.representation.MethodDescriptor; import cuchaz.enigma.translation.representation.TypeDescriptor; import cuchaz.enigma.translation.representation.entry.ClassEntry; +import cuchaz.enigma.translation.representation.entry.FieldEntry; import cuchaz.enigma.translation.representation.entry.MethodEntry; import org.objectweb.asm.Handle; +import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; public class AsmObjectTranslator { @@ -29,12 +31,24 @@ public class AsmObjectTranslator { } public static Handle translateHandle(Translator translator, Handle handle) { + final boolean isFieldHandle = handle.getTag() <= Opcodes.H_PUTSTATIC; + return isFieldHandle ? translateFieldHandle(translator, handle) : translateMethodHandle(translator, handle); + } + + private static Handle translateMethodHandle(Translator translator, Handle handle) { MethodEntry entry = new MethodEntry(new ClassEntry(handle.getOwner()), handle.getName(), new MethodDescriptor(handle.getDesc())); MethodEntry translatedMethod = translator.translate(entry); ClassEntry ownerClass = translatedMethod.getParent(); return new Handle(handle.getTag(), ownerClass.getFullName(), translatedMethod.getName(), translatedMethod.getDesc().toString(), handle.isInterface()); } + private static Handle translateFieldHandle(Translator translator, Handle handle) { + FieldEntry entry = new FieldEntry(new ClassEntry(handle.getOwner()), handle.getName(), new TypeDescriptor(handle.getDesc())); + FieldEntry translatedMethod = translator.translate(entry); + ClassEntry ownerClass = translatedMethod.getParent(); + return new Handle(handle.getTag(), ownerClass.getFullName(), translatedMethod.getName(), translatedMethod.getDesc().toString(), handle.isInterface()); + } + public static Object translateValue(Translator translator, Object value) { if (value instanceof Type) { return translateType(translator, (Type) value); -- cgit v1.2.3