diff options
Diffstat (limited to 'src/cuchaz/enigma/analysis/JarIndex.java')
| -rw-r--r-- | src/cuchaz/enigma/analysis/JarIndex.java | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/src/cuchaz/enigma/analysis/JarIndex.java b/src/cuchaz/enigma/analysis/JarIndex.java index 947453e..deacf16 100644 --- a/src/cuchaz/enigma/analysis/JarIndex.java +++ b/src/cuchaz/enigma/analysis/JarIndex.java | |||
| @@ -23,6 +23,7 @@ import javassist.CannotCompileException; | |||
| 23 | import javassist.CtBehavior; | 23 | import javassist.CtBehavior; |
| 24 | import javassist.CtClass; | 24 | import javassist.CtClass; |
| 25 | import javassist.CtConstructor; | 25 | import javassist.CtConstructor; |
| 26 | import javassist.CtField; | ||
| 26 | import javassist.CtMethod; | 27 | import javassist.CtMethod; |
| 27 | import javassist.NotFoundException; | 28 | import javassist.NotFoundException; |
| 28 | import javassist.bytecode.AccessFlag; | 29 | import javassist.bytecode.AccessFlag; |
| @@ -55,6 +56,7 @@ public class JarIndex | |||
| 55 | { | 56 | { |
| 56 | private Set<ClassEntry> m_obfClassEntries; | 57 | private Set<ClassEntry> m_obfClassEntries; |
| 57 | private Ancestries m_ancestries; | 58 | private Ancestries m_ancestries; |
| 59 | private Map<Entry,Access> m_access; | ||
| 58 | private Multimap<String,MethodEntry> m_methodImplementations; | 60 | private Multimap<String,MethodEntry> m_methodImplementations; |
| 59 | private Multimap<BehaviorEntry,EntryReference<BehaviorEntry,BehaviorEntry>> m_behaviorReferences; | 61 | private Multimap<BehaviorEntry,EntryReference<BehaviorEntry,BehaviorEntry>> m_behaviorReferences; |
| 60 | private Multimap<FieldEntry,EntryReference<FieldEntry,BehaviorEntry>> m_fieldReferences; | 62 | private Multimap<FieldEntry,EntryReference<FieldEntry,BehaviorEntry>> m_fieldReferences; |
| @@ -67,6 +69,7 @@ public class JarIndex | |||
| 67 | { | 69 | { |
| 68 | m_obfClassEntries = Sets.newHashSet(); | 70 | m_obfClassEntries = Sets.newHashSet(); |
| 69 | m_ancestries = new Ancestries(); | 71 | m_ancestries = new Ancestries(); |
| 72 | m_access = Maps.newHashMap(); | ||
| 70 | m_methodImplementations = HashMultimap.create(); | 73 | m_methodImplementations = HashMultimap.create(); |
| 71 | m_behaviorReferences = HashMultimap.create(); | 74 | m_behaviorReferences = HashMultimap.create(); |
| 72 | m_fieldReferences = HashMultimap.create(); | 75 | m_fieldReferences = HashMultimap.create(); |
| @@ -89,7 +92,24 @@ public class JarIndex | |||
| 89 | m_obfClassEntries.add( classEntry ); | 92 | m_obfClassEntries.add( classEntry ); |
| 90 | } | 93 | } |
| 91 | 94 | ||
| 92 | // step 2: index the types, methods | 95 | // step 2: index method/field access |
| 96 | for( CtClass c : JarClassIterator.classes( jar ) ) | ||
| 97 | { | ||
| 98 | fixClass( c ); | ||
| 99 | ClassEntry classEntry = new ClassEntry( Descriptor.toJvmName( c.getName() ) ); | ||
| 100 | for( CtField field : c.getDeclaredFields() ) | ||
| 101 | { | ||
| 102 | FieldEntry fieldEntry = new FieldEntry( classEntry, field.getName() ); | ||
| 103 | m_access.put( fieldEntry, Access.get( field ) ); | ||
| 104 | } | ||
| 105 | for( CtBehavior behavior : c.getDeclaredBehaviors() ) | ||
| 106 | { | ||
| 107 | MethodEntry methodEntry = new MethodEntry( classEntry, behavior.getName(), behavior.getSignature() ); | ||
| 108 | m_access.put( methodEntry, Access.get( behavior ) ); | ||
| 109 | } | ||
| 110 | } | ||
| 111 | |||
| 112 | // step 3: index the types, methods | ||
| 93 | for( CtClass c : JarClassIterator.classes( jar ) ) | 113 | for( CtClass c : JarClassIterator.classes( jar ) ) |
| 94 | { | 114 | { |
| 95 | fixClass( c ); | 115 | fixClass( c ); |
| @@ -105,7 +125,7 @@ public class JarIndex | |||
| 105 | } | 125 | } |
| 106 | } | 126 | } |
| 107 | 127 | ||
| 108 | // step 3: index inner classes and anonymous classes | 128 | // step 4: index inner classes and anonymous classes |
| 109 | for( CtClass c : JarClassIterator.classes( jar ) ) | 129 | for( CtClass c : JarClassIterator.classes( jar ) ) |
| 110 | { | 130 | { |
| 111 | fixClass( c ); | 131 | fixClass( c ); |
| @@ -132,7 +152,7 @@ public class JarIndex | |||
| 132 | } | 152 | } |
| 133 | } | 153 | } |
| 134 | 154 | ||
| 135 | // step 4: update other indices with inner class info | 155 | // step 5: update other indices with inner class info |
| 136 | Map<String,String> renames = Maps.newHashMap(); | 156 | Map<String,String> renames = Maps.newHashMap(); |
| 137 | for( Map.Entry<String,String> entry : m_outerClasses.entrySet() ) | 157 | for( Map.Entry<String,String> entry : m_outerClasses.entrySet() ) |
| 138 | { | 158 | { |
| @@ -522,6 +542,11 @@ public class JarIndex | |||
| 522 | return m_ancestries; | 542 | return m_ancestries; |
| 523 | } | 543 | } |
| 524 | 544 | ||
| 545 | public Access getAccess( Entry entry ) | ||
| 546 | { | ||
| 547 | return m_access.get( entry ); | ||
| 548 | } | ||
| 549 | |||
| 525 | public boolean isMethodImplemented( MethodEntry methodEntry ) | 550 | public boolean isMethodImplemented( MethodEntry methodEntry ) |
| 526 | { | 551 | { |
| 527 | Collection<MethodEntry> implementations = m_methodImplementations.get( methodEntry.getClassName() ); | 552 | Collection<MethodEntry> implementations = m_methodImplementations.get( methodEntry.getClassName() ); |