summaryrefslogtreecommitdiff
path: root/src/cuchaz/enigma/analysis/JarIndex.java
diff options
context:
space:
mode:
authorGravatar jeff2014-09-21 23:21:34 -0400
committerGravatar jeff2014-09-21 23:21:34 -0400
commit24ed3dc06bc133e4f718acc4a691e905b081fb11 (patch)
treee4a73d03f74bb7125216e351eb673809f89a00c3 /src/cuchaz/enigma/analysis/JarIndex.java
parentimproved inner/anonymous class detection (diff)
downloadenigma-fork-24ed3dc06bc133e4f718acc4a691e905b081fb11.tar.gz
enigma-fork-24ed3dc06bc133e4f718acc4a691e905b081fb11.tar.xz
enigma-fork-24ed3dc06bc133e4f718acc4a691e905b081fb11.zip
fixed bugs with anonymous/inner classes
Diffstat (limited to 'src/cuchaz/enigma/analysis/JarIndex.java')
-rw-r--r--src/cuchaz/enigma/analysis/JarIndex.java31
1 files changed, 19 insertions, 12 deletions
diff --git a/src/cuchaz/enigma/analysis/JarIndex.java b/src/cuchaz/enigma/analysis/JarIndex.java
index c36e9cb..8ebce35 100644
--- a/src/cuchaz/enigma/analysis/JarIndex.java
+++ b/src/cuchaz/enigma/analysis/JarIndex.java
@@ -63,7 +63,7 @@ public class JarIndex
63 private Multimap<FieldEntry,EntryReference<FieldEntry,BehaviorEntry>> m_fieldReferences; 63 private Multimap<FieldEntry,EntryReference<FieldEntry,BehaviorEntry>> m_fieldReferences;
64 private Multimap<String,String> m_innerClasses; 64 private Multimap<String,String> m_innerClasses;
65 private Map<String,String> m_outerClasses; 65 private Map<String,String> m_outerClasses;
66 private Set<String> m_anonymousClasses; 66 private Map<String,BehaviorEntry> m_anonymousClasses;
67 private Map<MethodEntry,MethodEntry> m_bridgeMethods; 67 private Map<MethodEntry,MethodEntry> m_bridgeMethods;
68 68
69 public JarIndex( ) 69 public JarIndex( )
@@ -78,7 +78,7 @@ public class JarIndex
78 m_fieldReferences = HashMultimap.create(); 78 m_fieldReferences = HashMultimap.create();
79 m_innerClasses = HashMultimap.create(); 79 m_innerClasses = HashMultimap.create();
80 m_outerClasses = Maps.newHashMap(); 80 m_outerClasses = Maps.newHashMap();
81 m_anonymousClasses = Sets.newHashSet(); 81 m_anonymousClasses = Maps.newHashMap();
82 m_bridgeMethods = Maps.newHashMap(); 82 m_bridgeMethods = Maps.newHashMap();
83 } 83 }
84 84
@@ -161,9 +161,10 @@ public class JarIndex
161 m_innerClasses.put( outerClassName, innerClassName ); 161 m_innerClasses.put( outerClassName, innerClassName );
162 m_outerClasses.put( innerClassName, outerClassName ); 162 m_outerClasses.put( innerClassName, outerClassName );
163 163
164 if( isAnonymousClass( c, outerClassName ) ) 164 BehaviorEntry enclosingBehavior = isAnonymousClass( c, outerClassName );
165 if( enclosingBehavior != null )
165 { 166 {
166 m_anonymousClasses.add( innerClassName ); 167 m_anonymousClasses.put( innerClassName, enclosingBehavior );
167 168
168 // DEBUG 169 // DEBUG
169 //System.out.println( "ANONYMOUS: " + outerClassName + "$" + innerClassName ); 170 //System.out.println( "ANONYMOUS: " + outerClassName + "$" + innerClassName );
@@ -188,6 +189,7 @@ public class JarIndex
188 EntryRenamer.renameClassesInMultimap( renames, m_methodImplementations ); 189 EntryRenamer.renameClassesInMultimap( renames, m_methodImplementations );
189 EntryRenamer.renameClassesInMultimap( renames, m_behaviorReferences ); 190 EntryRenamer.renameClassesInMultimap( renames, m_behaviorReferences );
190 EntryRenamer.renameClassesInMultimap( renames, m_fieldReferences ); 191 EntryRenamer.renameClassesInMultimap( renames, m_fieldReferences );
192 EntryRenamer.renameClassesInMap( renames, m_bridgeMethods );
191 } 193 }
192 194
193 // step 6: update other indices with bridge method info 195 // step 6: update other indices with bridge method info
@@ -618,7 +620,7 @@ public class JarIndex
618 return true; 620 return true;
619 } 621 }
620 622
621 private boolean isAnonymousClass( CtClass c, String outerClassName ) 623 private BehaviorEntry isAnonymousClass( CtClass c, String outerClassName )
622 { 624 {
623 ClassEntry innerClassEntry = new ClassEntry( Descriptor.toJvmName( c.getName() ) ); 625 ClassEntry innerClassEntry = new ClassEntry( Descriptor.toJvmName( c.getName() ) );
624 626
@@ -631,13 +633,13 @@ public class JarIndex
631 // is abstract? 633 // is abstract?
632 if( Modifier.isAbstract( c.getModifiers() ) ) 634 if( Modifier.isAbstract( c.getModifiers() ) )
633 { 635 {
634 return false; 636 return null;
635 } 637 }
636 638
637 // is there exactly one constructor? 639 // is there exactly one constructor?
638 if( c.getDeclaredConstructors().length != 1 ) 640 if( c.getDeclaredConstructors().length != 1 )
639 { 641 {
640 return false; 642 return null;
641 } 643 }
642 CtConstructor constructor = c.getDeclaredConstructors()[0]; 644 CtConstructor constructor = c.getDeclaredConstructors()[0];
643 645
@@ -646,7 +648,7 @@ public class JarIndex
646 Collection<EntryReference<BehaviorEntry,BehaviorEntry>> references = getBehaviorReferences( constructorEntry ); 648 Collection<EntryReference<BehaviorEntry,BehaviorEntry>> references = getBehaviorReferences( constructorEntry );
647 if( references.size() != 1 ) 649 if( references.size() != 1 )
648 { 650 {
649 return false; 651 return null;
650 } 652 }
651 653
652 // does the caller use this type? 654 // does the caller use this type?
@@ -657,7 +659,7 @@ public class JarIndex
657 if( fieldClass != null && fieldClass.equals( innerClassEntry ) ) 659 if( fieldClass != null && fieldClass.equals( innerClassEntry ) )
658 { 660 {
659 // caller references this type, so it can't be anonymous 661 // caller references this type, so it can't be anonymous
660 return false; 662 return null;
661 } 663 }
662 } 664 }
663 for( BehaviorEntry behaviorEntry : getReferencedBehaviors( caller ) ) 665 for( BehaviorEntry behaviorEntry : getReferencedBehaviors( caller ) )
@@ -668,12 +670,12 @@ public class JarIndex
668 if( className.equals( innerClassEntry.getName() ) ) 670 if( className.equals( innerClassEntry.getName() ) )
669 { 671 {
670 // caller references this type, so it can't be anonymous 672 // caller references this type, so it can't be anonymous
671 return false; 673 return null;
672 } 674 }
673 } 675 }
674 } 676 }
675 677
676 return true; 678 return caller;
677 } 679 }
678 680
679 public Set<ClassEntry> getObfClassEntries( ) 681 public Set<ClassEntry> getObfClassEntries( )
@@ -905,7 +907,12 @@ public class JarIndex
905 907
906 public boolean isAnonymousClass( String obfInnerClassName ) 908 public boolean isAnonymousClass( String obfInnerClassName )
907 { 909 {
908 return m_anonymousClasses.contains( obfInnerClassName ); 910 return m_anonymousClasses.containsKey( obfInnerClassName );
911 }
912
913 public BehaviorEntry getAnonymousClassCaller( String obfInnerClassName )
914 {
915 return m_anonymousClasses.get( obfInnerClassName );
909 } 916 }
910 917
911 public Set<String> getInterfaces( String className ) 918 public Set<String> getInterfaces( String className )