diff options
Diffstat (limited to 'src/main/java/cuchaz/enigma/bytecode')
| -rw-r--r-- | src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java | 19 |
1 files changed, 7 insertions, 12 deletions
diff --git a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java index 82a1263..a6c7552 100644 --- a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java +++ b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java | |||
| @@ -86,12 +86,7 @@ public class TranslationMethodVisitor extends MethodVisitor { | |||
| 86 | 86 | ||
| 87 | String translatedSignature = translator.getTranslatedSignature(Signature.createTypedSignature(signature)).toString(); | 87 | String translatedSignature = translator.getTranslatedSignature(Signature.createTypedSignature(signature)).toString(); |
| 88 | 88 | ||
| 89 | // If we're not static, "this" is bound to index 0 | 89 | int offset = methodEntry.getVariableOffset(ownerEntry); |
| 90 | int offset = methodEntry.getAccess().isStatic() ? 0 : 1; | ||
| 91 | if (ownerEntry.getAccess().isEnum() && methodEntry.getName().startsWith("<")) { | ||
| 92 | // Enum constructors have an implicit "name" and "ordinal" parameter as well as "this" | ||
| 93 | offset = 3; | ||
| 94 | } | ||
| 95 | 90 | ||
| 96 | int offsetIndex = index - offset; | 91 | int offsetIndex = index - offset; |
| 97 | if (offsetIndex >= 0) { | 92 | if (offsetIndex >= 0) { |
| @@ -101,8 +96,8 @@ public class TranslationMethodVisitor extends MethodVisitor { | |||
| 101 | 96 | ||
| 102 | // TODO: Better name inference | 97 | // TODO: Better name inference |
| 103 | if (translatedName.equals(entry.getName())) { | 98 | if (translatedName.equals(entry.getName())) { |
| 104 | String prefix = offsetIndex < methodEntry.getDesc().getArgumentDescs().size() ? "a" : "v"; | 99 | boolean argument = offsetIndex < methodEntry.getDesc().getArgumentDescs().size(); |
| 105 | translatedName = inferName(prefix, offsetIndex, translatedEntry.getDesc()); | 100 | translatedName = inferName(argument, offsetIndex, translatedEntry.getDesc()); |
| 106 | } | 101 | } |
| 107 | 102 | ||
| 108 | super.visitLocalVariable(translatedName, translatedEntry.getDesc().toString(), translatedSignature, start, end, index); | 103 | super.visitLocalVariable(translatedName, translatedEntry.getDesc().toString(), translatedSignature, start, end, index); |
| @@ -159,7 +154,7 @@ public class TranslationMethodVisitor extends MethodVisitor { | |||
| 159 | LocalVariableEntry translatedEntry = translator.getTranslatedVariable(entry); | 154 | LocalVariableEntry translatedEntry = translator.getTranslatedVariable(entry); |
| 160 | String translatedName = translatedEntry.getName(); | 155 | String translatedName = translatedEntry.getName(); |
| 161 | if (translatedName.equals(entry.getName())) { | 156 | if (translatedName.equals(entry.getName())) { |
| 162 | super.visitParameter(inferName("a", index, arguments.get(index)), 0); | 157 | super.visitParameter(inferName(true, index, arguments.get(index)), 0); |
| 163 | } else { | 158 | } else { |
| 164 | super.visitParameter(translatedName, 0); | 159 | super.visitParameter(translatedName, 0); |
| 165 | } | 160 | } |
| @@ -168,10 +163,10 @@ public class TranslationMethodVisitor extends MethodVisitor { | |||
| 168 | super.visitEnd(); | 163 | super.visitEnd(); |
| 169 | } | 164 | } |
| 170 | 165 | ||
| 171 | private String inferName(String prefix, int argumentIndex, TypeDescriptor desc) { | 166 | private String inferName(boolean argument, int argumentIndex, TypeDescriptor desc) { |
| 172 | String translatedName; | 167 | String translatedName; |
| 173 | int nameIndex = argumentIndex + 1; | 168 | int nameIndex = argumentIndex + 1; |
| 174 | StringBuilder nameBuilder = new StringBuilder(prefix); | 169 | StringBuilder nameBuilder = new StringBuilder(argument ? "a" : "v"); |
| 175 | // Unfortunately each of these have different name getters, so they have different code paths | 170 | // Unfortunately each of these have different name getters, so they have different code paths |
| 176 | if (desc.isPrimitive()) { | 171 | if (desc.isPrimitive()) { |
| 177 | TypeDescriptor.Primitive argCls = desc.getPrimitive(); | 172 | TypeDescriptor.Primitive argCls = desc.getPrimitive(); |
| @@ -184,7 +179,7 @@ public class TranslationMethodVisitor extends MethodVisitor { | |||
| 184 | typeName = typeName.substring(0, 1).toUpperCase(Locale.ROOT) + typeName.substring(1); | 179 | typeName = typeName.substring(0, 1).toUpperCase(Locale.ROOT) + typeName.substring(1); |
| 185 | nameBuilder.append(typeName); | 180 | nameBuilder.append(typeName); |
| 186 | } | 181 | } |
| 187 | if (methodEntry.getDesc().getArgumentDescs().size() > 1) { | 182 | if (!argument || methodEntry.getDesc().getArgumentDescs().size() > 1) { |
| 188 | nameBuilder.append(nameIndex); | 183 | nameBuilder.append(nameIndex); |
| 189 | } | 184 | } |
| 190 | translatedName = nameBuilder.toString(); | 185 | translatedName = nameBuilder.toString(); |