summaryrefslogtreecommitdiff
path: root/src/main/java/cuchaz/enigma/bytecode
diff options
context:
space:
mode:
authorGravatar gegy10002018-05-19 18:02:29 +0200
committerGravatar gegy10002018-05-19 18:02:29 +0200
commit8e7453727ff059c8f1db7f89f6793d22cbd5e6fc (patch)
treed15e55f61705fd9cd0a1d54816c09d0b6cc0ec36 /src/main/java/cuchaz/enigma/bytecode
parentPackage updates (diff)
downloadenigma-fork-8e7453727ff059c8f1db7f89f6793d22cbd5e6fc.tar.gz
enigma-fork-8e7453727ff059c8f1db7f89f6793d22cbd5e6fc.tar.xz
enigma-fork-8e7453727ff059c8f1db7f89f6793d22cbd5e6fc.zip
Annotation + inner class translation
Diffstat (limited to 'src/main/java/cuchaz/enigma/bytecode')
-rw-r--r--src/main/java/cuchaz/enigma/bytecode/AccessFlags.java3
-rw-r--r--src/main/java/cuchaz/enigma/bytecode/translators/TranslationAnnotationVisitor.java45
-rw-r--r--src/main/java/cuchaz/enigma/bytecode/translators/TranslationClassVisitor.java31
-rw-r--r--src/main/java/cuchaz/enigma/bytecode/translators/TranslationFieldVisitor.java33
-rw-r--r--src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java16
5 files changed, 111 insertions, 17 deletions
diff --git a/src/main/java/cuchaz/enigma/bytecode/AccessFlags.java b/src/main/java/cuchaz/enigma/bytecode/AccessFlags.java
index 0999abf..152f462 100644
--- a/src/main/java/cuchaz/enigma/bytecode/AccessFlags.java
+++ b/src/main/java/cuchaz/enigma/bytecode/AccessFlags.java
@@ -5,6 +5,9 @@ import org.objectweb.asm.Opcodes;
5import java.lang.reflect.Modifier; 5import java.lang.reflect.Modifier;
6 6
7public class AccessFlags { 7public class AccessFlags {
8 public static final AccessFlags PUBLIC = new AccessFlags(Modifier.PUBLIC);
9 public static final AccessFlags PUBLIC_STATIC_FINAL = new AccessFlags(Modifier.PUBLIC | Modifier.STATIC | Modifier.FINAL);
10
8 private static final int SYNTHETIC_FLAG = 0x00001000; 11 private static final int SYNTHETIC_FLAG = 0x00001000;
9 private static final int BRIDGED_FLAG = 0x00000040; 12 private static final int BRIDGED_FLAG = 0x00000040;
10 13
diff --git a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationAnnotationVisitor.java b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationAnnotationVisitor.java
new file mode 100644
index 0000000..177691b
--- /dev/null
+++ b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationAnnotationVisitor.java
@@ -0,0 +1,45 @@
1package cuchaz.enigma.bytecode.translators;
2
3import cuchaz.enigma.bytecode.AccessFlags;
4import cuchaz.enigma.mapping.Translator;
5import cuchaz.enigma.mapping.TypeDescriptor;
6import cuchaz.enigma.mapping.entry.ClassEntry;
7import cuchaz.enigma.mapping.entry.FieldDefEntry;
8import org.objectweb.asm.AnnotationVisitor;
9import org.objectweb.asm.Type;
10
11public class TranslationAnnotationVisitor extends AnnotationVisitor {
12 private final Translator translator;
13 private final ClassEntry annotationEntry;
14
15 public TranslationAnnotationVisitor(Translator translator, ClassEntry annotationEntry, int api, AnnotationVisitor av) {
16 super(api, av);
17 this.translator = translator;
18 this.annotationEntry = annotationEntry;
19 }
20
21 @Override
22 public void visit(String name, Object value) {
23 if (value instanceof Type) {
24 Type type = (Type) value;
25 super.visit(name, translator.getTranslatedType(type));
26 } else {
27 super.visit(name, value);
28 }
29 }
30
31 @Override
32 public AnnotationVisitor visitAnnotation(String name, String desc) {
33 TypeDescriptor type = new TypeDescriptor(desc);
34 FieldDefEntry annotationField = translator.getTranslatedFieldDef(new FieldDefEntry(annotationEntry, name, type, AccessFlags.PUBLIC));
35 return super.visitAnnotation(annotationField.getName(), annotationField.getDesc().toString());
36 }
37
38 @Override
39 public void visitEnum(String name, String desc, String value) {
40 TypeDescriptor type = new TypeDescriptor(desc);
41 FieldDefEntry annotationField = translator.getTranslatedFieldDef(new FieldDefEntry(annotationEntry, name, type, AccessFlags.PUBLIC));
42 FieldDefEntry enumField = translator.getTranslatedFieldDef(new FieldDefEntry(type.getTypeEntry(), value, type, AccessFlags.PUBLIC_STATIC_FINAL));
43 super.visitEnum(annotationField.getName(), annotationField.getDesc().toString(), enumField.getName());
44 }
45}
diff --git a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationClassVisitor.java b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationClassVisitor.java
index 3f61c29..5fdfaf1 100644
--- a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationClassVisitor.java
+++ b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationClassVisitor.java
@@ -54,7 +54,8 @@ public class TranslationClassVisitor extends ClassVisitor {
54 public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { 54 public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) {
55 FieldDefEntry entry = new FieldDefEntry(obfClassEntry, name, new TypeDescriptor(desc), new AccessFlags(access)); 55 FieldDefEntry entry = new FieldDefEntry(obfClassEntry, name, new TypeDescriptor(desc), new AccessFlags(access));
56 FieldDefEntry translatedEntry = translator.getTranslatedFieldDef(entry); 56 FieldDefEntry translatedEntry = translator.getTranslatedFieldDef(entry);
57 return super.visitField(translatedEntry.getAccess().getFlags(), translatedEntry.getName(), translatedEntry.getDesc().toString(), signature, value); 57 FieldVisitor fv = super.visitField(translatedEntry.getAccess().getFlags(), translatedEntry.getName(), translatedEntry.getDesc().toString(), signature, value);
58 return new TranslationFieldVisitor(translator, translatedEntry, api, fv);
58 } 59 }
59 60
60 @Override 61 @Override
@@ -64,32 +65,38 @@ public class TranslationClassVisitor extends ClassVisitor {
64 if (jarIndex.getBridgedMethod(entry) != null) { 65 if (jarIndex.getBridgedMethod(entry) != null) {
65 translatedEntry.getAccess().setBridged(); 66 translatedEntry.getAccess().setBridged();
66 } 67 }
67 MethodVisitor mv = super.visitMethod(translatedEntry.getAccess().getFlags(), name, desc, signature, exceptions); 68 String[] translatedExceptions = new String[exceptions.length];
69 for (int i = 0; i < exceptions.length; i++) {
70 translatedExceptions[i] = translator.getTranslatedClass(entryPool.getClass(exceptions[i])).getName();
71 }
72 MethodVisitor mv = super.visitMethod(translatedEntry.getAccess().getFlags(), translatedEntry.getName(), translatedEntry.getDesc().toString(), signature, translatedExceptions);
68 return new TranslationMethodVisitor(translator, translatedEntry, api, mv); 73 return new TranslationMethodVisitor(translator, translatedEntry, api, mv);
69 } 74 }
70 75
71 @Override 76 @Override
72 public void visitOuterClass(String owner, String name, String desc) { 77 public void visitOuterClass(String owner, String name, String desc) {
78 ClassEntry ownerEntry = translator.getTranslatedClass(entryPool.getClass(owner));
79 String translatedDesc = desc != null ? translator.getTranslatedTypeDesc(new TypeDescriptor(desc)).toString() : desc;
73 if (name != null) { 80 if (name != null) {
74 ClassEntry ownerEntry = translator.getTranslatedClass(entryPool.getClass(owner));
75 ClassEntry entry = translator.getTranslatedClass(entryPool.getClass(name)); 81 ClassEntry entry = translator.getTranslatedClass(entryPool.getClass(name));
76 String translatedDesc = translator.getTranslatedTypeDesc(new TypeDescriptor(desc)).toString();
77 super.visitOuterClass(ownerEntry.getName(), entry.getName(), translatedDesc); 82 super.visitOuterClass(ownerEntry.getName(), entry.getName(), translatedDesc);
78 } else { 83 } else {
79 super.visitOuterClass(owner, name, desc); 84 super.visitOuterClass(ownerEntry.getName(), name, translatedDesc);
80 } 85 }
81 } 86 }
82 87
83 @Override 88 @Override
84 public AnnotationVisitor visitAnnotation(String desc, boolean visible) { 89 public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
85 // TODO: Implement 90 TypeDescriptor translatedDesc = translator.getTranslatedTypeDesc(new TypeDescriptor(desc));
86 return super.visitAnnotation(desc, visible); 91 AnnotationVisitor av = super.visitAnnotation(translatedDesc.toString(), visible);
92 return new TranslationAnnotationVisitor(translator, translatedDesc.getTypeEntry(), api, av);
87 } 93 }
88 94
89 @Override 95 @Override
90 public AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) { 96 public AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) {
91 // TODO: Implement 97 TypeDescriptor translatedDesc = translator.getTranslatedTypeDesc(new TypeDescriptor(desc));
92 return super.visitTypeAnnotation(typeRef, typePath, desc, visible); 98 AnnotationVisitor av = super.visitTypeAnnotation(typeRef, typePath, translatedDesc.toString(), visible);
99 return new TranslationAnnotationVisitor(translator, translatedDesc.getTypeEntry(), api, av);
93 } 100 }
94 101
95 @Override 102 @Override
@@ -101,7 +108,11 @@ public class TranslationClassVisitor extends ClassVisitor {
101 ClassEntry innerEntry = translator.getTranslatedClass(entryPool.getClass(innerName)); 108 ClassEntry innerEntry = translator.getTranslatedClass(entryPool.getClass(innerName));
102 super.visitInnerClass(translatedEntry.getName(), outerEntry.getName(), innerEntry.getName(), translatedEntry.getAccess().getFlags()); 109 super.visitInnerClass(translatedEntry.getName(), outerEntry.getName(), innerEntry.getName(), translatedEntry.getAccess().getFlags());
103 } else { 110 } else {
104 super.visitInnerClass(name, outerName, innerName, access); 111 int separatorIndex = name.lastIndexOf("$");
112 String parentName = name.substring(0, separatorIndex);
113 String childName = name.substring(separatorIndex + 1);
114 ClassEntry outerEntry = translator.getTranslatedClass(entryPool.getClass(parentName));
115 super.visitInnerClass(outerEntry.getName() + "$" + childName, outerName, innerName, access);
105 } 116 }
106 } 117 }
107} 118}
diff --git a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationFieldVisitor.java b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationFieldVisitor.java
new file mode 100644
index 0000000..e4695fb
--- /dev/null
+++ b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationFieldVisitor.java
@@ -0,0 +1,33 @@
1package cuchaz.enigma.bytecode.translators;
2
3import cuchaz.enigma.mapping.Translator;
4import cuchaz.enigma.mapping.TypeDescriptor;
5import cuchaz.enigma.mapping.entry.FieldDefEntry;
6import org.objectweb.asm.AnnotationVisitor;
7import org.objectweb.asm.FieldVisitor;
8import org.objectweb.asm.TypePath;
9
10public class TranslationFieldVisitor extends FieldVisitor {
11 private final FieldDefEntry fieldEntry;
12 private final Translator translator;
13
14 public TranslationFieldVisitor(Translator translator, FieldDefEntry fieldEntry, int api, FieldVisitor fv) {
15 super(api, fv);
16 this.translator = translator;
17 this.fieldEntry = fieldEntry;
18 }
19
20 @Override
21 public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
22 TypeDescriptor typeDesc = translator.getTranslatedTypeDesc(new TypeDescriptor(desc));
23 AnnotationVisitor av = super.visitAnnotation(typeDesc.toString(), visible);
24 return new TranslationAnnotationVisitor(translator, typeDesc.getTypeEntry(), api, av);
25 }
26
27 @Override
28 public AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) {
29 TypeDescriptor typeDesc = translator.getTranslatedTypeDesc(new TypeDescriptor(desc));
30 AnnotationVisitor av = super.visitAnnotation(typeDesc.toString(), visible);
31 return new TranslationAnnotationVisitor(translator, typeDesc.getTypeEntry(), api, av);
32 }
33}
diff --git a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java
index b2192e4..c729962 100644
--- a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java
+++ b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java
@@ -39,15 +39,17 @@ public class TranslationMethodVisitor extends MethodVisitor {
39 } 39 }
40 40
41 @Override 41 @Override
42 public void visitAttribute(Attribute attr) { 42 public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
43 // TODO: Implement 43 TypeDescriptor typeDesc = translator.getTranslatedTypeDesc(new TypeDescriptor(desc));
44 super.visitAttribute(attr); 44 AnnotationVisitor av = super.visitAnnotation(typeDesc.toString(), visible);
45 return new TranslationAnnotationVisitor(translator, typeDesc.getTypeEntry(), api, av);
45 } 46 }
46 47
47 @Override 48 @Override
48 public AnnotationVisitor visitAnnotation(String desc, boolean visible) { 49 public AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) {
49 // TODO: Implement 50 TypeDescriptor typeDesc = translator.getTranslatedTypeDesc(new TypeDescriptor(desc));
50 return super.visitAnnotation(desc, visible); 51 AnnotationVisitor av = super.visitAnnotation(typeDesc.toString(), visible);
52 return new TranslationAnnotationVisitor(translator, typeDesc.getTypeEntry(), api, av);
51 } 53 }
52 54
53 @Override 55 @Override
@@ -69,7 +71,7 @@ public class TranslationMethodVisitor extends MethodVisitor {
69 // List types would require this whole block again, so just go with aListx 71 // List types would require this whole block again, so just go with aListx
70 nameBuilder.append(nameIndex); 72 nameBuilder.append(nameIndex);
71 } else if (argDesc.isType()) { 73 } else if (argDesc.isType()) {
72 String typeName = argDesc.getOwnerEntry().getSimpleName().replace("$", ""); 74 String typeName = argDesc.getTypeEntry().getSimpleName().replace("$", "");
73 typeName = typeName.substring(0, 1).toUpperCase(Locale.ROOT) + typeName.substring(1); 75 typeName = typeName.substring(0, 1).toUpperCase(Locale.ROOT) + typeName.substring(1);
74 nameBuilder.append(typeName); 76 nameBuilder.append(typeName);
75 } 77 }