From 20c3d9327f2136c2aa164b2e9683bc3cfe126607 Mon Sep 17 00:00:00 2001 From: gegy1000 Date: Sat, 19 May 2018 21:22:30 +0200 Subject: Fix parameter name offset --- .../translators/TranslationClassVisitor.java | 2 +- .../translators/TranslationMethodVisitor.java | 65 +++++++++++++--------- .../mapping/entry/LocalVariableDefEntry.java | 19 ------- 3 files changed, 40 insertions(+), 46 deletions(-) diff --git a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationClassVisitor.java b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationClassVisitor.java index 0137155c..25d523fc 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, translatedEntry, api, mv); + return new TranslationMethodVisitor(translator, 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 eeabdfad..09c106d2 100644 --- a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java +++ b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java @@ -77,34 +77,47 @@ public class TranslationMethodVisitor extends MethodVisitor { @Override public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index) { - LocalVariableDefEntry entry = new LocalVariableDefEntry(methodEntry, index, name, new TypeDescriptor(desc)); - LocalVariableDefEntry translatedEntry = translator.getTranslatedVariableDef(entry); - String translatedName = translatedEntry.getName(); - // TODO: Better name inference - if (translatedName.equals(entry.getName())) { - TypeDescriptor argDesc = translatedEntry.getDesc(); - int nameIndex = translatedEntry.getNamedIndex() + 1; - String prefix = translatedEntry.getNamedIndex() < methodEntry.getDesc().getArgumentDescs().size() ? "a" : "v"; - StringBuilder nameBuilder = new StringBuilder(prefix); - // Unfortunately each of these have different name getters, so they have different code paths - if (argDesc.isPrimitive()) { - TypeDescriptor.Primitive argCls = argDesc.getPrimitive(); - nameBuilder.append(argCls.name()); - } else if (argDesc.isArray()) { - // List types would require this whole block again, so just go with aListx - nameBuilder.append(nameIndex); - } else if (argDesc.isType()) { - String typeName = argDesc.getTypeEntry().getSimpleName().replace("$", ""); - typeName = typeName.substring(0, 1).toUpperCase(Locale.ROOT) + typeName.substring(1); - nameBuilder.append(typeName); - } - if (methodEntry.getDesc().getArgumentDescs().size() > 1) { - nameBuilder.append(nameIndex); + 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); + if (offsetIndex >= 0) { + LocalVariableDefEntry entry = new LocalVariableDefEntry(methodEntry, offsetIndex, name, new TypeDescriptor(desc)); + LocalVariableDefEntry translatedEntry = translator.getTranslatedVariableDef(entry); + String translatedName = translatedEntry.getName(); + + // TODO: Better name inference + if (translatedName.equals(entry.getName())) { + TypeDescriptor argDesc = translatedEntry.getDesc(); + int nameIndex = offsetIndex + 1; + String prefix = offsetIndex < methodEntry.getDesc().getArgumentDescs().size() ? "a" : "v"; + StringBuilder nameBuilder = new StringBuilder(prefix); + // Unfortunately each of these have different name getters, so they have different code paths + if (argDesc.isPrimitive()) { + TypeDescriptor.Primitive argCls = argDesc.getPrimitive(); + nameBuilder.append(argCls.name()); + } else if (argDesc.isArray()) { + // List types would require this whole block again, so just go with aListx + nameBuilder.append(nameIndex); + } else if (argDesc.isType()) { + String typeName = argDesc.getTypeEntry().getSimpleName().replace("$", ""); + typeName = typeName.substring(0, 1).toUpperCase(Locale.ROOT) + typeName.substring(1); + nameBuilder.append(typeName); + } + if (methodEntry.getDesc().getArgumentDescs().size() > 1) { + nameBuilder.append(nameIndex); + } + translatedName = nameBuilder.toString(); + } else { + System.out.println(); } - translatedName = nameBuilder.toString(); + + super.visitLocalVariable(translatedName, translatedEntry.getDesc().toString(), translatedSignature, start, end, index); + } else { + // Handle "this" variable + TypeDescriptor translatedDesc = translator.getTranslatedTypeDesc(new TypeDescriptor(desc)); + super.visitLocalVariable(name, translatedDesc.toString(), translatedSignature, start, end, index); } - String translatedSignature = translator.getTranslatedSignature(Signature.createTypedSignature(signature)).toString(); - super.visitLocalVariable(translatedName, translatedEntry.getDesc().toString(), translatedSignature, start, end, index); } @Override diff --git a/src/main/java/cuchaz/enigma/mapping/entry/LocalVariableDefEntry.java b/src/main/java/cuchaz/enigma/mapping/entry/LocalVariableDefEntry.java index 0c4f3c17..77422720 100644 --- a/src/main/java/cuchaz/enigma/mapping/entry/LocalVariableDefEntry.java +++ b/src/main/java/cuchaz/enigma/mapping/entry/LocalVariableDefEntry.java @@ -22,19 +22,6 @@ public class LocalVariableDefEntry extends LocalVariableEntry { this.desc = desc; } - public LocalVariableDefEntry(MethodDefEntry ownerEntry, int index, String name) { - super(ownerEntry, index, name); - - this.ownerEntry = ownerEntry; - - int namedIndex = getNamedIndex(); - if (namedIndex < 0) { - this.desc = TypeDescriptor.of(ownerEntry.getOwnerClassEntry().getName()); - } else { - this.desc = ownerEntry.getDesc().getArgumentDescs().get(namedIndex); - } - } - @Override public MethodDefEntry getOwnerEntry() { return this.ownerEntry; @@ -44,12 +31,6 @@ public class LocalVariableDefEntry extends LocalVariableEntry { return desc; } - public int getNamedIndex() { - // If we're not static, "this" is bound to index 0 - int indexOffset = ownerEntry.getAccess().isStatic() ? 0 : 1; - return index - indexOffset; - } - @Override public LocalVariableDefEntry updateOwnership(ClassEntry classEntry) { return new LocalVariableDefEntry(ownerEntry.updateOwnership(classEntry), index, name, desc); -- cgit v1.2.3