diff options
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' | |||
| 19 | apply plugin: 'maven' | 19 | apply plugin: 'maven' |
| 20 | 20 | ||
| 21 | group = 'cuchaz' | 21 | group = 'cuchaz' |
| 22 | version = '0.12.0' | 22 | version = '0.12.1' |
| 23 | 23 | ||
| 24 | def ENV = System.getenv() | 24 | def ENV = System.getenv() |
| 25 | if (ENV.BUILD_NUMBER) { | 25 | 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 { | |||
| 76 | } | 76 | } |
| 77 | 77 | ||
| 78 | public void load(JarIndex index) { | 78 | public void load(JarIndex index) { |
| 79 | |||
| 80 | // get all method implementations | 79 | // get all method implementations |
| 81 | List<MethodImplementationsTreeNode> nodes = Lists.newArrayList(); | 80 | List<MethodImplementationsTreeNode> nodes = Lists.newArrayList(); |
| 82 | for (String implementingClassName : index.getImplementingClasses(this.entry.getClassName())) { | 81 | 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 { | |||
| 33 | 33 | ||
| 34 | private Multimap<String, Identifier> unmatchedIdentifier = HashMultimap.create(); | 34 | private Multimap<String, Identifier> unmatchedIdentifier = HashMultimap.create(); |
| 35 | private Map<String, Entry> identifierEntryCache = new HashMap<>(); | 35 | private Map<String, Entry> identifierEntryCache = new HashMap<>(); |
| 36 | private int argumentPosition; | ||
| 37 | 36 | ||
| 38 | public SourceIndexMethodVisitor(ReferencedEntryPool entryPool, ClassDefEntry ownerEntry, MethodDefEntry methodEntry) { | 37 | public SourceIndexMethodVisitor(ReferencedEntryPool entryPool, ClassDefEntry ownerEntry, MethodDefEntry methodEntry) { |
| 39 | super(entryPool); | 38 | super(entryPool); |
| @@ -41,10 +40,6 @@ public class SourceIndexMethodVisitor extends SourceIndexVisitor { | |||
| 41 | this.entryFactory = new ProcyonEntryFactory(entryPool); | 40 | this.entryFactory = new ProcyonEntryFactory(entryPool); |
| 42 | this.ownerEntry = ownerEntry; | 41 | this.ownerEntry = ownerEntry; |
| 43 | this.methodEntry = methodEntry; | 42 | this.methodEntry = methodEntry; |
| 44 | this.argumentPosition = 0; | ||
| 45 | if (ownerEntry.isInnerClass() && methodEntry.isConstructor() && !ownerEntry.getAccess().isStatic()) { | ||
| 46 | this.argumentPosition++; | ||
| 47 | } | ||
| 48 | } | 43 | } |
| 49 | 44 | ||
| 50 | @Override | 45 | @Override |
| @@ -112,9 +107,8 @@ public class SourceIndexMethodVisitor extends SourceIndexVisitor { | |||
| 112 | 107 | ||
| 113 | @Override | 108 | @Override |
| 114 | public Void visitParameterDeclaration(ParameterDeclaration node, SourceIndex index) { | 109 | public Void visitParameterDeclaration(ParameterDeclaration node, SourceIndex index) { |
| 115 | // DO NOT USE def.getSlot()! Doubleword slots increase by 2, not by 1 | 110 | ParameterDefinition def = node.getUserData(Keys.PARAMETER_DEFINITION); |
| 116 | 111 | int parameterIndex = def.getSlot(); | |
| 117 | int parameterIndex = (argumentPosition++); | ||
| 118 | 112 | ||
| 119 | if (parameterIndex >= 0) { | 113 | if (parameterIndex >= 0) { |
| 120 | LocalVariableEntry localVariableEntry = new LocalVariableEntry(methodEntry, parameterIndex, node.getName()); | 114 | LocalVariableEntry localVariableEntry = new LocalVariableEntry(methodEntry, parameterIndex, node.getName()); |
| @@ -188,7 +182,7 @@ public class SourceIndexMethodVisitor extends SourceIndexVisitor { | |||
| 188 | if (variable != null) { | 182 | if (variable != null) { |
| 189 | VariableDefinition originalVariable = variable.getOriginalVariable(); | 183 | VariableDefinition originalVariable = variable.getOriginalVariable(); |
| 190 | if (originalVariable != null) { | 184 | if (originalVariable != null) { |
| 191 | int variableIndex = (argumentPosition++); | 185 | int variableIndex = originalVariable.getSlot(); |
| 192 | if (variableIndex >= 0) { | 186 | if (variableIndex >= 0) { |
| 193 | LocalVariableEntry localVariableEntry = new LocalVariableEntry(methodEntry, variableIndex, initializer.getName()); | 187 | LocalVariableEntry localVariableEntry = new LocalVariableEntry(methodEntry, variableIndex, initializer.getName()); |
| 194 | identifierEntryCache.put(identifier.getName(), localVariableEntry); | 188 | 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 { | |||
| 85 | hasParameterMeta = true; | 85 | hasParameterMeta = true; |
| 86 | 86 | ||
| 87 | String translatedSignature = translator.getTranslatedSignature(Signature.createTypedSignature(signature)).toString(); | 87 | String translatedSignature = translator.getTranslatedSignature(Signature.createTypedSignature(signature)).toString(); |
| 88 | int offsetIndex = index; | ||
| 88 | 89 | ||
| 89 | int offset = methodEntry.getVariableOffset(ownerEntry); | ||
| 90 | |||
| 91 | int offsetIndex = index - offset; | ||
| 92 | if (offsetIndex >= 0) { | 90 | if (offsetIndex >= 0) { |
| 93 | LocalVariableDefEntry entry = new LocalVariableDefEntry(methodEntry, offsetIndex, name, new TypeDescriptor(desc)); | 91 | LocalVariableDefEntry entry = new LocalVariableDefEntry(methodEntry, offsetIndex, name, new TypeDescriptor(desc)); |
| 94 | LocalVariableDefEntry translatedEntry = translator.getTranslatedVariableDef(entry); | 92 | LocalVariableDefEntry translatedEntry = translator.getTranslatedVariableDef(entry); |
| @@ -149,8 +147,10 @@ public class TranslationMethodVisitor extends MethodVisitor { | |||
| 149 | // If we didn't receive any parameter metadata, generate it | 147 | // If we didn't receive any parameter metadata, generate it |
| 150 | if (!hasParameterMeta) { | 148 | if (!hasParameterMeta) { |
| 151 | List<TypeDescriptor> arguments = methodEntry.getDesc().getArgumentDescs(); | 149 | List<TypeDescriptor> arguments = methodEntry.getDesc().getArgumentDescs(); |
| 150 | int offset = 0; | ||
| 151 | |||
| 152 | for (int index = 0; index < arguments.size(); index++) { | 152 | for (int index = 0; index < arguments.size(); index++) { |
| 153 | LocalVariableEntry entry = new LocalVariableEntry(methodEntry, index, ""); | 153 | LocalVariableEntry entry = new LocalVariableEntry(methodEntry, offset, ""); |
| 154 | LocalVariableEntry translatedEntry = translator.getTranslatedVariable(entry); | 154 | LocalVariableEntry translatedEntry = translator.getTranslatedVariable(entry); |
| 155 | String translatedName = translatedEntry.getName(); | 155 | String translatedName = translatedEntry.getName(); |
| 156 | if (translatedName.equals(entry.getName())) { | 156 | if (translatedName.equals(entry.getName())) { |
| @@ -158,6 +158,8 @@ public class TranslationMethodVisitor extends MethodVisitor { | |||
| 158 | } else { | 158 | } else { |
| 159 | super.visitParameter(translatedName, 0); | 159 | super.visitParameter(translatedName, 0); |
| 160 | } | 160 | } |
| 161 | |||
| 162 | offset += arguments.get(index).getSize(); | ||
| 161 | } | 163 | } |
| 162 | } | 164 | } |
| 163 | super.visitEnd(); | 165 | 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 { | |||
| 208 | return buf.toString(); | 208 | return buf.toString(); |
| 209 | } | 209 | } |
| 210 | 210 | ||
| 211 | public int getSize() { | ||
| 212 | switch (desc.charAt(0)) { | ||
| 213 | case 'J': | ||
| 214 | case 'D': | ||
| 215 | if (desc.length() == 1) { | ||
| 216 | return 2; | ||
| 217 | } else { | ||
| 218 | return 1; | ||
| 219 | } | ||
| 220 | default: | ||
| 221 | return 1; | ||
| 222 | } | ||
| 223 | } | ||
| 224 | |||
| 211 | public enum Primitive { | 225 | public enum Primitive { |
| 212 | Byte('B'), | 226 | Byte('B'), |
| 213 | Character('C'), | 227 | 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 { | |||
| 37 | return signature; | 37 | return signature; |
| 38 | } | 38 | } |
| 39 | 39 | ||
| 40 | public int getVariableOffset(ClassDefEntry ownerEntry) { | ||
| 41 | // Enum constructors have an implicit "name" and "ordinal" parameter as well as "this" | ||
| 42 | if (ownerEntry.getAccess().isEnum() && getName().startsWith("<")) { | ||
| 43 | return 3; | ||
| 44 | } else { | ||
| 45 | // If we're not static, "this" is bound to index 0 | ||
| 46 | return getAccess().isStatic() ? 0 : 1; | ||
| 47 | } | ||
| 48 | } | ||
| 49 | |||
| 50 | @Override | 40 | @Override |
| 51 | public MethodDefEntry updateOwnership(ClassEntry classEntry) { | 41 | public MethodDefEntry updateOwnership(ClassEntry classEntry) { |
| 52 | return new MethodDefEntry(new ClassEntry(classEntry.getName()), name, descriptor, signature, access); | 42 | return new MethodDefEntry(new ClassEntry(classEntry.getName()), name, descriptor, signature, access); |