diff options
Diffstat (limited to 'src/main/java/cuchaz/enigma/bytecode')
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 @@ | |||
| 1 | package cuchaz.enigma.bytecode.translators; | 1 | package cuchaz.enigma.bytecode.translators; |
| 2 | 2 | ||
| 3 | import cuchaz.enigma.bytecode.AccessFlags; | ||
| 4 | import cuchaz.enigma.mapping.Translator; | 3 | import cuchaz.enigma.mapping.Translator; |
| 5 | import cuchaz.enigma.mapping.TypeDescriptor; | 4 | import cuchaz.enigma.mapping.TypeDescriptor; |
| 6 | import cuchaz.enigma.mapping.entry.ClassEntry; | 5 | import cuchaz.enigma.mapping.entry.ClassEntry; |
| 7 | import cuchaz.enigma.mapping.entry.FieldDefEntry; | 6 | import cuchaz.enigma.mapping.entry.FieldEntry; |
| 8 | import org.objectweb.asm.AnnotationVisitor; | 7 | import org.objectweb.asm.AnnotationVisitor; |
| 9 | 8 | ||
| 10 | public class TranslationAnnotationVisitor extends AnnotationVisitor { | 9 | public 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; | |||
| 14 | import cuchaz.enigma.analysis.JarIndex; | 14 | import cuchaz.enigma.analysis.JarIndex; |
| 15 | import cuchaz.enigma.bytecode.AccessFlags; | 15 | import cuchaz.enigma.bytecode.AccessFlags; |
| 16 | import cuchaz.enigma.mapping.MethodDescriptor; | 16 | import cuchaz.enigma.mapping.MethodDescriptor; |
| 17 | import cuchaz.enigma.mapping.Signature; | ||
| 17 | import cuchaz.enigma.mapping.Translator; | 18 | import cuchaz.enigma.mapping.Translator; |
| 18 | import cuchaz.enigma.mapping.TypeDescriptor; | 19 | import cuchaz.enigma.mapping.TypeDescriptor; |
| 19 | import cuchaz.enigma.mapping.entry.*; | 20 | import 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 @@ | |||
| 1 | package cuchaz.enigma.bytecode.translators; | 1 | package cuchaz.enigma.bytecode.translators; |
| 2 | 2 | ||
| 3 | import cuchaz.enigma.mapping.MethodDescriptor; | 3 | import cuchaz.enigma.mapping.MethodDescriptor; |
| 4 | import cuchaz.enigma.mapping.Signature; | ||
| 4 | import cuchaz.enigma.mapping.Translator; | 5 | import cuchaz.enigma.mapping.Translator; |
| 5 | import cuchaz.enigma.mapping.TypeDescriptor; | 6 | import cuchaz.enigma.mapping.TypeDescriptor; |
| 6 | import cuchaz.enigma.mapping.entry.*; | 7 | import 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 @@ | |||
| 1 | package cuchaz.enigma.bytecode.translators; | 1 | package cuchaz.enigma.bytecode.translators; |
| 2 | 2 | ||
| 3 | import cuchaz.enigma.mapping.Translator; | 3 | import org.objectweb.asm.Opcodes; |
| 4 | import cuchaz.enigma.mapping.entry.ClassEntry; | ||
| 5 | import org.objectweb.asm.signature.SignatureVisitor; | 4 | import org.objectweb.asm.signature.SignatureVisitor; |
| 6 | 5 | ||
| 7 | import java.util.Stack; | 6 | import java.util.Stack; |
| 7 | import java.util.function.Function; | ||
| 8 | 8 | ||
| 9 | public class TranslationSignatureVisitor extends SignatureVisitor { | 9 | public 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 | ||