From 732ae7336ef91e418adec6eec5233b20876cc41d Mon Sep 17 00:00:00 2001 From: gegy1000 Date: Sun, 24 Jun 2018 19:50:40 +0200 Subject: Fix enum parameter index offset --- src/main/java/cuchaz/enigma/bytecode/AccessFlags.java | 14 ++++++-------- .../bytecode/translators/TranslationClassVisitor.java | 2 +- .../bytecode/translators/TranslationMethodVisitor.java | 14 +++++++++++--- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/main/java/cuchaz/enigma/bytecode/AccessFlags.java b/src/main/java/cuchaz/enigma/bytecode/AccessFlags.java index 152f4629..21b24897 100644 --- a/src/main/java/cuchaz/enigma/bytecode/AccessFlags.java +++ b/src/main/java/cuchaz/enigma/bytecode/AccessFlags.java @@ -5,12 +5,6 @@ import org.objectweb.asm.Opcodes; import java.lang.reflect.Modifier; public class AccessFlags { - public static final AccessFlags PUBLIC = new AccessFlags(Modifier.PUBLIC); - public static final AccessFlags PUBLIC_STATIC_FINAL = new AccessFlags(Modifier.PUBLIC | Modifier.STATIC | Modifier.FINAL); - - private static final int SYNTHETIC_FLAG = 0x00001000; - private static final int BRIDGED_FLAG = 0x00000040; - private int flags; public AccessFlags(int flags) { @@ -30,13 +24,17 @@ public class AccessFlags { } public boolean isSynthetic() { - return (this.flags & SYNTHETIC_FLAG) != 0; + return (this.flags & Opcodes.ACC_SYNTHETIC) != 0; } public boolean isStatic() { return Modifier.isStatic(this.flags); } + public boolean isEnum() { + return (flags & Opcodes.ACC_ENUM) != 0; + } + public AccessFlags setPrivate() { this.setVisibility(Opcodes.ACC_PRIVATE); return this; @@ -53,7 +51,7 @@ public class AccessFlags { } public AccessFlags setBridged() { - this.setVisibility(BRIDGED_FLAG); + this.setVisibility(Opcodes.ACC_BRIDGE); return this; } diff --git a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationClassVisitor.java b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationClassVisitor.java index b0d17b3e..234d11f3 100644 --- a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationClassVisitor.java +++ b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationClassVisitor.java @@ -68,7 +68,7 @@ public class TranslationClassVisitor extends ClassVisitor { translatedExceptions[i] = translator.getTranslatedClass(entryPool.getClass(exceptions[i])).getName(); } MethodVisitor mv = super.visitMethod(translatedEntry.getAccess().getFlags(), translatedEntry.getName(), translatedEntry.getDesc().toString(), translatedEntry.getSignature().toString(), translatedExceptions); - return new TranslationMethodVisitor(translator, entry, api, mv); + return new TranslationMethodVisitor(translator, obfClassEntry, entry, api, mv); } @Override diff --git a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java index a2ebc203..82a1263b 100644 --- a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java +++ b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java @@ -11,14 +11,16 @@ import java.util.List; import java.util.Locale; public class TranslationMethodVisitor extends MethodVisitor { + private final ClassDefEntry ownerEntry; private final MethodDefEntry methodEntry; private final Translator translator; private boolean hasParameterMeta; - public TranslationMethodVisitor(Translator translator, MethodDefEntry methodEntry, int api, MethodVisitor mv) { + public TranslationMethodVisitor(Translator translator, ClassDefEntry ownerEntry, MethodDefEntry methodEntry, int api, MethodVisitor mv) { super(api, mv); this.translator = translator; + this.ownerEntry = ownerEntry; this.methodEntry = methodEntry; } @@ -85,7 +87,13 @@ public class TranslationMethodVisitor extends MethodVisitor { String translatedSignature = translator.getTranslatedSignature(Signature.createTypedSignature(signature)).toString(); // If we're not static, "this" is bound to index 0 - int offsetIndex = index - (methodEntry.getAccess().isStatic() ? 0 : 1); + int offset = methodEntry.getAccess().isStatic() ? 0 : 1; + if (ownerEntry.getAccess().isEnum() && methodEntry.getName().startsWith("<")) { + // Enum constructors have an implicit "name" and "ordinal" parameter as well as "this" + offset = 3; + } + + int offsetIndex = index - offset; if (offsetIndex >= 0) { LocalVariableDefEntry entry = new LocalVariableDefEntry(methodEntry, offsetIndex, name, new TypeDescriptor(desc)); LocalVariableDefEntry translatedEntry = translator.getTranslatedVariableDef(entry); @@ -170,7 +178,7 @@ public class TranslationMethodVisitor extends MethodVisitor { nameBuilder.append(argCls.name()); } else if (desc.isArray()) { // List types would require this whole block again, so just go with aListx - nameBuilder.append(nameIndex); + nameBuilder.append("Arr"); } else if (desc.isType()) { String typeName = desc.getTypeEntry().getSimpleName().replace("$", ""); typeName = typeName.substring(0, 1).toUpperCase(Locale.ROOT) + typeName.substring(1); -- cgit v1.2.3