From d72aad82c795726efcf6145f5a4172e4c8d3a5b2 Mon Sep 17 00:00:00 2001 From: gegy1000 Date: Sat, 19 May 2018 20:38:14 +0200 Subject: Signature refactoring --- .../translators/TranslationAnnotationVisitor.java | 9 ++--- .../translators/TranslationClassVisitor.java | 44 +++++++++++----------- .../translators/TranslationMethodVisitor.java | 3 +- .../translators/TranslationSignatureVisitor.java | 29 +++++++------- 4 files changed, 42 insertions(+), 43 deletions(-) (limited to 'src/main/java/cuchaz/enigma/bytecode') 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 @@ package cuchaz.enigma.bytecode.translators; -import cuchaz.enigma.bytecode.AccessFlags; import cuchaz.enigma.mapping.Translator; import cuchaz.enigma.mapping.TypeDescriptor; import cuchaz.enigma.mapping.entry.ClassEntry; -import cuchaz.enigma.mapping.entry.FieldDefEntry; +import cuchaz.enigma.mapping.entry.FieldEntry; import org.objectweb.asm.AnnotationVisitor; public class TranslationAnnotationVisitor extends AnnotationVisitor { @@ -30,15 +29,15 @@ public class TranslationAnnotationVisitor extends AnnotationVisitor { @Override public AnnotationVisitor visitAnnotation(String name, String desc) { TypeDescriptor type = new TypeDescriptor(desc); - FieldDefEntry annotationField = translator.getTranslatedFieldDef(new FieldDefEntry(annotationEntry, name, type, AccessFlags.PUBLIC)); + FieldEntry annotationField = translator.getTranslatedField(new FieldEntry(annotationEntry, name, type)); return super.visitAnnotation(annotationField.getName(), annotationField.getDesc().toString()); } @Override public void visitEnum(String name, String desc, String value) { TypeDescriptor type = new TypeDescriptor(desc); - FieldDefEntry annotationField = translator.getTranslatedFieldDef(new FieldDefEntry(annotationEntry, name, type, AccessFlags.PUBLIC)); - FieldDefEntry enumField = translator.getTranslatedFieldDef(new FieldDefEntry(type.getTypeEntry(), value, type, AccessFlags.PUBLIC_STATIC_FINAL)); + FieldEntry annotationField = translator.getTranslatedField(new FieldEntry(annotationEntry, name, type)); + FieldEntry enumField = translator.getTranslatedField(new FieldEntry(type.getTypeEntry(), value, type)); super.visitEnum(annotationField.getName(), annotationField.getDesc().toString(), enumField.getName()); } } 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; import cuchaz.enigma.analysis.JarIndex; import cuchaz.enigma.bytecode.AccessFlags; import cuchaz.enigma.mapping.MethodDescriptor; +import cuchaz.enigma.mapping.Signature; import cuchaz.enigma.mapping.Translator; import cuchaz.enigma.mapping.TypeDescriptor; import cuchaz.enigma.mapping.entry.*; @@ -25,6 +26,7 @@ public class TranslationClassVisitor extends ClassVisitor { private final ReferencedEntryPool entryPool; private ClassDefEntry obfClassEntry; + private Signature obfSignature; public TranslationClassVisitor(Translator translator, JarIndex jarIndex, ReferencedEntryPool entryPool, int api, ClassVisitor cv) { super(api, cv); @@ -35,29 +37,28 @@ public class TranslationClassVisitor extends ClassVisitor { @Override public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { - obfClassEntry = new ClassDefEntry(name, new AccessFlags(access)); - ClassDefEntry entry = translator.getTranslatedClassDef(obfClassEntry); + obfSignature = Signature.createSignature(signature); + obfClassEntry = new ClassDefEntry(name, obfSignature, new AccessFlags(access)); + ClassDefEntry translatedEntry = translator.getTranslatedClassDef(obfClassEntry); ClassEntry superEntry = translator.getTranslatedClass(entryPool.getClass(superName)); String[] translatedInterfaces = new String[interfaces.length]; for (int i = 0; i < interfaces.length; i++) { translatedInterfaces[i] = translator.getTranslatedClass(entryPool.getClass(interfaces[i])).getName(); } - String translatedSignature = translator.getTranslatedSignature(signature, false, api); - super.visit(version, entry.getAccess().getFlags(), entry.getName(), translatedSignature, superEntry.getName(), translatedInterfaces); + super.visit(version, translatedEntry.getAccess().getFlags(), translatedEntry.getName(), translatedEntry.getSignature().toString(), superEntry.getName(), translatedInterfaces); } @Override public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { - FieldDefEntry entry = new FieldDefEntry(obfClassEntry, name, new TypeDescriptor(desc), new AccessFlags(access)); + FieldDefEntry entry = new FieldDefEntry(obfClassEntry, name, new TypeDescriptor(desc), Signature.createTypedSignature(signature), new AccessFlags(access)); FieldDefEntry translatedEntry = translator.getTranslatedFieldDef(entry); - String translatedSignature = translator.getTranslatedSignature(signature, true, api); - FieldVisitor fv = super.visitField(translatedEntry.getAccess().getFlags(), translatedEntry.getName(), translatedEntry.getDesc().toString(), translatedSignature, value); + FieldVisitor fv = super.visitField(translatedEntry.getAccess().getFlags(), translatedEntry.getName(), translatedEntry.getDesc().toString(), translatedEntry.getSignature().toString(), value); return new TranslationFieldVisitor(translator, translatedEntry, api, fv); } @Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { - MethodDefEntry entry = new MethodDefEntry(obfClassEntry, name, new MethodDescriptor(desc), new AccessFlags(access)); + MethodDefEntry entry = new MethodDefEntry(obfClassEntry, name, new MethodDescriptor(desc), Signature.createSignature(signature), new AccessFlags(access)); MethodDefEntry translatedEntry = translator.getTranslatedMethodDef(entry); if (jarIndex.getBridgedMethod(entry) != null) { translatedEntry.getAccess().setBridged(); @@ -66,11 +67,22 @@ public class TranslationClassVisitor extends ClassVisitor { for (int i = 0; i < exceptions.length; i++) { translatedExceptions[i] = translator.getTranslatedClass(entryPool.getClass(exceptions[i])).getName(); } - String translatedSignature = translator.getTranslatedSignature(signature, false, api); - MethodVisitor mv = super.visitMethod(translatedEntry.getAccess().getFlags(), translatedEntry.getName(), translatedEntry.getDesc().toString(), translatedSignature, translatedExceptions); + MethodVisitor mv = super.visitMethod(translatedEntry.getAccess().getFlags(), translatedEntry.getName(), translatedEntry.getDesc().toString(), translatedEntry.getSignature().toString(), translatedExceptions); return new TranslationMethodVisitor(translator, translatedEntry, api, mv); } + @Override + public void visitInnerClass(String name, String outerName, String innerName, int access) { + ClassDefEntry translatedEntry = translator.getTranslatedClassDef(new ClassDefEntry(name, obfSignature, new AccessFlags(access))); + String translatedName = translatedEntry.getName(); + int separatorIndex = translatedName.lastIndexOf("$"); + String parentName = translatedName.substring(0, separatorIndex); + String childName = translatedName.substring(separatorIndex + 1); + + ClassEntry outerEntry = translator.getTranslatedClass(entryPool.getClass(parentName)); + super.visitInnerClass(translatedName, outerEntry.getName(), childName, translatedEntry.getAccess().getFlags()); + } + @Override public void visitOuterClass(String owner, String name, String desc) { if (desc != null) { @@ -94,16 +106,4 @@ public class TranslationClassVisitor extends ClassVisitor { AnnotationVisitor av = super.visitTypeAnnotation(typeRef, typePath, translatedDesc.toString(), visible); return new TranslationAnnotationVisitor(translator, translatedDesc.getTypeEntry(), api, av); } - - @Override - public void visitInnerClass(String name, String outerName, String innerName, int access) { - ClassDefEntry translatedEntry = translator.getTranslatedClassDef(new ClassDefEntry(name, new AccessFlags(access))); - String translatedName = translatedEntry.getName(); - int separatorIndex = translatedName.lastIndexOf("$"); - String parentName = translatedName.substring(0, separatorIndex); - String childName = translatedName.substring(separatorIndex + 1); - - ClassEntry outerEntry = translator.getTranslatedClass(entryPool.getClass(parentName)); - super.visitInnerClass(translatedName, outerEntry.getName(), childName, translatedEntry.getAccess().getFlags()); - } } 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 @@ package cuchaz.enigma.bytecode.translators; import cuchaz.enigma.mapping.MethodDescriptor; +import cuchaz.enigma.mapping.Signature; import cuchaz.enigma.mapping.Translator; import cuchaz.enigma.mapping.TypeDescriptor; import cuchaz.enigma.mapping.entry.*; @@ -102,7 +103,7 @@ public class TranslationMethodVisitor extends MethodVisitor { } translatedName = nameBuilder.toString(); } - String translatedSignature = translator.getTranslatedSignature(signature, true, api); + String translatedSignature = translator.getTranslatedSignature(Signature.createTypedSignature(signature)).toString(); super.visitLocalVariable(translatedName, translatedEntry.getDesc().toString(), translatedSignature, start, end, index); } 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 @@ package cuchaz.enigma.bytecode.translators; -import cuchaz.enigma.mapping.Translator; -import cuchaz.enigma.mapping.entry.ClassEntry; +import org.objectweb.asm.Opcodes; import org.objectweb.asm.signature.SignatureVisitor; import java.util.Stack; +import java.util.function.Function; public class TranslationSignatureVisitor extends SignatureVisitor { - private final Translator translator; + private final Function remapper; private final SignatureVisitor sv; - private final Stack classes = new Stack<>(); + private final Stack classes = new Stack<>(); - public TranslationSignatureVisitor(Translator translator, int api, SignatureVisitor sv) { - super(api); - this.translator = translator; + public TranslationSignatureVisitor(Function remapper, SignatureVisitor sv) { + super(Opcodes.ASM5); + this.remapper = remapper; this.sv = sv; } @Override public void visitClassType(String name) { - ClassEntry entry = new ClassEntry(name); - ClassEntry translatedEntry = this.translator.getTranslatedClass(entry); - this.classes.push(entry); - this.sv.visitClassType(translatedEntry.getName()); + String translatedEntry = this.remapper.apply(name); + this.classes.push(name); + this.sv.visitClassType(translatedEntry); } @Override public void visitInnerClassType(String name) { - ClassEntry outerEntry = this.classes.pop(); - ClassEntry entry = new ClassEntry(outerEntry + "$" + name); - this.classes.push(entry); - String translatedEntry = this.translator.getTranslatedClass(entry).getName(); + String outerName = this.classes.pop(); + String className = outerName + "$" + name; + this.classes.push(className); + String translatedEntry = this.remapper.apply(className); this.sv.visitInnerClassType(translatedEntry.substring(translatedEntry.lastIndexOf('$') + 1)); } -- cgit v1.2.3