From fb31387fdeedd831b80446afbe7adea719499348 Mon Sep 17 00:00:00 2001 From: Adrian Siekierka Date: Sun, 4 Nov 2018 12:30:00 +0100 Subject: unify local variable/argument numbering --- build.gradle | 2 +- .../enigma/analysis/MethodImplementationsTreeNode.java | 1 - .../cuchaz/enigma/analysis/SourceIndexMethodVisitor.java | 12 +++--------- .../bytecode/translators/TranslationMethodVisitor.java | 10 ++++++---- src/main/java/cuchaz/enigma/mapping/TypeDescriptor.java | 14 ++++++++++++++ .../java/cuchaz/enigma/mapping/entry/MethodDefEntry.java | 10 ---------- 6 files changed, 24 insertions(+), 25 deletions(-) diff --git a/build.gradle b/build.gradle index 22e24a18..c9054256 100644 --- a/build.gradle +++ b/build.gradle @@ -19,7 +19,7 @@ apply plugin: 'com.github.johnrengelman.shadow' apply plugin: 'maven' group = 'cuchaz' -version = '0.12.0' +version = '0.12.1' def ENV = System.getenv() if (ENV.BUILD_NUMBER) { diff --git a/src/main/java/cuchaz/enigma/analysis/MethodImplementationsTreeNode.java b/src/main/java/cuchaz/enigma/analysis/MethodImplementationsTreeNode.java index 723fffed..4b47c5f0 100644 --- a/src/main/java/cuchaz/enigma/analysis/MethodImplementationsTreeNode.java +++ b/src/main/java/cuchaz/enigma/analysis/MethodImplementationsTreeNode.java @@ -76,7 +76,6 @@ public class MethodImplementationsTreeNode extends DefaultMutableTreeNode { } public void load(JarIndex index) { - // get all method implementations List nodes = Lists.newArrayList(); for (String implementingClassName : index.getImplementingClasses(this.entry.getClassName())) { diff --git a/src/main/java/cuchaz/enigma/analysis/SourceIndexMethodVisitor.java b/src/main/java/cuchaz/enigma/analysis/SourceIndexMethodVisitor.java index d88eae3a..45f7a0ef 100644 --- a/src/main/java/cuchaz/enigma/analysis/SourceIndexMethodVisitor.java +++ b/src/main/java/cuchaz/enigma/analysis/SourceIndexMethodVisitor.java @@ -33,7 +33,6 @@ public class SourceIndexMethodVisitor extends SourceIndexVisitor { private Multimap unmatchedIdentifier = HashMultimap.create(); private Map identifierEntryCache = new HashMap<>(); - private int argumentPosition; public SourceIndexMethodVisitor(ReferencedEntryPool entryPool, ClassDefEntry ownerEntry, MethodDefEntry methodEntry) { super(entryPool); @@ -41,10 +40,6 @@ public class SourceIndexMethodVisitor extends SourceIndexVisitor { this.entryFactory = new ProcyonEntryFactory(entryPool); this.ownerEntry = ownerEntry; this.methodEntry = methodEntry; - this.argumentPosition = 0; - if (ownerEntry.isInnerClass() && methodEntry.isConstructor() && !ownerEntry.getAccess().isStatic()) { - this.argumentPosition++; - } } @Override @@ -112,9 +107,8 @@ public class SourceIndexMethodVisitor extends SourceIndexVisitor { @Override public Void visitParameterDeclaration(ParameterDeclaration node, SourceIndex index) { - // DO NOT USE def.getSlot()! Doubleword slots increase by 2, not by 1 - - int parameterIndex = (argumentPosition++); + ParameterDefinition def = node.getUserData(Keys.PARAMETER_DEFINITION); + int parameterIndex = def.getSlot(); if (parameterIndex >= 0) { LocalVariableEntry localVariableEntry = new LocalVariableEntry(methodEntry, parameterIndex, node.getName()); @@ -188,7 +182,7 @@ public class SourceIndexMethodVisitor extends SourceIndexVisitor { if (variable != null) { VariableDefinition originalVariable = variable.getOriginalVariable(); if (originalVariable != null) { - int variableIndex = (argumentPosition++); + int variableIndex = originalVariable.getSlot(); if (variableIndex >= 0) { LocalVariableEntry localVariableEntry = new LocalVariableEntry(methodEntry, variableIndex, initializer.getName()); identifierEntryCache.put(identifier.getName(), localVariableEntry); diff --git a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java index 0141b45e..48854701 100644 --- a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java +++ b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java @@ -85,10 +85,8 @@ public class TranslationMethodVisitor extends MethodVisitor { hasParameterMeta = true; String translatedSignature = translator.getTranslatedSignature(Signature.createTypedSignature(signature)).toString(); + int offsetIndex = index; - int offset = methodEntry.getVariableOffset(ownerEntry); - - int offsetIndex = index - offset; if (offsetIndex >= 0) { LocalVariableDefEntry entry = new LocalVariableDefEntry(methodEntry, offsetIndex, name, new TypeDescriptor(desc)); LocalVariableDefEntry translatedEntry = translator.getTranslatedVariableDef(entry); @@ -149,8 +147,10 @@ public class TranslationMethodVisitor extends MethodVisitor { // If we didn't receive any parameter metadata, generate it if (!hasParameterMeta) { List arguments = methodEntry.getDesc().getArgumentDescs(); + int offset = 0; + for (int index = 0; index < arguments.size(); index++) { - LocalVariableEntry entry = new LocalVariableEntry(methodEntry, index, ""); + LocalVariableEntry entry = new LocalVariableEntry(methodEntry, offset, ""); LocalVariableEntry translatedEntry = translator.getTranslatedVariable(entry); String translatedName = translatedEntry.getName(); if (translatedName.equals(entry.getName())) { @@ -158,6 +158,8 @@ public class TranslationMethodVisitor extends MethodVisitor { } else { super.visitParameter(translatedName, 0); } + + offset += arguments.get(index).getSize(); } } super.visitEnd(); diff --git a/src/main/java/cuchaz/enigma/mapping/TypeDescriptor.java b/src/main/java/cuchaz/enigma/mapping/TypeDescriptor.java index b7b1255a..3c8cc746 100644 --- a/src/main/java/cuchaz/enigma/mapping/TypeDescriptor.java +++ b/src/main/java/cuchaz/enigma/mapping/TypeDescriptor.java @@ -208,6 +208,20 @@ public class TypeDescriptor { return buf.toString(); } + public int getSize() { + switch (desc.charAt(0)) { + case 'J': + case 'D': + if (desc.length() == 1) { + return 2; + } else { + return 1; + } + default: + return 1; + } + } + public enum Primitive { Byte('B'), Character('C'), diff --git a/src/main/java/cuchaz/enigma/mapping/entry/MethodDefEntry.java b/src/main/java/cuchaz/enigma/mapping/entry/MethodDefEntry.java index bb7c85eb..ec3af694 100644 --- a/src/main/java/cuchaz/enigma/mapping/entry/MethodDefEntry.java +++ b/src/main/java/cuchaz/enigma/mapping/entry/MethodDefEntry.java @@ -37,16 +37,6 @@ public class MethodDefEntry extends MethodEntry { return signature; } - public int getVariableOffset(ClassDefEntry ownerEntry) { - // Enum constructors have an implicit "name" and "ordinal" parameter as well as "this" - if (ownerEntry.getAccess().isEnum() && getName().startsWith("<")) { - return 3; - } else { - // If we're not static, "this" is bound to index 0 - return getAccess().isStatic() ? 0 : 1; - } - } - @Override public MethodDefEntry updateOwnership(ClassEntry classEntry) { return new MethodDefEntry(new ClassEntry(classEntry.getName()), name, descriptor, signature, access); -- cgit v1.2.3