diff options
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 | ||
| 12 | package cuchaz.enigma.mapping.entry; | 12 | package cuchaz.enigma.mapping.entry; |
| 13 | 13 | ||
| 14 | import com.strobel.assembler.metadata.*; | 14 | import com.strobel.assembler.metadata.FieldDefinition; |
| 15 | import com.strobel.assembler.metadata.MemberReference; | ||
| 16 | import com.strobel.assembler.metadata.MethodDefinition; | ||
| 15 | import cuchaz.enigma.bytecode.AccessFlags; | 17 | import cuchaz.enigma.bytecode.AccessFlags; |
| 16 | import cuchaz.enigma.mapping.MethodDescriptor; | 18 | import cuchaz.enigma.mapping.MethodDescriptor; |
| 17 | import cuchaz.enigma.mapping.Signature; | 19 | import cuchaz.enigma.mapping.Signature; |
| 18 | import cuchaz.enigma.mapping.TypeDescriptor; | 20 | import cuchaz.enigma.mapping.TypeDescriptor; |
| 19 | 21 | ||
| 20 | import java.util.List; | ||
| 21 | |||
| 22 | public class ProcyonEntryFactory { | 22 | public 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) { |