summaryrefslogtreecommitdiff
path: root/src/main/java/cuchaz/enigma/bytecode
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/cuchaz/enigma/bytecode')
-rw-r--r--src/main/java/cuchaz/enigma/bytecode/translators/TranslationClassVisitor.java2
-rw-r--r--src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java65
2 files changed, 40 insertions, 27 deletions
diff --git a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationClassVisitor.java b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationClassVisitor.java
index 0137155..25d523f 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 eeabdfa..09c106d 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