diff options
| author | 2014-09-01 22:52:07 -0400 | |
|---|---|---|
| committer | 2014-09-01 22:52:07 -0400 | |
| commit | 360bbd1c2fca8cbd575907b7d930a8072fccb0c2 (patch) | |
| tree | 93d0f3c4a0901411427df580c5ddb75cf27440f1 /src/cuchaz/enigma/mapping | |
| parent | added copyright notice (diff) | |
| download | enigma-fork-360bbd1c2fca8cbd575907b7d930a8072fccb0c2.tar.gz enigma-fork-360bbd1c2fca8cbd575907b7d930a8072fccb0c2.tar.xz enigma-fork-360bbd1c2fca8cbd575907b7d930a8072fccb0c2.zip | |
refactored jar,translation index. fixed bug with field renaming when fields are shadowed by subclasses
Diffstat (limited to 'src/cuchaz/enigma/mapping')
| -rw-r--r-- | src/cuchaz/enigma/mapping/Mappings.java | 22 | ||||
| -rw-r--r-- | src/cuchaz/enigma/mapping/MappingsRenamer.java (renamed from src/cuchaz/enigma/mapping/Renamer.java) | 22 | ||||
| -rw-r--r-- | src/cuchaz/enigma/mapping/Translator.java | 21 |
3 files changed, 45 insertions, 20 deletions
diff --git a/src/cuchaz/enigma/mapping/Mappings.java b/src/cuchaz/enigma/mapping/Mappings.java index 378d4c0..f52094f 100644 --- a/src/cuchaz/enigma/mapping/Mappings.java +++ b/src/cuchaz/enigma/mapping/Mappings.java | |||
| @@ -24,8 +24,7 @@ import com.beust.jcommander.internal.Sets; | |||
| 24 | import com.google.common.collect.Maps; | 24 | import com.google.common.collect.Maps; |
| 25 | 25 | ||
| 26 | import cuchaz.enigma.Util; | 26 | import cuchaz.enigma.Util; |
| 27 | import cuchaz.enigma.analysis.Ancestries; | 27 | import cuchaz.enigma.analysis.TranslationIndex; |
| 28 | import cuchaz.enigma.analysis.DeobfuscatedAncestries; | ||
| 29 | import cuchaz.enigma.mapping.SignatureUpdater.ClassNameUpdater; | 28 | import cuchaz.enigma.mapping.SignatureUpdater.ClassNameUpdater; |
| 30 | 29 | ||
| 31 | public class Mappings implements Serializable | 30 | public class Mappings implements Serializable |
| @@ -108,12 +107,27 @@ public class Mappings implements Serializable | |||
| 108 | return m_classesByDeobf.get( deobfName ); | 107 | return m_classesByDeobf.get( deobfName ); |
| 109 | } | 108 | } |
| 110 | 109 | ||
| 111 | public Translator getTranslator( Ancestries ancestries, TranslationDirection direction ) | 110 | public Translator getTranslator( TranslationIndex index, TranslationDirection direction ) |
| 112 | { | 111 | { |
| 112 | if( direction == TranslationDirection.Obfuscating ) | ||
| 113 | { | ||
| 114 | // deobfuscate the index | ||
| 115 | index = new TranslationIndex( index ); | ||
| 116 | Map<String,String> renames = Maps.newHashMap(); | ||
| 117 | for( ClassMapping classMapping : classes() ) | ||
| 118 | { | ||
| 119 | renames.put( classMapping.getObfName(), classMapping.getDeobfName() ); | ||
| 120 | for( ClassMapping innerClassMapping : classMapping.innerClasses() ) | ||
| 121 | { | ||
| 122 | renames.put( innerClassMapping.getObfName(), innerClassMapping.getDeobfName() ); | ||
| 123 | } | ||
| 124 | } | ||
| 125 | index.renameClasses( renames ); | ||
| 126 | } | ||
| 113 | return new Translator( | 127 | return new Translator( |
| 114 | direction, | 128 | direction, |
| 115 | direction.choose( m_classesByObf, m_classesByDeobf ), | 129 | direction.choose( m_classesByObf, m_classesByDeobf ), |
| 116 | direction.choose( ancestries, new DeobfuscatedAncestries( ancestries, m_classesByObf, m_classesByDeobf ) ) | 130 | index |
| 117 | ); | 131 | ); |
| 118 | } | 132 | } |
| 119 | 133 | ||
diff --git a/src/cuchaz/enigma/mapping/Renamer.java b/src/cuchaz/enigma/mapping/MappingsRenamer.java index 15d9af4..9d036d8 100644 --- a/src/cuchaz/enigma/mapping/Renamer.java +++ b/src/cuchaz/enigma/mapping/MappingsRenamer.java | |||
| @@ -18,12 +18,12 @@ import java.util.zip.GZIPOutputStream; | |||
| 18 | 18 | ||
| 19 | import cuchaz.enigma.analysis.JarIndex; | 19 | import cuchaz.enigma.analysis.JarIndex; |
| 20 | 20 | ||
| 21 | public class Renamer | 21 | public class MappingsRenamer |
| 22 | { | 22 | { |
| 23 | private JarIndex m_index; | 23 | private JarIndex m_index; |
| 24 | private Mappings m_mappings; | 24 | private Mappings m_mappings; |
| 25 | 25 | ||
| 26 | public Renamer( JarIndex index, Mappings mappings ) | 26 | public MappingsRenamer( JarIndex index, Mappings mappings ) |
| 27 | { | 27 | { |
| 28 | m_index = index; | 28 | m_index = index; |
| 29 | m_mappings = mappings; | 29 | m_mappings = mappings; |
| @@ -77,8 +77,8 @@ public class Renamer | |||
| 77 | MethodEntry targetEntry = new MethodEntry( entry.getClassEntry(), deobfName, entry.getSignature() ); | 77 | MethodEntry targetEntry = new MethodEntry( entry.getClassEntry(), deobfName, entry.getSignature() ); |
| 78 | if( m_mappings.containsDeobfMethod( entry.getClassEntry(), deobfName, entry.getSignature() ) || m_index.containsObfMethod( targetEntry ) ) | 78 | if( m_mappings.containsDeobfMethod( entry.getClassEntry(), deobfName, entry.getSignature() ) || m_index.containsObfMethod( targetEntry ) ) |
| 79 | { | 79 | { |
| 80 | String className = m_mappings.getTranslator( m_index.getAncestries(), TranslationDirection.Deobfuscating ).translateClass( entry.getClassName() ); | 80 | String deobfClassName = getTranslator( TranslationDirection.Deobfuscating ).translateClass( entry.getClassName() ); |
| 81 | throw new IllegalNameException( deobfName, "There is already a method with that name and signature in class " + className ); | 81 | throw new IllegalNameException( deobfName, "There is already a method with that name and signature in class " + deobfClassName ); |
| 82 | } | 82 | } |
| 83 | } | 83 | } |
| 84 | 84 | ||
| @@ -94,12 +94,12 @@ public class Renamer | |||
| 94 | MethodEntry targetEntry = new MethodEntry( obf.getClassEntry(), deobfName, obf.getSignature() ); | 94 | MethodEntry targetEntry = new MethodEntry( obf.getClassEntry(), deobfName, obf.getSignature() ); |
| 95 | if( m_mappings.containsDeobfMethod( obf.getClassEntry(), deobfName, obf.getSignature() ) || m_index.containsObfMethod( targetEntry ) ) | 95 | if( m_mappings.containsDeobfMethod( obf.getClassEntry(), deobfName, obf.getSignature() ) || m_index.containsObfMethod( targetEntry ) ) |
| 96 | { | 96 | { |
| 97 | String className = m_mappings.getTranslator( m_index.getAncestries(), TranslationDirection.Deobfuscating ).translateClass( obf.getClassName() ); | 97 | String deobfClassName = getTranslator( TranslationDirection.Deobfuscating ).translateClass( obf.getClassName() ); |
| 98 | throw new IllegalNameException( deobfName, "There is already a method with that name and signature in class " + className ); | 98 | throw new IllegalNameException( deobfName, "There is already a method with that name and signature in class " + deobfClassName ); |
| 99 | } | 99 | } |
| 100 | 100 | ||
| 101 | ClassMapping classMapping = getOrCreateClassMappingOrInnerClassMapping( obf.getClassEntry() ); | 101 | ClassMapping classMapping = getOrCreateClassMappingOrInnerClassMapping( obf.getClassEntry() ); |
| 102 | String deobfSignature = m_mappings.getTranslator( m_index.getAncestries(), TranslationDirection.Deobfuscating ).translateSignature( obf.getSignature() ); | 102 | String deobfSignature = getTranslator( TranslationDirection.Deobfuscating ).translateSignature( obf.getSignature() ); |
| 103 | classMapping.setMethodNameAndSignature( obf.getName(), obf.getSignature(), deobfName, deobfSignature ); | 103 | classMapping.setMethodNameAndSignature( obf.getName(), obf.getSignature(), deobfName, deobfSignature ); |
| 104 | } | 104 | } |
| 105 | 105 | ||
| @@ -151,10 +151,14 @@ public class Renamer | |||
| 151 | 151 | ||
| 152 | private void updateDeobfMethodSignatures( ) | 152 | private void updateDeobfMethodSignatures( ) |
| 153 | { | 153 | { |
| 154 | Translator translator = m_mappings.getTranslator( m_index.getAncestries(), TranslationDirection.Deobfuscating ); | ||
| 155 | for( ClassMapping classMapping : m_mappings.m_classesByObf.values() ) | 154 | for( ClassMapping classMapping : m_mappings.m_classesByObf.values() ) |
| 156 | { | 155 | { |
| 157 | classMapping.updateDeobfMethodSignatures( translator ); | 156 | classMapping.updateDeobfMethodSignatures( getTranslator( TranslationDirection.Deobfuscating ) ); |
| 158 | } | 157 | } |
| 159 | } | 158 | } |
| 159 | |||
| 160 | private Translator getTranslator( TranslationDirection direction ) | ||
| 161 | { | ||
| 162 | return m_mappings.getTranslator( m_index.getTranslationIndex(), direction ); | ||
| 163 | } | ||
| 160 | } | 164 | } |
diff --git a/src/cuchaz/enigma/mapping/Translator.java b/src/cuchaz/enigma/mapping/Translator.java index 23bf095..f5aafdd 100644 --- a/src/cuchaz/enigma/mapping/Translator.java +++ b/src/cuchaz/enigma/mapping/Translator.java | |||
| @@ -16,27 +16,27 @@ import java.util.Map; | |||
| 16 | 16 | ||
| 17 | import com.beust.jcommander.internal.Maps; | 17 | import com.beust.jcommander.internal.Maps; |
| 18 | 18 | ||
| 19 | import cuchaz.enigma.analysis.Ancestries; | 19 | import cuchaz.enigma.analysis.TranslationIndex; |
| 20 | import cuchaz.enigma.mapping.SignatureUpdater.ClassNameUpdater; | 20 | import cuchaz.enigma.mapping.SignatureUpdater.ClassNameUpdater; |
| 21 | 21 | ||
| 22 | public class Translator | 22 | public class Translator |
| 23 | { | 23 | { |
| 24 | private TranslationDirection m_direction; | 24 | private TranslationDirection m_direction; |
| 25 | public Map<String,ClassMapping> m_classes; | 25 | private Map<String,ClassMapping> m_classes; |
| 26 | private Ancestries m_ancestries; | 26 | private TranslationIndex m_index; |
| 27 | 27 | ||
| 28 | public Translator( ) | 28 | public Translator( ) |
| 29 | { | 29 | { |
| 30 | m_direction = null; | 30 | m_direction = null; |
| 31 | m_classes = Maps.newHashMap(); | 31 | m_classes = Maps.newHashMap(); |
| 32 | m_ancestries = new Ancestries(); | 32 | m_index = new TranslationIndex(); |
| 33 | } | 33 | } |
| 34 | 34 | ||
| 35 | protected Translator( TranslationDirection direction, Map<String,ClassMapping> classes, Ancestries ancestries ) | 35 | public Translator( TranslationDirection direction, Map<String,ClassMapping> classes, TranslationIndex index ) |
| 36 | { | 36 | { |
| 37 | m_direction = direction; | 37 | m_direction = direction; |
| 38 | m_classes = classes; | 38 | m_classes = classes; |
| 39 | m_ancestries = ancestries; | 39 | m_index = index; |
| 40 | } | 40 | } |
| 41 | 41 | ||
| 42 | @SuppressWarnings( "unchecked" ) | 42 | @SuppressWarnings( "unchecked" ) |
| @@ -145,6 +145,13 @@ public class Translator | |||
| 145 | return translatedName; | 145 | return translatedName; |
| 146 | } | 146 | } |
| 147 | } | 147 | } |
| 148 | |||
| 149 | // is the field implemented in this class? | ||
| 150 | if( m_index.containsField( className, in.getName() ) ) | ||
| 151 | { | ||
| 152 | // stop traversing the superclass chain | ||
| 153 | break; | ||
| 154 | } | ||
| 148 | } | 155 | } |
| 149 | return null; | 156 | return null; |
| 150 | } | 157 | } |
| @@ -291,7 +298,7 @@ public class Translator | |||
| 291 | { | 298 | { |
| 292 | List<String> ancestry = new ArrayList<String>(); | 299 | List<String> ancestry = new ArrayList<String>(); |
| 293 | ancestry.add( className ); | 300 | ancestry.add( className ); |
| 294 | ancestry.addAll( m_ancestries.getAncestry( className ) ); | 301 | ancestry.addAll( m_index.getAncestry( className ) ); |
| 295 | return ancestry; | 302 | return ancestry; |
| 296 | } | 303 | } |
| 297 | 304 | ||