diff options
| author | 2018-05-19 21:22:30 +0200 | |
|---|---|---|
| committer | 2018-05-19 21:22:30 +0200 | |
| commit | 20c3d9327f2136c2aa164b2e9683bc3cfe126607 (patch) | |
| tree | aa2ff5ea92e24adf5fb84bbc8529750557c4d776 /src/main/java/cuchaz | |
| parent | Fix highlighting of mapped names (diff) | |
| download | enigma-20c3d9327f2136c2aa164b2e9683bc3cfe126607.tar.gz enigma-20c3d9327f2136c2aa164b2e9683bc3cfe126607.tar.xz enigma-20c3d9327f2136c2aa164b2e9683bc3cfe126607.zip | |
Fix parameter name offset
Diffstat (limited to 'src/main/java/cuchaz')
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 { | |||
| 68 | translatedExceptions[i] = translator.getTranslatedClass(entryPool.getClass(exceptions[i])).getName(); | 68 | translatedExceptions[i] = translator.getTranslatedClass(entryPool.getClass(exceptions[i])).getName(); |
| 69 | } | 69 | } |
| 70 | MethodVisitor mv = super.visitMethod(translatedEntry.getAccess().getFlags(), translatedEntry.getName(), translatedEntry.getDesc().toString(), translatedEntry.getSignature().toString(), translatedExceptions); | 70 | MethodVisitor mv = super.visitMethod(translatedEntry.getAccess().getFlags(), translatedEntry.getName(), translatedEntry.getDesc().toString(), translatedEntry.getSignature().toString(), translatedExceptions); |
| 71 | return new TranslationMethodVisitor(translator, translatedEntry, api, mv); | 71 | return new TranslationMethodVisitor(translator, entry, api, mv); |
| 72 | } | 72 | } |
| 73 | 73 | ||
| 74 | @Override | 74 | @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 { | |||
| 77 | 77 | ||
| 78 | @Override | 78 | @Override |
| 79 | public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index) { | 79 | public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index) { |
| 80 | LocalVariableDefEntry entry = new LocalVariableDefEntry(methodEntry, index, name, new TypeDescriptor(desc)); | 80 | String translatedSignature = translator.getTranslatedSignature(Signature.createTypedSignature(signature)).toString(); |
| 81 | LocalVariableDefEntry translatedEntry = translator.getTranslatedVariableDef(entry); | 81 | |
| 82 | String translatedName = translatedEntry.getName(); | 82 | // If we're not static, "this" is bound to index 0 |
| 83 | // TODO: Better name inference | 83 | int offsetIndex = index - (methodEntry.getAccess().isStatic() ? 0 : 1); |
| 84 | if (translatedName.equals(entry.getName())) { | 84 | if (offsetIndex >= 0) { |
| 85 | TypeDescriptor argDesc = translatedEntry.getDesc(); | 85 | LocalVariableDefEntry entry = new LocalVariableDefEntry(methodEntry, offsetIndex, name, new TypeDescriptor(desc)); |
| 86 | int nameIndex = translatedEntry.getNamedIndex() + 1; | 86 | LocalVariableDefEntry translatedEntry = translator.getTranslatedVariableDef(entry); |
| 87 | String prefix = translatedEntry.getNamedIndex() < methodEntry.getDesc().getArgumentDescs().size() ? "a" : "v"; | 87 | String translatedName = translatedEntry.getName(); |
| 88 | StringBuilder nameBuilder = new StringBuilder(prefix); | 88 | |
| 89 | // Unfortunately each of these have different name getters, so they have different code paths | 89 | // TODO: Better name inference |
| 90 | if (argDesc.isPrimitive()) { | 90 | if (translatedName.equals(entry.getName())) { |
| 91 | TypeDescriptor.Primitive argCls = argDesc.getPrimitive(); | 91 | TypeDescriptor argDesc = translatedEntry.getDesc(); |
| 92 | nameBuilder.append(argCls.name()); | 92 | int nameIndex = offsetIndex + 1; |
| 93 | } else if (argDesc.isArray()) { | 93 | String prefix = offsetIndex < methodEntry.getDesc().getArgumentDescs().size() ? "a" : "v"; |
| 94 | // List types would require this whole block again, so just go with aListx | 94 | StringBuilder nameBuilder = new StringBuilder(prefix); |
| 95 | nameBuilder.append(nameIndex); | 95 | // Unfortunately each of these have different name getters, so they have different code paths |
| 96 | } else if (argDesc.isType()) { | 96 | if (argDesc.isPrimitive()) { |
| 97 | String typeName = argDesc.getTypeEntry().getSimpleName().replace("$", ""); | 97 | TypeDescriptor.Primitive argCls = argDesc.getPrimitive(); |
| 98 | typeName = typeName.substring(0, 1).toUpperCase(Locale.ROOT) + typeName.substring(1); | 98 | nameBuilder.append(argCls.name()); |
| 99 | nameBuilder.append(typeName); | 99 | } else if (argDesc.isArray()) { |
| 100 | } | 100 | // List types would require this whole block again, so just go with aListx |
| 101 | if (methodEntry.getDesc().getArgumentDescs().size() > 1) { | 101 | nameBuilder.append(nameIndex); |
| 102 | nameBuilder.append(nameIndex); | 102 | } else if (argDesc.isType()) { |
| 103 | String typeName = argDesc.getTypeEntry().getSimpleName().replace("$", ""); | ||
| 104 | typeName = typeName.substring(0, 1).toUpperCase(Locale.ROOT) + typeName.substring(1); | ||
| 105 | nameBuilder.append(typeName); | ||
| 106 | } | ||
| 107 | if (methodEntry.getDesc().getArgumentDescs().size() > 1) { | ||
| 108 | nameBuilder.append(nameIndex); | ||
| 109 | } | ||
| 110 | translatedName = nameBuilder.toString(); | ||
| 111 | } else { | ||
| 112 | System.out.println(); | ||
| 103 | } | 113 | } |
| 104 | translatedName = nameBuilder.toString(); | 114 | |
| 115 | super.visitLocalVariable(translatedName, translatedEntry.getDesc().toString(), translatedSignature, start, end, index); | ||
| 116 | } else { | ||
| 117 | // Handle "this" variable | ||
| 118 | TypeDescriptor translatedDesc = translator.getTranslatedTypeDesc(new TypeDescriptor(desc)); | ||
| 119 | super.visitLocalVariable(name, translatedDesc.toString(), translatedSignature, start, end, index); | ||
| 105 | } | 120 | } |
| 106 | String translatedSignature = translator.getTranslatedSignature(Signature.createTypedSignature(signature)).toString(); | ||
| 107 | super.visitLocalVariable(translatedName, translatedEntry.getDesc().toString(), translatedSignature, start, end, index); | ||
| 108 | } | 121 | } |
| 109 | 122 | ||
| 110 | @Override | 123 | @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 { | |||
| 22 | this.desc = desc; | 22 | this.desc = desc; |
| 23 | } | 23 | } |
| 24 | 24 | ||
| 25 | public LocalVariableDefEntry(MethodDefEntry ownerEntry, int index, String name) { | ||
| 26 | super(ownerEntry, index, name); | ||
| 27 | |||
| 28 | this.ownerEntry = ownerEntry; | ||
| 29 | |||
| 30 | int namedIndex = getNamedIndex(); | ||
| 31 | if (namedIndex < 0) { | ||
| 32 | this.desc = TypeDescriptor.of(ownerEntry.getOwnerClassEntry().getName()); | ||
| 33 | } else { | ||
| 34 | this.desc = ownerEntry.getDesc().getArgumentDescs().get(namedIndex); | ||
| 35 | } | ||
| 36 | } | ||
| 37 | |||
| 38 | @Override | 25 | @Override |
| 39 | public MethodDefEntry getOwnerEntry() { | 26 | public MethodDefEntry getOwnerEntry() { |
| 40 | return this.ownerEntry; | 27 | return this.ownerEntry; |
| @@ -44,12 +31,6 @@ public class LocalVariableDefEntry extends LocalVariableEntry { | |||
| 44 | return desc; | 31 | return desc; |
| 45 | } | 32 | } |
| 46 | 33 | ||
| 47 | public int getNamedIndex() { | ||
| 48 | // If we're not static, "this" is bound to index 0 | ||
| 49 | int indexOffset = ownerEntry.getAccess().isStatic() ? 0 : 1; | ||
| 50 | return index - indexOffset; | ||
| 51 | } | ||
| 52 | |||
| 53 | @Override | 34 | @Override |
| 54 | public LocalVariableDefEntry updateOwnership(ClassEntry classEntry) { | 35 | public LocalVariableDefEntry updateOwnership(ClassEntry classEntry) { |
| 55 | return new LocalVariableDefEntry(ownerEntry.updateOwnership(classEntry), index, name, desc); | 36 | return new LocalVariableDefEntry(ownerEntry.updateOwnership(classEntry), index, name, desc); |