diff options
| author | 2015-03-16 19:22:22 -0400 | |
|---|---|---|
| committer | 2015-03-16 19:22:22 -0400 | |
| commit | 5e3743a0aca3529eacf9be400c8b8d7547f66e7f (patch) | |
| tree | ea601747547f78e1b83ab828650932126440e221 /src/cuchaz/enigma/bytecode/ClassTranslator.java | |
| parent | update to new javassist version to (hopefully) get bug fixes (diff) | |
| download | enigma-fork-5e3743a0aca3529eacf9be400c8b8d7547f66e7f.tar.gz enigma-fork-5e3743a0aca3529eacf9be400c8b8d7547f66e7f.tar.xz enigma-fork-5e3743a0aca3529eacf9be400c8b8d7547f66e7f.zip | |
started adding minimal support for generics
fixed mark-as-deobfuscated issue
Diffstat (limited to 'src/cuchaz/enigma/bytecode/ClassTranslator.java')
| -rw-r--r-- | src/cuchaz/enigma/bytecode/ClassTranslator.java | 42 |
1 files changed, 12 insertions, 30 deletions
diff --git a/src/cuchaz/enigma/bytecode/ClassTranslator.java b/src/cuchaz/enigma/bytecode/ClassTranslator.java index 94ab2c4..7952577 100644 --- a/src/cuchaz/enigma/bytecode/ClassTranslator.java +++ b/src/cuchaz/enigma/bytecode/ClassTranslator.java | |||
| @@ -10,8 +10,6 @@ | |||
| 10 | ******************************************************************************/ | 10 | ******************************************************************************/ |
| 11 | package cuchaz.enigma.bytecode; | 11 | package cuchaz.enigma.bytecode; |
| 12 | 12 | ||
| 13 | import java.util.Map; | ||
| 14 | |||
| 15 | import javassist.CtBehavior; | 13 | import javassist.CtBehavior; |
| 16 | import javassist.CtClass; | 14 | import javassist.CtClass; |
| 17 | import javassist.CtField; | 15 | import javassist.CtField; |
| @@ -19,9 +17,6 @@ import javassist.CtMethod; | |||
| 19 | import javassist.bytecode.ConstPool; | 17 | import javassist.bytecode.ConstPool; |
| 20 | import javassist.bytecode.Descriptor; | 18 | import javassist.bytecode.Descriptor; |
| 21 | import javassist.bytecode.SourceFileAttribute; | 19 | import javassist.bytecode.SourceFileAttribute; |
| 22 | |||
| 23 | import com.google.common.collect.Maps; | ||
| 24 | |||
| 25 | import cuchaz.enigma.mapping.BehaviorEntry; | 20 | import cuchaz.enigma.mapping.BehaviorEntry; |
| 26 | import cuchaz.enigma.mapping.ClassEntry; | 21 | import cuchaz.enigma.mapping.ClassEntry; |
| 27 | import cuchaz.enigma.mapping.EntryFactory; | 22 | import cuchaz.enigma.mapping.EntryFactory; |
| @@ -50,20 +45,15 @@ public class ClassTranslator { | |||
| 50 | 45 | ||
| 51 | case ConstPool.CONST_Fieldref: { | 46 | case ConstPool.CONST_Fieldref: { |
| 52 | 47 | ||
| 53 | // translate the name | 48 | // translate the name and type |
| 54 | FieldEntry entry = new FieldEntry( | 49 | FieldEntry entry = EntryFactory.getFieldEntry( |
| 55 | new ClassEntry(Descriptor.toJvmName(constants.getFieldrefClassName(i))), | 50 | Descriptor.toJvmName(constants.getFieldrefClassName(i)), |
| 56 | constants.getFieldrefName(i), | 51 | constants.getFieldrefName(i), |
| 57 | new Type(constants.getFieldrefType(i)) | 52 | constants.getFieldrefType(i) |
| 58 | ); | 53 | ); |
| 59 | FieldEntry translatedEntry = m_translator.translateEntry(entry); | 54 | FieldEntry translatedEntry = m_translator.translateEntry(entry); |
| 60 | 55 | if (!entry.equals(translatedEntry)) { | |
| 61 | // translate the type | 56 | editor.changeMemberrefNameAndType(i, translatedEntry.getName(), translatedEntry.getType().toString()); |
| 62 | Type type = new Type(constants.getFieldrefType(i)); | ||
| 63 | Type translatedType = m_translator.translateType(type); | ||
| 64 | |||
| 65 | if (!entry.equals(translatedEntry) || !type.equals(translatedType)) { | ||
| 66 | editor.changeMemberrefNameAndType(i, translatedEntry.getName(), translatedType.toString()); | ||
| 67 | } | 57 | } |
| 68 | } | 58 | } |
| 69 | break; | 59 | break; |
| @@ -71,15 +61,14 @@ public class ClassTranslator { | |||
| 71 | case ConstPool.CONST_Methodref: | 61 | case ConstPool.CONST_Methodref: |
| 72 | case ConstPool.CONST_InterfaceMethodref: { | 62 | case ConstPool.CONST_InterfaceMethodref: { |
| 73 | 63 | ||
| 74 | // translate the name and type | 64 | // translate the name and type (ie signature) |
| 75 | BehaviorEntry entry = EntryFactory.getBehaviorEntry( | 65 | BehaviorEntry entry = EntryFactory.getBehaviorEntry( |
| 76 | Descriptor.toJvmName(editor.getMemberrefClassname(i)), | 66 | Descriptor.toJvmName(editor.getMemberrefClassname(i)), |
| 77 | editor.getMemberrefName(i), | 67 | editor.getMemberrefName(i), |
| 78 | editor.getMemberrefType(i) | 68 | editor.getMemberrefType(i) |
| 79 | ); | 69 | ); |
| 80 | BehaviorEntry translatedEntry = m_translator.translateEntry(entry); | 70 | BehaviorEntry translatedEntry = m_translator.translateEntry(entry); |
| 81 | 71 | if (!entry.equals(translatedEntry)) { | |
| 82 | if (!entry.getName().equals(translatedEntry.getName()) || !entry.getSignature().equals(translatedEntry.getSignature())) { | ||
| 83 | editor.changeMemberrefNameAndType(i, translatedEntry.getName(), translatedEntry.getSignature().toString()); | 72 | editor.changeMemberrefNameAndType(i, translatedEntry.getName(), translatedEntry.getSignature().toString()); |
| 84 | } | 73 | } |
| 85 | } | 74 | } |
| @@ -120,25 +109,18 @@ public class ClassTranslator { | |||
| 120 | } | 109 | } |
| 121 | 110 | ||
| 122 | if (entry.getSignature() != null) { | 111 | if (entry.getSignature() != null) { |
| 123 | // translate the type | 112 | // translate the signature |
| 124 | Signature translatedSignature = m_translator.translateSignature(entry.getSignature()); | 113 | Signature translatedSignature = m_translator.translateSignature(entry.getSignature()); |
| 125 | behavior.getMethodInfo().setDescriptor(translatedSignature.toString()); | 114 | behavior.getMethodInfo().setDescriptor(translatedSignature.toString()); |
| 126 | } | 115 | } |
| 127 | } | 116 | } |
| 128 | 117 | ||
| 129 | // translate all the class names referenced in the code | 118 | // translate all the class names referenced in the code |
| 130 | // the above code only changed method/field/reference names and types, but not the class names themselves | 119 | // the above code only changed method/field/reference names and types, but not the rest of the class references |
| 131 | Map<ClassEntry,ClassEntry> map = Maps.newHashMap(); | 120 | ClassRenamer.renameClasses(c, m_translator); |
| 132 | for (ClassEntry obfClassEntry : ClassRenamer.getAllClassEntries(c)) { | ||
| 133 | ClassEntry deobfClassEntry = m_translator.translateEntry(obfClassEntry); | ||
| 134 | if (!obfClassEntry.equals(deobfClassEntry)) { | ||
| 135 | map.put(obfClassEntry, deobfClassEntry); | ||
| 136 | } | ||
| 137 | } | ||
| 138 | ClassRenamer.renameClasses(c, map); | ||
| 139 | 121 | ||
| 140 | // translate the source file attribute too | 122 | // translate the source file attribute too |
| 141 | ClassEntry deobfClassEntry = map.get(classEntry); | 123 | ClassEntry deobfClassEntry = m_translator.translateEntry(classEntry); |
| 142 | if (deobfClassEntry != null) { | 124 | if (deobfClassEntry != null) { |
| 143 | String sourceFile = Descriptor.toJvmName(deobfClassEntry.getOutermostClassName()) + ".java"; | 125 | String sourceFile = Descriptor.toJvmName(deobfClassEntry.getOutermostClassName()) + ".java"; |
| 144 | c.getClassFile().addAttribute(new SourceFileAttribute(constants, sourceFile)); | 126 | c.getClassFile().addAttribute(new SourceFileAttribute(constants, sourceFile)); |