summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar gegy10002018-05-19 21:22:30 +0200
committerGravatar gegy10002018-05-19 21:22:30 +0200
commit20c3d9327f2136c2aa164b2e9683bc3cfe126607 (patch)
treeaa2ff5ea92e24adf5fb84bbc8529750557c4d776
parentFix highlighting of mapped names (diff)
downloadenigma-20c3d9327f2136c2aa164b2e9683bc3cfe126607.tar.gz
enigma-20c3d9327f2136c2aa164b2e9683bc3cfe126607.tar.xz
enigma-20c3d9327f2136c2aa164b2e9683bc3cfe126607.zip
Fix parameter name offset
-rw-r--r--src/main/java/cuchaz/enigma/bytecode/translators/TranslationClassVisitor.java2
-rw-r--r--src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java65
-rw-r--r--src/main/java/cuchaz/enigma/mapping/entry/LocalVariableDefEntry.java19
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);