summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar gegy10002018-06-24 19:12:24 +0200
committerGravatar gegy10002018-06-24 19:12:24 +0200
commit81adac1706ee5f96c97cc26874ebb0d6cbb56c7f (patch)
tree3e9d8047df428354d0fe8dc3e71f14fa34fa01b9 /src
parentFix method reference and bridge detection (diff)
downloadenigma-81adac1706ee5f96c97cc26874ebb0d6cbb56c7f.tar.gz
enigma-81adac1706ee5f96c97cc26874ebb0d6cbb56c7f.tar.xz
enigma-81adac1706ee5f96c97cc26874ebb0d6cbb56c7f.zip
Fix handling of null deobf mappings
Diffstat (limited to 'src')
-rw-r--r--src/main/java/cuchaz/enigma/mapping/ClassMapping.java6
-rw-r--r--src/main/java/cuchaz/enigma/mapping/MappingsEnigmaWriter.java2
-rw-r--r--src/main/java/cuchaz/enigma/mapping/MethodMapping.java7
-rw-r--r--src/main/java/cuchaz/enigma/mapping/entry/ProcyonEntryFactory.java32
4 files changed, 15 insertions, 32 deletions
diff --git a/src/main/java/cuchaz/enigma/mapping/ClassMapping.java b/src/main/java/cuchaz/enigma/mapping/ClassMapping.java
index e5133937..1e6c3a19 100644
--- a/src/main/java/cuchaz/enigma/mapping/ClassMapping.java
+++ b/src/main/java/cuchaz/enigma/mapping/ClassMapping.java
@@ -323,7 +323,7 @@ public class ClassMapping implements Comparable<ClassMapping> {
323 } 323 }
324 boolean wasAdded = methodsByObf.put(obfKey, methodMapping) == null; 324 boolean wasAdded = methodsByObf.put(obfKey, methodMapping) == null;
325 assert (wasAdded); 325 assert (wasAdded);
326 if (methodMapping.getDeobfName() != null) { 326 if (!methodMapping.isObfuscated()) {
327 String deobfKey = getMethodKey(methodMapping.getDeobfName(), methodMapping.getObfDesc()); 327 String deobfKey = getMethodKey(methodMapping.getDeobfName(), methodMapping.getObfDesc());
328 if (methodsByDeobf.containsKey(deobfKey)) { 328 if (methodsByDeobf.containsKey(deobfKey)) {
329 throw new Error("Already have mapping for " + deobfName + "." + deobfKey); 329 throw new Error("Already have mapping for " + deobfName + "." + deobfKey);
@@ -338,7 +338,7 @@ public class ClassMapping implements Comparable<ClassMapping> {
338 public void removeMethodMapping(MethodMapping methodMapping) { 338 public void removeMethodMapping(MethodMapping methodMapping) {
339 boolean obfWasRemoved = methodsByObf.remove(getMethodKey(methodMapping.getObfName(), methodMapping.getObfDesc())) != null; 339 boolean obfWasRemoved = methodsByObf.remove(getMethodKey(methodMapping.getObfName(), methodMapping.getObfDesc())) != null;
340 assert (obfWasRemoved); 340 assert (obfWasRemoved);
341 if (methodMapping.getDeobfName() != null) { 341 if (!methodMapping.isObfuscated()) {
342 boolean deobfWasRemoved = methodsByDeobf.remove(getMethodKey(methodMapping.getDeobfName(), methodMapping.getObfDesc())) != null; 342 boolean deobfWasRemoved = methodsByDeobf.remove(getMethodKey(methodMapping.getDeobfName(), methodMapping.getObfDesc())) != null;
343 assert (deobfWasRemoved); 343 assert (deobfWasRemoved);
344 } 344 }
@@ -371,7 +371,7 @@ public class ClassMapping implements Comparable<ClassMapping> {
371 MethodMapping methodMapping = methodsByObf.get(getMethodKey(obfName, obfDescriptor)); 371 MethodMapping methodMapping = methodsByObf.get(getMethodKey(obfName, obfDescriptor));
372 if (methodMapping == null) { 372 if (methodMapping == null) {
373 methodMapping = createMethodMapping(obfName, obfDescriptor); 373 methodMapping = createMethodMapping(obfName, obfDescriptor);
374 } else if (methodMapping.getDeobfName() != null) { 374 } else if (!methodMapping.isObfuscated()) {
375 boolean wasRemoved = methodsByDeobf.remove(getMethodKey(methodMapping.getDeobfName(), methodMapping.getObfDesc())) != null; 375 boolean wasRemoved = methodsByDeobf.remove(getMethodKey(methodMapping.getDeobfName(), methodMapping.getObfDesc())) != null;
376 assert (wasRemoved); 376 assert (wasRemoved);
377 } 377 }
diff --git a/src/main/java/cuchaz/enigma/mapping/MappingsEnigmaWriter.java b/src/main/java/cuchaz/enigma/mapping/MappingsEnigmaWriter.java
index 19299778..4e29a465 100644
--- a/src/main/java/cuchaz/enigma/mapping/MappingsEnigmaWriter.java
+++ b/src/main/java/cuchaz/enigma/mapping/MappingsEnigmaWriter.java
@@ -135,7 +135,7 @@ public class MappingsEnigmaWriter {
135 } 135 }
136 136
137 private void write(PrintWriter out, MethodMapping methodMapping, int depth) throws IOException { 137 private void write(PrintWriter out, MethodMapping methodMapping, int depth) throws IOException {
138 if (methodMapping.getDeobfName() == null) { 138 if (methodMapping.isObfuscated()) {
139 out.format("%sMETHOD %s %s%s\n", getIndent(depth), methodMapping.getObfName(), methodMapping.getObfDesc(), 139 out.format("%sMETHOD %s %s%s\n", getIndent(depth), methodMapping.getObfName(), methodMapping.getObfDesc(),
140 methodMapping.getModifier() == Mappings.EntryModifier.UNCHANGED ? "" : methodMapping.getModifier().getFormattedName()); 140 methodMapping.getModifier() == Mappings.EntryModifier.UNCHANGED ? "" : methodMapping.getModifier().getFormattedName());
141 } else { 141 } else {
diff --git a/src/main/java/cuchaz/enigma/mapping/MethodMapping.java b/src/main/java/cuchaz/enigma/mapping/MethodMapping.java
index 363bab80..2f10144e 100644
--- a/src/main/java/cuchaz/enigma/mapping/MethodMapping.java
+++ b/src/main/java/cuchaz/enigma/mapping/MethodMapping.java
@@ -76,6 +76,9 @@ public class MethodMapping implements Comparable<MethodMapping>, MemberMapping<M
76 } 76 }
77 77
78 public String getDeobfName() { 78 public String getDeobfName() {
79 if (deobfName == null) {
80 return obfName;
81 }
79 return this.deobfName; 82 return this.deobfName;
80 } 83 }
81 84
@@ -200,4 +203,8 @@ public class MethodMapping implements Comparable<MethodMapping>, MemberMapping<M
200 public void setModifier(Mappings.EntryModifier modifier) { 203 public void setModifier(Mappings.EntryModifier modifier) {
201 this.modifier = modifier; 204 this.modifier = modifier;
202 } 205 }
206
207 public boolean isObfuscated() {
208 return deobfName == null || deobfName.equals(obfName);
209 }
203} 210}
diff --git a/src/main/java/cuchaz/enigma/mapping/entry/ProcyonEntryFactory.java b/src/main/java/cuchaz/enigma/mapping/entry/ProcyonEntryFactory.java
index 5892a03e..73770c53 100644
--- a/src/main/java/cuchaz/enigma/mapping/entry/ProcyonEntryFactory.java
+++ b/src/main/java/cuchaz/enigma/mapping/entry/ProcyonEntryFactory.java
@@ -11,14 +11,14 @@
11 11
12package cuchaz.enigma.mapping.entry; 12package cuchaz.enigma.mapping.entry;
13 13
14import com.strobel.assembler.metadata.*; 14import com.strobel.assembler.metadata.FieldDefinition;
15import com.strobel.assembler.metadata.MemberReference;
16import com.strobel.assembler.metadata.MethodDefinition;
15import cuchaz.enigma.bytecode.AccessFlags; 17import cuchaz.enigma.bytecode.AccessFlags;
16import cuchaz.enigma.mapping.MethodDescriptor; 18import cuchaz.enigma.mapping.MethodDescriptor;
17import cuchaz.enigma.mapping.Signature; 19import cuchaz.enigma.mapping.Signature;
18import cuchaz.enigma.mapping.TypeDescriptor; 20import cuchaz.enigma.mapping.TypeDescriptor;
19 21
20import java.util.List;
21
22public class ProcyonEntryFactory { 22public class ProcyonEntryFactory {
23 private final ReferencedEntryPool entryPool; 23 private final ReferencedEntryPool entryPool;
24 24
@@ -26,30 +26,6 @@ public class ProcyonEntryFactory {
26 this.entryPool = entryPool; 26 this.entryPool = entryPool;
27 } 27 }
28 28
29 private String getErasedSignature(MemberReference def) {
30 if (!(def instanceof MethodReference))
31 return def.getErasedSignature();
32 MethodReference methodReference = (MethodReference) def;
33 StringBuilder builder = new StringBuilder("(");
34 for (ParameterDefinition param : methodReference.getParameters()) {
35 TypeReference paramType = param.getParameterType();
36 if (paramType.getErasedSignature().equals("Ljava/lang/Object;") && paramType.hasExtendsBound() && paramType.getExtendsBound() instanceof CompoundTypeReference) {
37 List<TypeReference> interfaces = ((CompoundTypeReference) paramType.getExtendsBound()).getInterfaces();
38 interfaces.forEach((inter) -> builder.append(inter.getErasedSignature()));
39 } else
40 builder.append(paramType.getErasedSignature());
41 }
42 builder.append(")");
43
44 TypeReference returnType = methodReference.getReturnType();
45 if (returnType.getErasedSignature().equals("Ljava/lang/Object;") && returnType.hasExtendsBound() && returnType.getExtendsBound() instanceof CompoundTypeReference) {
46 List<TypeReference> interfaces = ((CompoundTypeReference) returnType.getExtendsBound()).getInterfaces();
47 interfaces.forEach((inter) -> builder.append(inter.getErasedSignature()));
48 } else
49 builder.append(returnType.getErasedSignature());
50 return builder.toString();
51 }
52
53 public FieldEntry getFieldEntry(MemberReference def) { 29 public FieldEntry getFieldEntry(MemberReference def) {
54 ClassEntry classEntry = entryPool.getClass(def.getDeclaringType().getInternalName()); 30 ClassEntry classEntry = entryPool.getClass(def.getDeclaringType().getInternalName());
55 return entryPool.getField(classEntry, def.getName(), def.getErasedSignature()); 31 return entryPool.getField(classEntry, def.getName(), def.getErasedSignature());
@@ -62,7 +38,7 @@ public class ProcyonEntryFactory {
62 38
63 public MethodEntry getMethodEntry(MemberReference def) { 39 public MethodEntry getMethodEntry(MemberReference def) {
64 ClassEntry classEntry = entryPool.getClass(def.getDeclaringType().getInternalName()); 40 ClassEntry classEntry = entryPool.getClass(def.getDeclaringType().getInternalName());
65 return entryPool.getMethod(classEntry, def.getName(), getErasedSignature(def)); 41 return entryPool.getMethod(classEntry, def.getName(), def.getErasedSignature());
66 } 42 }
67 43
68 public MethodDefEntry getMethodDefEntry(MethodDefinition def) { 44 public MethodDefEntry getMethodDefEntry(MethodDefinition def) {