summaryrefslogtreecommitdiff
path: root/src/cuchaz
diff options
context:
space:
mode:
authorGravatar jeff2014-08-31 22:43:13 -0400
committerGravatar jeff2014-08-31 22:43:13 -0400
commit195ffb47a68c4b40d8cc04b67e6c49d8081dc3d3 (patch)
tree4633bdb8f67efc9d1d3a4749ffff4f972481c608 /src/cuchaz
parentfixed crash finding related method implementations when method doesn't implem... (diff)
downloadenigma-195ffb47a68c4b40d8cc04b67e6c49d8081dc3d3.tar.gz
enigma-195ffb47a68c4b40d8cc04b67e6c49d8081dc3d3.tar.xz
enigma-195ffb47a68c4b40d8cc04b67e6c49d8081dc3d3.zip
added checks to prevent renaming classes/fields/methods/arguments to the same name as other classes/fields/methods/arguments
Diffstat (limited to 'src/cuchaz')
-rw-r--r--src/cuchaz/enigma/analysis/JarIndex.java15
-rw-r--r--src/cuchaz/enigma/mapping/ClassMapping.java20
-rw-r--r--src/cuchaz/enigma/mapping/Mappings.java35
-rw-r--r--src/cuchaz/enigma/mapping/MethodMapping.java12
-rw-r--r--src/cuchaz/enigma/mapping/Renamer.java41
5 files changed, 122 insertions, 1 deletions
diff --git a/src/cuchaz/enigma/analysis/JarIndex.java b/src/cuchaz/enigma/analysis/JarIndex.java
index fc19e7bc..e7c92bea 100644
--- a/src/cuchaz/enigma/analysis/JarIndex.java
+++ b/src/cuchaz/enigma/analysis/JarIndex.java
@@ -891,4 +891,19 @@ public class JarIndex
891 } 891 }
892 return thing; 892 return thing;
893 } 893 }
894
895 public boolean containsObfClass( ClassEntry obfClassEntry )
896 {
897 return m_obfClassEntries.contains( obfClassEntry );
898 }
899
900 public boolean containsObfField( FieldEntry obfFieldEntry )
901 {
902 return m_access.containsKey( obfFieldEntry );
903 }
904
905 public boolean containsObfMethod( MethodEntry obfMethodEntry )
906 {
907 return m_access.containsKey( obfMethodEntry );
908 }
894} 909}
diff --git a/src/cuchaz/enigma/mapping/ClassMapping.java b/src/cuchaz/enigma/mapping/ClassMapping.java
index 1219e7ca..5faaf2a1 100644
--- a/src/cuchaz/enigma/mapping/ClassMapping.java
+++ b/src/cuchaz/enigma/mapping/ClassMapping.java
@@ -334,4 +334,24 @@ public class ClassMapping implements Serializable, Comparable<ClassMapping>
334 } 334 }
335 return false; 335 return false;
336 } 336 }
337
338 public boolean containsDeobfField( String name )
339 {
340 return m_fieldsByDeobf.containsKey( name );
341 }
342
343 public boolean containsDeobfMethod( String name, String signature )
344 {
345 return m_methodsByDeobf.containsKey( getMethodKey( name, signature ) );
346 }
347
348 public boolean containsArgument( MethodEntry obfMethodEntry, String name )
349 {
350 MethodMapping methodMapping = m_methodsByObf.get( getMethodKey( obfMethodEntry.getName(), obfMethodEntry.getSignature() ) );
351 if( methodMapping != null )
352 {
353 return methodMapping.containsArgument( name );
354 }
355 return false;
356 }
337} 357}
diff --git a/src/cuchaz/enigma/mapping/Mappings.java b/src/cuchaz/enigma/mapping/Mappings.java
index 0b03abb0..378d4c0a 100644
--- a/src/cuchaz/enigma/mapping/Mappings.java
+++ b/src/cuchaz/enigma/mapping/Mappings.java
@@ -179,4 +179,39 @@ public class Mappings implements Serializable
179 } 179 }
180 return classNames; 180 return classNames;
181 } 181 }
182
183 public boolean containsDeobfClass( String deobfName )
184 {
185 return m_classesByDeobf.containsKey( deobfName );
186 }
187
188 public boolean containsDeobfField( ClassEntry obfClassEntry, String deobfName )
189 {
190 ClassMapping classMapping = m_classesByObf.get( obfClassEntry.getName() );
191 if( classMapping != null )
192 {
193 return classMapping.containsDeobfField( deobfName );
194 }
195 return false;
196 }
197
198 public boolean containsDeobfMethod( ClassEntry obfClassEntry, String deobfName, String deobfSignature )
199 {
200 ClassMapping classMapping = m_classesByObf.get( obfClassEntry.getName() );
201 if( classMapping != null )
202 {
203 return classMapping.containsDeobfMethod( deobfName, deobfSignature );
204 }
205 return false;
206 }
207
208 public boolean containsArgument( MethodEntry obfMethodEntry, String name )
209 {
210 ClassMapping classMapping = m_classesByObf.get( obfMethodEntry.getClassName() );
211 if( classMapping != null )
212 {
213 return classMapping.containsArgument( obfMethodEntry, name );
214 }
215 return false;
216 }
182} 217}
diff --git a/src/cuchaz/enigma/mapping/MethodMapping.java b/src/cuchaz/enigma/mapping/MethodMapping.java
index b0f7ba84..bf83bd21 100644
--- a/src/cuchaz/enigma/mapping/MethodMapping.java
+++ b/src/cuchaz/enigma/mapping/MethodMapping.java
@@ -165,4 +165,16 @@ public class MethodMapping implements Serializable, Comparable<MethodMapping>
165 } 165 }
166 return false; 166 return false;
167 } 167 }
168
169 public boolean containsArgument( String name )
170 {
171 for( ArgumentMapping argumentMapping : m_arguments.values() )
172 {
173 if( argumentMapping.getName().equals( name ) )
174 {
175 return true;
176 }
177 }
178 return false;
179 }
168} 180}
diff --git a/src/cuchaz/enigma/mapping/Renamer.java b/src/cuchaz/enigma/mapping/Renamer.java
index 79cbd30d..15d9af4d 100644
--- a/src/cuchaz/enigma/mapping/Renamer.java
+++ b/src/cuchaz/enigma/mapping/Renamer.java
@@ -13,6 +13,7 @@ package cuchaz.enigma.mapping;
13import java.io.IOException; 13import java.io.IOException;
14import java.io.ObjectOutputStream; 14import java.io.ObjectOutputStream;
15import java.io.OutputStream; 15import java.io.OutputStream;
16import java.util.Set;
16import java.util.zip.GZIPOutputStream; 17import java.util.zip.GZIPOutputStream;
17 18
18import cuchaz.enigma.analysis.JarIndex; 19import cuchaz.enigma.analysis.JarIndex;
@@ -31,6 +32,12 @@ public class Renamer
31 public void setClassName( ClassEntry obf, String deobfName ) 32 public void setClassName( ClassEntry obf, String deobfName )
32 { 33 {
33 deobfName = NameValidator.validateClassName( deobfName ); 34 deobfName = NameValidator.validateClassName( deobfName );
35 ClassEntry targetEntry = new ClassEntry( deobfName );
36 if( m_mappings.containsDeobfClass( deobfName ) || m_index.containsObfClass( targetEntry ) )
37 {
38 throw new IllegalNameException( deobfName, "There is already a class with that name" );
39 }
40
34 ClassMapping classMapping = getOrCreateClassMapping( obf ); 41 ClassMapping classMapping = getOrCreateClassMapping( obf );
35 42
36 if( obf.isInnerClass() ) 43 if( obf.isInnerClass() )
@@ -50,13 +57,32 @@ public class Renamer
50 public void setFieldName( FieldEntry obf, String deobfName ) 57 public void setFieldName( FieldEntry obf, String deobfName )
51 { 58 {
52 deobfName = NameValidator.validateFieldName( deobfName ); 59 deobfName = NameValidator.validateFieldName( deobfName );
60 FieldEntry targetEntry = new FieldEntry( obf.getClassEntry(), deobfName );
61 if( m_mappings.containsDeobfField( obf.getClassEntry(), deobfName ) || m_index.containsObfField( targetEntry ) )
62 {
63 throw new IllegalNameException( deobfName, "There is already a field with that name" );
64 }
65
53 ClassMapping classMapping = getOrCreateClassMappingOrInnerClassMapping( obf.getClassEntry() ); 66 ClassMapping classMapping = getOrCreateClassMappingOrInnerClassMapping( obf.getClassEntry() );
54 classMapping.setFieldName( obf.getName(), deobfName ); 67 classMapping.setFieldName( obf.getName(), deobfName );
55 } 68 }
56 69
57 public void setMethodTreeName( MethodEntry obf, String deobfName ) 70 public void setMethodTreeName( MethodEntry obf, String deobfName )
58 { 71 {
59 for( MethodEntry entry : m_index.getRelatedMethodImplementations( obf ) ) 72 Set<MethodEntry> implementations = m_index.getRelatedMethodImplementations( obf );
73
74 deobfName = NameValidator.validateMethodName( deobfName );
75 for( MethodEntry entry : implementations )
76 {
77 MethodEntry targetEntry = new MethodEntry( entry.getClassEntry(), deobfName, entry.getSignature() );
78 if( m_mappings.containsDeobfMethod( entry.getClassEntry(), deobfName, entry.getSignature() ) || m_index.containsObfMethod( targetEntry ) )
79 {
80 String className = m_mappings.getTranslator( m_index.getAncestries(), TranslationDirection.Deobfuscating ).translateClass( entry.getClassName() );
81 throw new IllegalNameException( deobfName, "There is already a method with that name and signature in class " + className );
82 }
83 }
84
85 for( MethodEntry entry : implementations )
60 { 86 {
61 setMethodName( entry, deobfName ); 87 setMethodName( entry, deobfName );
62 } 88 }
@@ -65,6 +91,13 @@ public class Renamer
65 public void setMethodName( MethodEntry obf, String deobfName ) 91 public void setMethodName( MethodEntry obf, String deobfName )
66 { 92 {
67 deobfName = NameValidator.validateMethodName( deobfName ); 93 deobfName = NameValidator.validateMethodName( deobfName );
94 MethodEntry targetEntry = new MethodEntry( obf.getClassEntry(), deobfName, obf.getSignature() );
95 if( m_mappings.containsDeobfMethod( obf.getClassEntry(), deobfName, obf.getSignature() ) || m_index.containsObfMethod( targetEntry ) )
96 {
97 String className = m_mappings.getTranslator( m_index.getAncestries(), TranslationDirection.Deobfuscating ).translateClass( obf.getClassName() );
98 throw new IllegalNameException( deobfName, "There is already a method with that name and signature in class " + className );
99 }
100
68 ClassMapping classMapping = getOrCreateClassMappingOrInnerClassMapping( obf.getClassEntry() ); 101 ClassMapping classMapping = getOrCreateClassMappingOrInnerClassMapping( obf.getClassEntry() );
69 String deobfSignature = m_mappings.getTranslator( m_index.getAncestries(), TranslationDirection.Deobfuscating ).translateSignature( obf.getSignature() ); 102 String deobfSignature = m_mappings.getTranslator( m_index.getAncestries(), TranslationDirection.Deobfuscating ).translateSignature( obf.getSignature() );
70 classMapping.setMethodNameAndSignature( obf.getName(), obf.getSignature(), deobfName, deobfSignature ); 103 classMapping.setMethodNameAndSignature( obf.getName(), obf.getSignature(), deobfName, deobfSignature );
@@ -73,6 +106,12 @@ public class Renamer
73 public void setArgumentName( ArgumentEntry obf, String deobfName ) 106 public void setArgumentName( ArgumentEntry obf, String deobfName )
74 { 107 {
75 deobfName = NameValidator.validateArgumentName( deobfName ); 108 deobfName = NameValidator.validateArgumentName( deobfName );
109 // NOTE: don't need to check arguments for name collisions with names determined by Procyon
110 if( m_mappings.containsArgument( obf.getMethodEntry(), deobfName ) )
111 {
112 throw new IllegalNameException( deobfName, "There is already an argument with that name" );
113 }
114
76 ClassMapping classMapping = getOrCreateClassMappingOrInnerClassMapping( obf.getClassEntry() ); 115 ClassMapping classMapping = getOrCreateClassMappingOrInnerClassMapping( obf.getClassEntry() );
77 classMapping.setArgumentName( obf.getMethodName(), obf.getMethodSignature(), obf.getIndex(), deobfName ); 116 classMapping.setArgumentName( obf.getMethodName(), obf.getMethodSignature(), obf.getIndex(), deobfName );
78 } 117 }