summaryrefslogtreecommitdiff
path: root/src/cuchaz/enigma/bytecode/ClassTranslator.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/cuchaz/enigma/bytecode/ClassTranslator.java')
-rw-r--r--src/cuchaz/enigma/bytecode/ClassTranslator.java42
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 ******************************************************************************/
11package cuchaz.enigma.bytecode; 11package cuchaz.enigma.bytecode;
12 12
13import java.util.Map;
14
15import javassist.CtBehavior; 13import javassist.CtBehavior;
16import javassist.CtClass; 14import javassist.CtClass;
17import javassist.CtField; 15import javassist.CtField;
@@ -19,9 +17,6 @@ import javassist.CtMethod;
19import javassist.bytecode.ConstPool; 17import javassist.bytecode.ConstPool;
20import javassist.bytecode.Descriptor; 18import javassist.bytecode.Descriptor;
21import javassist.bytecode.SourceFileAttribute; 19import javassist.bytecode.SourceFileAttribute;
22
23import com.google.common.collect.Maps;
24
25import cuchaz.enigma.mapping.BehaviorEntry; 20import cuchaz.enigma.mapping.BehaviorEntry;
26import cuchaz.enigma.mapping.ClassEntry; 21import cuchaz.enigma.mapping.ClassEntry;
27import cuchaz.enigma.mapping.EntryFactory; 22import 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));