summaryrefslogtreecommitdiff
path: root/src/main/java/cuchaz/enigma/mapping/MethodMapping.java
diff options
context:
space:
mode:
authorGravatar gegy10002018-07-17 19:14:08 +0200
committerGravatar GitHub2018-07-17 19:14:08 +0200
commita88175ffc95792b88a8724f66db6dda2b8cc32ee (patch)
tree65895bbc6cf1766f4ca01e1257619ab1993e71dc /src/main/java/cuchaz/enigma/mapping/MethodMapping.java
parentMerge pull request #3 from thiakil/src-jar (diff)
downloadenigma-fork-a88175ffc95792b88a8724f66db6dda2b8cc32ee.tar.gz
enigma-fork-a88175ffc95792b88a8724f66db6dda2b8cc32ee.tar.xz
enigma-fork-a88175ffc95792b88a8724f66db6dda2b8cc32ee.zip
ASM Based Class Translator (#1)
* Initial port to ASM * Package updates * Annotation + inner class translation * Fix inner class mapping * More bytecode translation * Signature refactoring * Fix highlighting of mapped names * Fix parameter name offset * Fix anonymous class generation * Fix issues with inner class signature transformation * Fix bridged method detection * Fix compile issues * Resolve all failed tests * Apply deobfuscated name to transformed classes * Fix class signatures not being translated * Fix frame array type translation * Fix frame array type translation * Fix array translation in method calls * Fix method reference and bridge detection * Fix handling of null deobf mappings * Parameter translation in interfaces * Fix enum parameter index offset * Fix parsed local variable indexing * Fix stackoverflow on rebuilding method names * Ignore invalid decompiled variable indices * basic source jar * Output directly to file on source export * Make decompile parallel * fix incorrect super calls * Use previous save state to delete old mapping files * Fix old mappings not properly being removed * Fix old mappings not properly being removed * make isMethodProvider public (cherry picked from commit ebad6a9) * speed up Deobfuscator's getSources by using a single TranslatingTypeloader and caching the ClassLoaderTypeloader * ignore .idea project folders * move SynchronizedTypeLoader to a non-inner * fix signature remap of inners for now * index & resolve method/field references for usages view * Allow reader/writer subclasses to provide the underlying file operations * fix giving obf classes a name not removing them from the panel * buffer the ParsedJar class entry inputstream, allow use with a jarinputstream * make CachingClasspathTypeLoader public * make CachingClasspathTypeLoader public * support enum switches with obfuscated SwitchMaps
Diffstat (limited to 'src/main/java/cuchaz/enigma/mapping/MethodMapping.java')
-rw-r--r--src/main/java/cuchaz/enigma/mapping/MethodMapping.java139
1 files changed, 68 insertions, 71 deletions
diff --git a/src/main/java/cuchaz/enigma/mapping/MethodMapping.java b/src/main/java/cuchaz/enigma/mapping/MethodMapping.java
index 1524ce6..2f10144 100644
--- a/src/main/java/cuchaz/enigma/mapping/MethodMapping.java
+++ b/src/main/java/cuchaz/enigma/mapping/MethodMapping.java
@@ -11,50 +11,49 @@
11 11
12package cuchaz.enigma.mapping; 12package cuchaz.enigma.mapping;
13 13
14import com.google.common.base.Preconditions;
14import com.google.common.collect.Maps; 15import com.google.common.collect.Maps;
16import cuchaz.enigma.mapping.entry.ClassEntry;
17import cuchaz.enigma.mapping.entry.MethodEntry;
15import cuchaz.enigma.throwables.IllegalNameException; 18import cuchaz.enigma.throwables.IllegalNameException;
16import cuchaz.enigma.throwables.MappingConflict; 19import cuchaz.enigma.throwables.MappingConflict;
17 20
18import java.util.Map; 21import java.util.Map;
19 22
20public class MethodMapping implements Comparable<MethodMapping>, MemberMapping<BehaviorEntry> { 23public class MethodMapping implements Comparable<MethodMapping>, MemberMapping<MethodEntry> {
21 24
22 private String obfName; 25 private String obfName;
23 private String deobfName; 26 private String deobfName;
24 private Signature obfSignature; 27 private MethodDescriptor obfDescriptor;
25 private Map<Integer, ArgumentMapping> arguments; 28 private Map<Integer, LocalVariableMapping> localVariables;
26 private Mappings.EntryModifier modifier; 29 private Mappings.EntryModifier modifier;
27 30
28 public MethodMapping(String obfName, Signature obfSignature) { 31 public MethodMapping(String obfName, MethodDescriptor obfDescriptor) {
29 this(obfName, obfSignature, null, Mappings.EntryModifier.UNCHANGED); 32 this(obfName, obfDescriptor, null, Mappings.EntryModifier.UNCHANGED);
30 } 33 }
31 34
32 public MethodMapping(String obfName, Signature obfSignature, String deobfName) { 35 public MethodMapping(String obfName, MethodDescriptor obfDescriptor, String deobfName) {
33 this(obfName, obfSignature, deobfName, Mappings.EntryModifier.UNCHANGED); 36 this(obfName, obfDescriptor, deobfName, Mappings.EntryModifier.UNCHANGED);
34 } 37 }
35 38
36 public MethodMapping(String obfName, Signature obfSignature, String deobfName, Mappings.EntryModifier modifier) { 39 public MethodMapping(String obfName, MethodDescriptor obfDescriptor, String deobfName, Mappings.EntryModifier modifier) {
37 if (obfName == null) { 40 Preconditions.checkNotNull(obfName, "Method obf name cannot be null");
38 throw new IllegalArgumentException("obf name cannot be null!"); 41 Preconditions.checkNotNull(obfDescriptor, "Method obf desc cannot be null");
39 }
40 if (obfSignature == null) {
41 throw new IllegalArgumentException("obf signature cannot be null!");
42 }
43 this.obfName = obfName; 42 this.obfName = obfName;
44 this.deobfName = NameValidator.validateMethodName(deobfName); 43 this.deobfName = NameValidator.validateMethodName(deobfName);
45 this.obfSignature = obfSignature; 44 this.obfDescriptor = obfDescriptor;
46 this.arguments = Maps.newTreeMap(); 45 this.localVariables = Maps.newTreeMap();
47 this.modifier = modifier; 46 this.modifier = modifier;
48 } 47 }
49 48
50 public MethodMapping(MethodMapping other, ClassNameReplacer obfClassNameReplacer) { 49 public MethodMapping(MethodMapping other, Translator translator) {
51 this.obfName = other.obfName; 50 this.obfName = other.obfName;
52 this.deobfName = other.deobfName; 51 this.deobfName = other.deobfName;
53 this.modifier = other.modifier; 52 this.modifier = other.modifier;
54 this.obfSignature = new Signature(other.obfSignature, obfClassNameReplacer); 53 this.obfDescriptor = translator.getTranslatedMethodDesc(other.obfDescriptor);
55 this.arguments = Maps.newTreeMap(); 54 this.localVariables = Maps.newTreeMap();
56 for (Map.Entry<Integer, ArgumentMapping> entry : other.arguments.entrySet()) { 55 for (Map.Entry<Integer, LocalVariableMapping> entry : other.localVariables.entrySet()) {
57 this.arguments.put(entry.getKey(), new ArgumentMapping(entry.getValue())); 56 this.localVariables.put(entry.getKey(), new LocalVariableMapping(entry.getValue()));
58 } 57 }
59 } 58 }
60 59
@@ -77,6 +76,9 @@ public class MethodMapping implements Comparable<MethodMapping>, MemberMapping<B
77 } 76 }
78 77
79 public String getDeobfName() { 78 public String getDeobfName() {
79 if (deobfName == null) {
80 return obfName;
81 }
80 return this.deobfName; 82 return this.deobfName;
81 } 83 }
82 84
@@ -84,56 +86,56 @@ public class MethodMapping implements Comparable<MethodMapping>, MemberMapping<B
84 this.deobfName = NameValidator.validateMethodName(val); 86 this.deobfName = NameValidator.validateMethodName(val);
85 } 87 }
86 88
87 public Signature getObfSignature() { 89 public MethodDescriptor getObfDesc() {
88 return this.obfSignature; 90 return this.obfDescriptor;
89 } 91 }
90 92
91 public void setObfSignature(Signature val) { 93 public void setObfDescriptor(MethodDescriptor val) {
92 this.obfSignature = val; 94 this.obfDescriptor = val;
93 } 95 }
94 96
95 public Iterable<ArgumentMapping> arguments() { 97 public Iterable<LocalVariableMapping> arguments() {
96 return this.arguments.values(); 98 return this.localVariables.values();
97 } 99 }
98 100
99 public void addArgumentMapping(ArgumentMapping argumentMapping) throws MappingConflict { 101 public void addArgumentMapping(LocalVariableMapping localVariableMapping) throws MappingConflict {
100 if (this.arguments.containsKey(argumentMapping.getIndex())) { 102 if (this.localVariables.containsKey(localVariableMapping.getIndex())) {
101 throw new MappingConflict("argument", argumentMapping.getName(), this.arguments.get(argumentMapping.getIndex()).getName()); 103 throw new MappingConflict("argument", localVariableMapping.getName(), this.localVariables.get(localVariableMapping.getIndex()).getName());
102 } 104 }
103 this.arguments.put(argumentMapping.getIndex(), argumentMapping); 105 this.localVariables.put(localVariableMapping.getIndex(), localVariableMapping);
104 } 106 }
105 107
106 public String getObfArgumentName(int index) { 108 public String getObfLocalVariableName(int index) {
107 ArgumentMapping argumentMapping = this.arguments.get(index); 109 LocalVariableMapping localVariableMapping = this.localVariables.get(index);
108 if (argumentMapping != null) { 110 if (localVariableMapping != null) {
109 return argumentMapping.getName(); 111 return localVariableMapping.getName();
110 } 112 }
111 113
112 return null; 114 return null;
113 } 115 }
114 116
115 public String getDeobfArgumentName(int index) { 117 public String getDeobfLocalVariableName(int index) {
116 ArgumentMapping argumentMapping = this.arguments.get(index); 118 LocalVariableMapping localVariableMapping = this.localVariables.get(index);
117 if (argumentMapping != null) { 119 if (localVariableMapping != null) {
118 return argumentMapping.getName(); 120 return localVariableMapping.getName();
119 } 121 }
120 122
121 return null; 123 return null;
122 } 124 }
123 125
124 public void setArgumentName(int index, String name) { 126 public void setLocalVariableName(int index, String name) {
125 ArgumentMapping argumentMapping = this.arguments.get(index); 127 LocalVariableMapping localVariableMapping = this.localVariables.get(index);
126 if (argumentMapping == null) { 128 if (localVariableMapping == null) {
127 argumentMapping = new ArgumentMapping(index, name); 129 localVariableMapping = new LocalVariableMapping(index, name);
128 boolean wasAdded = this.arguments.put(index, argumentMapping) == null; 130 boolean wasAdded = this.localVariables.put(index, localVariableMapping) == null;
129 assert (wasAdded); 131 assert (wasAdded);
130 } else { 132 } else {
131 argumentMapping.setName(name); 133 localVariableMapping.setName(name);
132 } 134 }
133 } 135 }
134 136
135 public void removeArgumentName(int index) { 137 public void removeLocalVariableName(int index) {
136 boolean wasRemoved = this.arguments.remove(index) != null; 138 boolean wasRemoved = this.localVariables.remove(index) != null;
137 assert (wasRemoved); 139 assert (wasRemoved);
138 } 140 }
139 141
@@ -146,14 +148,14 @@ public class MethodMapping implements Comparable<MethodMapping>, MemberMapping<B
146 buf.append(this.deobfName); 148 buf.append(this.deobfName);
147 buf.append("\n"); 149 buf.append("\n");
148 buf.append("\t"); 150 buf.append("\t");
149 buf.append(this.obfSignature); 151 buf.append(this.obfDescriptor);
150 buf.append("\n"); 152 buf.append("\n");
151 buf.append("\tArguments:\n"); 153 buf.append("\tLocal Variables:\n");
152 for (ArgumentMapping argumentMapping : this.arguments.values()) { 154 for (LocalVariableMapping localVariableMapping : this.localVariables.values()) {
153 buf.append("\t\t"); 155 buf.append("\t\t");
154 buf.append(argumentMapping.getIndex()); 156 buf.append(localVariableMapping.getIndex());
155 buf.append(" -> "); 157 buf.append(" -> ");
156 buf.append(argumentMapping.getName()); 158 buf.append(localVariableMapping.getName());
157 buf.append("\n"); 159 buf.append("\n");
158 } 160 }
159 return buf.toString(); 161 return buf.toString();
@@ -161,12 +163,12 @@ public class MethodMapping implements Comparable<MethodMapping>, MemberMapping<B
161 163
162 @Override 164 @Override
163 public int compareTo(MethodMapping other) { 165 public int compareTo(MethodMapping other) {
164 return (this.obfName + this.obfSignature).compareTo(other.obfName + other.obfSignature); 166 return (this.obfName + this.obfDescriptor).compareTo(other.obfName + other.obfDescriptor);
165 } 167 }
166 168
167 public boolean containsArgument(String name) { 169 public boolean containsLocalVariable(String name) {
168 for (ArgumentMapping argumentMapping : this.arguments.values()) { 170 for (LocalVariableMapping localVariableMapping : this.localVariables.values()) {
169 if (argumentMapping.getName().equals(name)) { 171 if (localVariableMapping.getName().equals(name)) {
170 return true; 172 return true;
171 } 173 }
172 } 174 }
@@ -175,32 +177,23 @@ public class MethodMapping implements Comparable<MethodMapping>, MemberMapping<B
175 177
176 public boolean renameObfClass(final String oldObfClassName, final String newObfClassName) { 178 public boolean renameObfClass(final String oldObfClassName, final String newObfClassName) {
177 // rename obf classes in the signature 179 // rename obf classes in the signature
178 Signature newSignature = new Signature(this.obfSignature, className -> 180 MethodDescriptor newDescriptor = obfDescriptor.remap(className -> {
179 {
180 if (className.equals(oldObfClassName)) { 181 if (className.equals(oldObfClassName)) {
181 return newObfClassName; 182 return newObfClassName;
182 } 183 }
183 return null; 184 return className;
184 }); 185 });
185 186
186 if (!newSignature.equals(this.obfSignature)) { 187 if (!newDescriptor.equals(this.obfDescriptor)) {
187 this.obfSignature = newSignature; 188 this.obfDescriptor = newDescriptor;
188 return true; 189 return true;
189 } 190 }
190 return false; 191 return false;
191 } 192 }
192 193
193 public boolean isConstructor() {
194 return this.obfName.startsWith("<");
195 }
196
197 @Override 194 @Override
198 public BehaviorEntry getObfEntry(ClassEntry classEntry) { 195 public MethodEntry getObfEntry(ClassEntry classEntry) {
199 if (isConstructor()) { 196 return new MethodEntry(classEntry, this.obfName, this.obfDescriptor);
200 return new ConstructorEntry(classEntry, this.obfSignature);
201 } else {
202 return new MethodEntry(classEntry, this.obfName, this.obfSignature);
203 }
204 } 197 }
205 198
206 public Mappings.EntryModifier getModifier() { 199 public Mappings.EntryModifier getModifier() {
@@ -210,4 +203,8 @@ public class MethodMapping implements Comparable<MethodMapping>, MemberMapping<B
210 public void setModifier(Mappings.EntryModifier modifier) { 203 public void setModifier(Mappings.EntryModifier modifier) {
211 this.modifier = modifier; 204 this.modifier = modifier;
212 } 205 }
206
207 public boolean isObfuscated() {
208 return deobfName == null || deobfName.equals(obfName);
209 }
213} 210}