From 4438a04996887882f72f228fe51ff59f27611e55 Mon Sep 17 00:00:00 2001 From: asie Date: Tue, 27 Nov 2018 23:35:26 +0100 Subject: do not propagate non-argument local variable names --- src/main/java/cuchaz/enigma/analysis/EntryRenamer.java | 5 +++-- .../cuchaz/enigma/analysis/SourceIndexMethodVisitor.java | 4 ++-- .../bytecode/translators/TranslationMethodVisitor.java | 2 +- .../java/cuchaz/enigma/mapping/DirectionalTranslator.java | 4 ++-- .../java/cuchaz/enigma/mapping/LocalVariableMapping.java | 5 +++++ src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java | 6 +++++- .../cuchaz/enigma/mapping/entry/LocalVariableDefEntry.java | 8 ++++++-- .../cuchaz/enigma/mapping/entry/LocalVariableEntry.java | 13 ++++++++++++- 8 files changed, 36 insertions(+), 11 deletions(-) (limited to 'src/main/java/cuchaz') diff --git a/src/main/java/cuchaz/enigma/analysis/EntryRenamer.java b/src/main/java/cuchaz/enigma/analysis/EntryRenamer.java index 9be8378..c474d68 100644 --- a/src/main/java/cuchaz/enigma/analysis/EntryRenamer.java +++ b/src/main/java/cuchaz/enigma/analysis/EntryRenamer.java @@ -99,7 +99,8 @@ public class EntryRenamer { return (T) new LocalVariableEntry( renameMethodsInThing(renames, variableEntry.getOwnerEntry()), variableEntry.getIndex(), - variableEntry.getName() + variableEntry.getName(), + variableEntry.isParameter() ); } else if (thing instanceof EntryReference) { EntryReference reference = (EntryReference) thing; @@ -147,7 +148,7 @@ public class EntryRenamer { ); } else if (thing instanceof LocalVariableEntry) { LocalVariableEntry argumentEntry = (LocalVariableEntry) thing; - return (T) new LocalVariableEntry(renameClassesInThing(renames, argumentEntry.getOwnerEntry()), argumentEntry.getIndex(), argumentEntry.getName()); + return (T) new LocalVariableEntry(renameClassesInThing(renames, argumentEntry.getOwnerEntry()), argumentEntry.getIndex(), argumentEntry.getName(), argumentEntry.isParameter()); } else if (thing instanceof EntryReference) { EntryReference reference = (EntryReference) thing; reference.entry = renameClassesInThing(renames, reference.entry); diff --git a/src/main/java/cuchaz/enigma/analysis/SourceIndexMethodVisitor.java b/src/main/java/cuchaz/enigma/analysis/SourceIndexMethodVisitor.java index 45f7a0e..139fcea 100644 --- a/src/main/java/cuchaz/enigma/analysis/SourceIndexMethodVisitor.java +++ b/src/main/java/cuchaz/enigma/analysis/SourceIndexMethodVisitor.java @@ -111,7 +111,7 @@ public class SourceIndexMethodVisitor extends SourceIndexVisitor { int parameterIndex = def.getSlot(); if (parameterIndex >= 0) { - LocalVariableEntry localVariableEntry = new LocalVariableEntry(methodEntry, parameterIndex, node.getName()); + LocalVariableEntry localVariableEntry = new LocalVariableEntry(methodEntry, parameterIndex, node.getName(), true); Identifier identifier = node.getNameToken(); // cache the argument entry and the identifier identifierEntryCache.put(identifier.getName(), localVariableEntry); @@ -184,7 +184,7 @@ public class SourceIndexMethodVisitor extends SourceIndexVisitor { if (originalVariable != null) { int variableIndex = originalVariable.getSlot(); if (variableIndex >= 0) { - LocalVariableEntry localVariableEntry = new LocalVariableEntry(methodEntry, variableIndex, initializer.getName()); + LocalVariableEntry localVariableEntry = new LocalVariableEntry(methodEntry, variableIndex, initializer.getName(), false); identifierEntryCache.put(identifier.getName(), localVariableEntry); addDeclarationToUnmatched(identifier.getName(), index); index.addDeclaration(identifier, localVariableEntry); diff --git a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java index 4885470..0064153 100644 --- a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java +++ b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java @@ -150,7 +150,7 @@ public class TranslationMethodVisitor extends MethodVisitor { int offset = 0; for (int index = 0; index < arguments.size(); index++) { - LocalVariableEntry entry = new LocalVariableEntry(methodEntry, offset, ""); + LocalVariableEntry entry = new LocalVariableEntry(methodEntry, offset, "", true); LocalVariableEntry translatedEntry = translator.getTranslatedVariable(entry); String translatedName = translatedEntry.getName(); if (translatedName.equals(entry.getName())) { diff --git a/src/main/java/cuchaz/enigma/mapping/DirectionalTranslator.java b/src/main/java/cuchaz/enigma/mapping/DirectionalTranslator.java index b0bb129..99a6315 100644 --- a/src/main/java/cuchaz/enigma/mapping/DirectionalTranslator.java +++ b/src/main/java/cuchaz/enigma/mapping/DirectionalTranslator.java @@ -203,7 +203,7 @@ public class DirectionalTranslator implements Translator { } // TODO: Translating arguments calls method translation.. Can we refactor the code in such a way that we don't need this? MethodEntry translatedOwner = getTranslatedMethod(entry.getOwnerEntry()); - return new LocalVariableEntry(translatedOwner, entry.getIndex(), translatedArgumentName); + return new LocalVariableEntry(translatedOwner, entry.getIndex(), translatedArgumentName, entry.isParameter()); } @Override @@ -215,7 +215,7 @@ public class DirectionalTranslator implements Translator { // TODO: Translating arguments calls method translation.. Can we refactor the code in such a way that we don't need this? MethodDefEntry translatedOwner = getTranslatedMethodDef(entry.getOwnerEntry()); TypeDescriptor translatedTypeDesc = getTranslatedTypeDesc(entry.getDesc()); - return new LocalVariableDefEntry(translatedOwner, entry.getIndex(), translatedArgumentName != null ? translatedArgumentName : entry.getName(), translatedTypeDesc); + return new LocalVariableDefEntry(translatedOwner, entry.getIndex(), translatedArgumentName != null ? translatedArgumentName : entry.getName(), entry.isParameter(), translatedTypeDesc); } @Override diff --git a/src/main/java/cuchaz/enigma/mapping/LocalVariableMapping.java b/src/main/java/cuchaz/enigma/mapping/LocalVariableMapping.java index 62dbcf3..bfe66b2 100644 --- a/src/main/java/cuchaz/enigma/mapping/LocalVariableMapping.java +++ b/src/main/java/cuchaz/enigma/mapping/LocalVariableMapping.java @@ -42,10 +42,15 @@ public class LocalVariableMapping implements Comparable { this.name = NameValidator.validateArgumentName(val); } + @Deprecated public LocalVariableEntry getObfEntry(MethodEntry methodEntry) { return new LocalVariableEntry(methodEntry, index, name); } + public LocalVariableEntry getObfEntry(MethodEntry methodEntry, boolean parameter) { + return new LocalVariableEntry(methodEntry, index, name, parameter); + } + @Override public int compareTo(LocalVariableMapping other) { return Integer.compare(this.index, other.index); diff --git a/src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java b/src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java index 85b6d2a..72a12c2 100644 --- a/src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java +++ b/src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java @@ -197,6 +197,10 @@ public class MappingsRenamer { public void setLocalVariableTreeName(LocalVariableEntry obf, String deobfName) { MethodEntry obfMethod = obf.getOwnerEntry(); + if (!obf.isParameter()) { + setLocalVariableName(obf, deobfName); + return; + } Set implementations = index.getRelatedMethodImplementations(obfMethod); for (MethodEntry entry : implementations) { @@ -219,7 +223,7 @@ public class MappingsRenamer { } for (MethodEntry entry : implementations) { - setLocalVariableName(new LocalVariableEntry(entry, obf.getIndex(), obf.getName()), deobfName); + setLocalVariableName(new LocalVariableEntry(entry, obf.getIndex(), obf.getName(), obf.isParameter()), deobfName); } } diff --git a/src/main/java/cuchaz/enigma/mapping/entry/LocalVariableDefEntry.java b/src/main/java/cuchaz/enigma/mapping/entry/LocalVariableDefEntry.java index 7742272..d186664 100644 --- a/src/main/java/cuchaz/enigma/mapping/entry/LocalVariableDefEntry.java +++ b/src/main/java/cuchaz/enigma/mapping/entry/LocalVariableDefEntry.java @@ -15,7 +15,11 @@ public class LocalVariableDefEntry extends LocalVariableEntry { protected final TypeDescriptor desc; public LocalVariableDefEntry(MethodDefEntry ownerEntry, int index, String name, TypeDescriptor desc) { - super(ownerEntry, index, name); + this(ownerEntry, index, name, true, desc); + } + + public LocalVariableDefEntry(MethodDefEntry ownerEntry, int index, String name, boolean parameter, TypeDescriptor desc) { + super(ownerEntry, index, name, parameter); Preconditions.checkNotNull(desc, "Variable desc cannot be null"); this.ownerEntry = ownerEntry; @@ -33,7 +37,7 @@ public class LocalVariableDefEntry extends LocalVariableEntry { @Override public LocalVariableDefEntry updateOwnership(ClassEntry classEntry) { - return new LocalVariableDefEntry(ownerEntry.updateOwnership(classEntry), index, name, desc); + return new LocalVariableDefEntry(ownerEntry.updateOwnership(classEntry), index, name, parameter, desc); } @Override diff --git a/src/main/java/cuchaz/enigma/mapping/entry/LocalVariableEntry.java b/src/main/java/cuchaz/enigma/mapping/entry/LocalVariableEntry.java index a794d0a..3507b25 100644 --- a/src/main/java/cuchaz/enigma/mapping/entry/LocalVariableEntry.java +++ b/src/main/java/cuchaz/enigma/mapping/entry/LocalVariableEntry.java @@ -14,8 +14,14 @@ public class LocalVariableEntry implements Entry { protected final MethodEntry ownerEntry; protected final String name; protected final int index; + protected final boolean parameter; + @Deprecated public LocalVariableEntry(MethodEntry ownerEntry, int index, String name) { + this(ownerEntry, index, name, true); + } + + public LocalVariableEntry(MethodEntry ownerEntry, int index, String name, boolean parameter) { Preconditions.checkNotNull(ownerEntry, "Variable owner cannot be null"); Preconditions.checkNotNull(name, "Variable name cannot be null"); Preconditions.checkArgument(index >= 0, "Index must be positive"); @@ -23,6 +29,11 @@ public class LocalVariableEntry implements Entry { this.ownerEntry = ownerEntry; this.name = name; this.index = index; + this.parameter = parameter; + } + + public boolean isParameter() { + return this.parameter; } public MethodEntry getOwnerEntry() { @@ -50,7 +61,7 @@ public class LocalVariableEntry implements Entry { @Override public LocalVariableEntry updateOwnership(ClassEntry classEntry) { - return new LocalVariableEntry(ownerEntry.updateOwnership(classEntry), index, name); + return new LocalVariableEntry(ownerEntry.updateOwnership(classEntry), index, name, parameter); } public String getMethodName() { -- cgit v1.2.3