summaryrefslogtreecommitdiff
path: root/src/main/java/cuchaz/enigma/bytecode
diff options
context:
space:
mode:
authorGravatar gegy10002018-05-19 20:38:14 +0200
committerGravatar gegy10002018-05-19 20:38:14 +0200
commitd72aad82c795726efcf6145f5a4172e4c8d3a5b2 (patch)
treed4456f34813a6be127867951d21ec775aeff5a5c /src/main/java/cuchaz/enigma/bytecode
parentMore bytecode translation (diff)
downloadenigma-fork-d72aad82c795726efcf6145f5a4172e4c8d3a5b2.tar.gz
enigma-fork-d72aad82c795726efcf6145f5a4172e4c8d3a5b2.tar.xz
enigma-fork-d72aad82c795726efcf6145f5a4172e4c8d3a5b2.zip
Signature refactoring
Diffstat (limited to 'src/main/java/cuchaz/enigma/bytecode')
-rw-r--r--src/main/java/cuchaz/enigma/bytecode/translators/TranslationAnnotationVisitor.java9
-rw-r--r--src/main/java/cuchaz/enigma/bytecode/translators/TranslationClassVisitor.java44
-rw-r--r--src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java3
-rw-r--r--src/main/java/cuchaz/enigma/bytecode/translators/TranslationSignatureVisitor.java29
4 files changed, 42 insertions, 43 deletions
diff --git a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationAnnotationVisitor.java b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationAnnotationVisitor.java
index 7cc3771..df5f8f7 100644
--- a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationAnnotationVisitor.java
+++ b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationAnnotationVisitor.java
@@ -1,10 +1,9 @@
1package cuchaz.enigma.bytecode.translators; 1package cuchaz.enigma.bytecode.translators;
2 2
3import cuchaz.enigma.bytecode.AccessFlags;
4import cuchaz.enigma.mapping.Translator; 3import cuchaz.enigma.mapping.Translator;
5import cuchaz.enigma.mapping.TypeDescriptor; 4import cuchaz.enigma.mapping.TypeDescriptor;
6import cuchaz.enigma.mapping.entry.ClassEntry; 5import cuchaz.enigma.mapping.entry.ClassEntry;
7import cuchaz.enigma.mapping.entry.FieldDefEntry; 6import cuchaz.enigma.mapping.entry.FieldEntry;
8import org.objectweb.asm.AnnotationVisitor; 7import org.objectweb.asm.AnnotationVisitor;
9 8
10public class TranslationAnnotationVisitor extends AnnotationVisitor { 9public class TranslationAnnotationVisitor extends AnnotationVisitor {
@@ -30,15 +29,15 @@ public class TranslationAnnotationVisitor extends AnnotationVisitor {
30 @Override 29 @Override
31 public AnnotationVisitor visitAnnotation(String name, String desc) { 30 public AnnotationVisitor visitAnnotation(String name, String desc) {
32 TypeDescriptor type = new TypeDescriptor(desc); 31 TypeDescriptor type = new TypeDescriptor(desc);
33 FieldDefEntry annotationField = translator.getTranslatedFieldDef(new FieldDefEntry(annotationEntry, name, type, AccessFlags.PUBLIC)); 32 FieldEntry annotationField = translator.getTranslatedField(new FieldEntry(annotationEntry, name, type));
34 return super.visitAnnotation(annotationField.getName(), annotationField.getDesc().toString()); 33 return super.visitAnnotation(annotationField.getName(), annotationField.getDesc().toString());
35 } 34 }
36 35
37 @Override 36 @Override
38 public void visitEnum(String name, String desc, String value) { 37 public void visitEnum(String name, String desc, String value) {
39 TypeDescriptor type = new TypeDescriptor(desc); 38 TypeDescriptor type = new TypeDescriptor(desc);
40 FieldDefEntry annotationField = translator.getTranslatedFieldDef(new FieldDefEntry(annotationEntry, name, type, AccessFlags.PUBLIC)); 39 FieldEntry annotationField = translator.getTranslatedField(new FieldEntry(annotationEntry, name, type));
41 FieldDefEntry enumField = translator.getTranslatedFieldDef(new FieldDefEntry(type.getTypeEntry(), value, type, AccessFlags.PUBLIC_STATIC_FINAL)); 40 FieldEntry enumField = translator.getTranslatedField(new FieldEntry(type.getTypeEntry(), value, type));
42 super.visitEnum(annotationField.getName(), annotationField.getDesc().toString(), enumField.getName()); 41 super.visitEnum(annotationField.getName(), annotationField.getDesc().toString(), enumField.getName());
43 } 42 }
44} 43}
diff --git a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationClassVisitor.java b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationClassVisitor.java
index 89772db..0137155 100644
--- a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationClassVisitor.java
+++ b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationClassVisitor.java
@@ -14,6 +14,7 @@ package cuchaz.enigma.bytecode.translators;
14import cuchaz.enigma.analysis.JarIndex; 14import cuchaz.enigma.analysis.JarIndex;
15import cuchaz.enigma.bytecode.AccessFlags; 15import cuchaz.enigma.bytecode.AccessFlags;
16import cuchaz.enigma.mapping.MethodDescriptor; 16import cuchaz.enigma.mapping.MethodDescriptor;
17import cuchaz.enigma.mapping.Signature;
17import cuchaz.enigma.mapping.Translator; 18import cuchaz.enigma.mapping.Translator;
18import cuchaz.enigma.mapping.TypeDescriptor; 19import cuchaz.enigma.mapping.TypeDescriptor;
19import cuchaz.enigma.mapping.entry.*; 20import cuchaz.enigma.mapping.entry.*;
@@ -25,6 +26,7 @@ public class TranslationClassVisitor extends ClassVisitor {
25 private final ReferencedEntryPool entryPool; 26 private final ReferencedEntryPool entryPool;
26 27
27 private ClassDefEntry obfClassEntry; 28 private ClassDefEntry obfClassEntry;
29 private Signature obfSignature;
28 30
29 public TranslationClassVisitor(Translator translator, JarIndex jarIndex, ReferencedEntryPool entryPool, int api, ClassVisitor cv) { 31 public TranslationClassVisitor(Translator translator, JarIndex jarIndex, ReferencedEntryPool entryPool, int api, ClassVisitor cv) {
30 super(api, cv); 32 super(api, cv);
@@ -35,29 +37,28 @@ public class TranslationClassVisitor extends ClassVisitor {
35 37
36 @Override 38 @Override
37 public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { 39 public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
38 obfClassEntry = new ClassDefEntry(name, new AccessFlags(access)); 40 obfSignature = Signature.createSignature(signature);
39 ClassDefEntry entry = translator.getTranslatedClassDef(obfClassEntry); 41 obfClassEntry = new ClassDefEntry(name, obfSignature, new AccessFlags(access));
42 ClassDefEntry translatedEntry = translator.getTranslatedClassDef(obfClassEntry);
40 ClassEntry superEntry = translator.getTranslatedClass(entryPool.getClass(superName)); 43 ClassEntry superEntry = translator.getTranslatedClass(entryPool.getClass(superName));
41 String[] translatedInterfaces = new String[interfaces.length]; 44 String[] translatedInterfaces = new String[interfaces.length];
42 for (int i = 0; i < interfaces.length; i++) { 45 for (int i = 0; i < interfaces.length; i++) {
43 translatedInterfaces[i] = translator.getTranslatedClass(entryPool.getClass(interfaces[i])).getName(); 46 translatedInterfaces[i] = translator.getTranslatedClass(entryPool.getClass(interfaces[i])).getName();
44 } 47 }
45 String translatedSignature = translator.getTranslatedSignature(signature, false, api); 48 super.visit(version, translatedEntry.getAccess().getFlags(), translatedEntry.getName(), translatedEntry.getSignature().toString(), superEntry.getName(), translatedInterfaces);
46 super.visit(version, entry.getAccess().getFlags(), entry.getName(), translatedSignature, superEntry.getName(), translatedInterfaces);
47 } 49 }
48 50
49 @Override 51 @Override
50 public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { 52 public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) {
51 FieldDefEntry entry = new FieldDefEntry(obfClassEntry, name, new TypeDescriptor(desc), new AccessFlags(access)); 53 FieldDefEntry entry = new FieldDefEntry(obfClassEntry, name, new TypeDescriptor(desc), Signature.createTypedSignature(signature), new AccessFlags(access));
52 FieldDefEntry translatedEntry = translator.getTranslatedFieldDef(entry); 54 FieldDefEntry translatedEntry = translator.getTranslatedFieldDef(entry);
53 String translatedSignature = translator.getTranslatedSignature(signature, true, api); 55 FieldVisitor fv = super.visitField(translatedEntry.getAccess().getFlags(), translatedEntry.getName(), translatedEntry.getDesc().toString(), translatedEntry.getSignature().toString(), value);
54 FieldVisitor fv = super.visitField(translatedEntry.getAccess().getFlags(), translatedEntry.getName(), translatedEntry.getDesc().toString(), translatedSignature, value);
55 return new TranslationFieldVisitor(translator, translatedEntry, api, fv); 56 return new TranslationFieldVisitor(translator, translatedEntry, api, fv);
56 } 57 }
57 58
58 @Override 59 @Override
59 public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { 60 public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
60 MethodDefEntry entry = new MethodDefEntry(obfClassEntry, name, new MethodDescriptor(desc), new AccessFlags(access)); 61 MethodDefEntry entry = new MethodDefEntry(obfClassEntry, name, new MethodDescriptor(desc), Signature.createSignature(signature), new AccessFlags(access));
61 MethodDefEntry translatedEntry = translator.getTranslatedMethodDef(entry); 62 MethodDefEntry translatedEntry = translator.getTranslatedMethodDef(entry);
62 if (jarIndex.getBridgedMethod(entry) != null) { 63 if (jarIndex.getBridgedMethod(entry) != null) {
63 translatedEntry.getAccess().setBridged(); 64 translatedEntry.getAccess().setBridged();
@@ -66,12 +67,23 @@ public class TranslationClassVisitor extends ClassVisitor {
66 for (int i = 0; i < exceptions.length; i++) { 67 for (int i = 0; i < exceptions.length; i++) {
67 translatedExceptions[i] = translator.getTranslatedClass(entryPool.getClass(exceptions[i])).getName(); 68 translatedExceptions[i] = translator.getTranslatedClass(entryPool.getClass(exceptions[i])).getName();
68 } 69 }
69 String translatedSignature = translator.getTranslatedSignature(signature, false, api); 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(), translatedSignature, translatedExceptions);
71 return new TranslationMethodVisitor(translator, translatedEntry, api, mv); 71 return new TranslationMethodVisitor(translator, translatedEntry, api, mv);
72 } 72 }
73 73
74 @Override 74 @Override
75 public void visitInnerClass(String name, String outerName, String innerName, int access) {
76 ClassDefEntry translatedEntry = translator.getTranslatedClassDef(new ClassDefEntry(name, obfSignature, new AccessFlags(access)));
77 String translatedName = translatedEntry.getName();
78 int separatorIndex = translatedName.lastIndexOf("$");
79 String parentName = translatedName.substring(0, separatorIndex);
80 String childName = translatedName.substring(separatorIndex + 1);
81
82 ClassEntry outerEntry = translator.getTranslatedClass(entryPool.getClass(parentName));
83 super.visitInnerClass(translatedName, outerEntry.getName(), childName, translatedEntry.getAccess().getFlags());
84 }
85
86 @Override
75 public void visitOuterClass(String owner, String name, String desc) { 87 public void visitOuterClass(String owner, String name, String desc) {
76 if (desc != null) { 88 if (desc != null) {
77 MethodEntry translatedEntry = translator.getTranslatedMethod(new MethodEntry(new ClassEntry(owner), name, new MethodDescriptor(desc))); 89 MethodEntry translatedEntry = translator.getTranslatedMethod(new MethodEntry(new ClassEntry(owner), name, new MethodDescriptor(desc)));
@@ -94,16 +106,4 @@ public class TranslationClassVisitor extends ClassVisitor {
94 AnnotationVisitor av = super.visitTypeAnnotation(typeRef, typePath, translatedDesc.toString(), visible); 106 AnnotationVisitor av = super.visitTypeAnnotation(typeRef, typePath, translatedDesc.toString(), visible);
95 return new TranslationAnnotationVisitor(translator, translatedDesc.getTypeEntry(), api, av); 107 return new TranslationAnnotationVisitor(translator, translatedDesc.getTypeEntry(), api, av);
96 } 108 }
97
98 @Override
99 public void visitInnerClass(String name, String outerName, String innerName, int access) {
100 ClassDefEntry translatedEntry = translator.getTranslatedClassDef(new ClassDefEntry(name, new AccessFlags(access)));
101 String translatedName = translatedEntry.getName();
102 int separatorIndex = translatedName.lastIndexOf("$");
103 String parentName = translatedName.substring(0, separatorIndex);
104 String childName = translatedName.substring(separatorIndex + 1);
105
106 ClassEntry outerEntry = translator.getTranslatedClass(entryPool.getClass(parentName));
107 super.visitInnerClass(translatedName, outerEntry.getName(), childName, translatedEntry.getAccess().getFlags());
108 }
109} 109}
diff --git a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java
index cce91db..eeabdfa 100644
--- a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java
+++ b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java
@@ -1,6 +1,7 @@
1package cuchaz.enigma.bytecode.translators; 1package cuchaz.enigma.bytecode.translators;
2 2
3import cuchaz.enigma.mapping.MethodDescriptor; 3import cuchaz.enigma.mapping.MethodDescriptor;
4import cuchaz.enigma.mapping.Signature;
4import cuchaz.enigma.mapping.Translator; 5import cuchaz.enigma.mapping.Translator;
5import cuchaz.enigma.mapping.TypeDescriptor; 6import cuchaz.enigma.mapping.TypeDescriptor;
6import cuchaz.enigma.mapping.entry.*; 7import cuchaz.enigma.mapping.entry.*;
@@ -102,7 +103,7 @@ public class TranslationMethodVisitor extends MethodVisitor {
102 } 103 }
103 translatedName = nameBuilder.toString(); 104 translatedName = nameBuilder.toString();
104 } 105 }
105 String translatedSignature = translator.getTranslatedSignature(signature, true, api); 106 String translatedSignature = translator.getTranslatedSignature(Signature.createTypedSignature(signature)).toString();
106 super.visitLocalVariable(translatedName, translatedEntry.getDesc().toString(), translatedSignature, start, end, index); 107 super.visitLocalVariable(translatedName, translatedEntry.getDesc().toString(), translatedSignature, start, end, index);
107 } 108 }
108 109
diff --git a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationSignatureVisitor.java b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationSignatureVisitor.java
index e1dcea5..2bb80a8 100644
--- a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationSignatureVisitor.java
+++ b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationSignatureVisitor.java
@@ -1,37 +1,36 @@
1package cuchaz.enigma.bytecode.translators; 1package cuchaz.enigma.bytecode.translators;
2 2
3import cuchaz.enigma.mapping.Translator; 3import org.objectweb.asm.Opcodes;
4import cuchaz.enigma.mapping.entry.ClassEntry;
5import org.objectweb.asm.signature.SignatureVisitor; 4import org.objectweb.asm.signature.SignatureVisitor;
6 5
7import java.util.Stack; 6import java.util.Stack;
7import java.util.function.Function;
8 8
9public class TranslationSignatureVisitor extends SignatureVisitor { 9public class TranslationSignatureVisitor extends SignatureVisitor {
10 private final Translator translator; 10 private final Function<String, String> remapper;
11 11
12 private final SignatureVisitor sv; 12 private final SignatureVisitor sv;
13 private final Stack<ClassEntry> classes = new Stack<>(); 13 private final Stack<String> classes = new Stack<>();
14 14
15 public TranslationSignatureVisitor(Translator translator, int api, SignatureVisitor sv) { 15 public TranslationSignatureVisitor(Function<String, String> remapper, SignatureVisitor sv) {
16 super(api); 16 super(Opcodes.ASM5);
17 this.translator = translator; 17 this.remapper = remapper;
18 this.sv = sv; 18 this.sv = sv;
19 } 19 }
20 20
21 @Override 21 @Override
22 public void visitClassType(String name) { 22 public void visitClassType(String name) {
23 ClassEntry entry = new ClassEntry(name); 23 String translatedEntry = this.remapper.apply(name);
24 ClassEntry translatedEntry = this.translator.getTranslatedClass(entry); 24 this.classes.push(name);
25 this.classes.push(entry); 25 this.sv.visitClassType(translatedEntry);
26 this.sv.visitClassType(translatedEntry.getName());
27 } 26 }
28 27
29 @Override 28 @Override
30 public void visitInnerClassType(String name) { 29 public void visitInnerClassType(String name) {
31 ClassEntry outerEntry = this.classes.pop(); 30 String outerName = this.classes.pop();
32 ClassEntry entry = new ClassEntry(outerEntry + "$" + name); 31 String className = outerName + "$" + name;
33 this.classes.push(entry); 32 this.classes.push(className);
34 String translatedEntry = this.translator.getTranslatedClass(entry).getName(); 33 String translatedEntry = this.remapper.apply(className);
35 this.sv.visitInnerClassType(translatedEntry.substring(translatedEntry.lastIndexOf('$') + 1)); 34 this.sv.visitInnerClassType(translatedEntry.substring(translatedEntry.lastIndexOf('$') + 1));
36 } 35 }
37 36