summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cuchaz/enigma/analysis/Access.java51
-rw-r--r--src/cuchaz/enigma/analysis/BehaviorReferenceTreeNode.java8
-rw-r--r--src/cuchaz/enigma/analysis/FieldReferenceTreeNode.java12
-rw-r--r--src/cuchaz/enigma/analysis/JarIndex.java31
-rw-r--r--src/cuchaz/enigma/gui/Gui.java1
5 files changed, 92 insertions, 11 deletions
diff --git a/src/cuchaz/enigma/analysis/Access.java b/src/cuchaz/enigma/analysis/Access.java
new file mode 100644
index 00000000..e35bb21b
--- /dev/null
+++ b/src/cuchaz/enigma/analysis/Access.java
@@ -0,0 +1,51 @@
1/*******************************************************************************
2 * Copyright (c) 2014 Jeff Martin.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the GNU Public License v3.0
5 * which accompanies this distribution, and is available at
6 * http://www.gnu.org/licenses/gpl.html
7 *
8 * Contributors:
9 * Jeff Martin - initial API and implementation
10 ******************************************************************************/
11package cuchaz.enigma.analysis;
12
13import java.lang.reflect.Modifier;
14
15import javassist.CtBehavior;
16import javassist.CtField;
17
18public enum Access
19{
20 Public,
21 Protected,
22 Private;
23
24 public static Access get( CtBehavior behavior )
25 {
26 return get( behavior.getModifiers() );
27 }
28
29 public static Access get( CtField field )
30 {
31 return get( field.getModifiers() );
32 }
33
34 public static Access get( int modifiers )
35 {
36 if( Modifier.isPublic( modifiers ) )
37 {
38 return Public;
39 }
40 else if( Modifier.isProtected( modifiers ) )
41 {
42 return Protected;
43 }
44 else if( Modifier.isPrivate( modifiers ) )
45 {
46 return Private;
47 }
48 // assume public by default
49 return Public;
50 }
51} \ No newline at end of file
diff --git a/src/cuchaz/enigma/analysis/BehaviorReferenceTreeNode.java b/src/cuchaz/enigma/analysis/BehaviorReferenceTreeNode.java
index 0f7e7f71..20f1d472 100644
--- a/src/cuchaz/enigma/analysis/BehaviorReferenceTreeNode.java
+++ b/src/cuchaz/enigma/analysis/BehaviorReferenceTreeNode.java
@@ -28,6 +28,7 @@ public class BehaviorReferenceTreeNode extends DefaultMutableTreeNode implements
28 private Translator m_deobfuscatingTranslator; 28 private Translator m_deobfuscatingTranslator;
29 private BehaviorEntry m_entry; 29 private BehaviorEntry m_entry;
30 private EntryReference<BehaviorEntry,BehaviorEntry> m_reference; 30 private EntryReference<BehaviorEntry,BehaviorEntry> m_reference;
31 private Access m_access;
31 32
32 public BehaviorReferenceTreeNode( Translator deobfuscatingTranslator, BehaviorEntry entry ) 33 public BehaviorReferenceTreeNode( Translator deobfuscatingTranslator, BehaviorEntry entry )
33 { 34 {
@@ -36,11 +37,12 @@ public class BehaviorReferenceTreeNode extends DefaultMutableTreeNode implements
36 m_reference = null; 37 m_reference = null;
37 } 38 }
38 39
39 public BehaviorReferenceTreeNode( Translator deobfuscatingTranslator, EntryReference<BehaviorEntry,BehaviorEntry> reference ) 40 public BehaviorReferenceTreeNode( Translator deobfuscatingTranslator, EntryReference<BehaviorEntry,BehaviorEntry> reference, Access access )
40 { 41 {
41 m_deobfuscatingTranslator = deobfuscatingTranslator; 42 m_deobfuscatingTranslator = deobfuscatingTranslator;
42 m_entry = reference.entry; 43 m_entry = reference.entry;
43 m_reference = reference; 44 m_reference = reference;
45 m_access = access;
44 } 46 }
45 47
46 @Override 48 @Override
@@ -60,7 +62,7 @@ public class BehaviorReferenceTreeNode extends DefaultMutableTreeNode implements
60 { 62 {
61 if( m_reference != null ) 63 if( m_reference != null )
62 { 64 {
63 return m_deobfuscatingTranslator.translateEntry( m_reference.context ).toString(); 65 return String.format( "%s (%s)", m_deobfuscatingTranslator.translateEntry( m_reference.context ), m_access );
64 } 66 }
65 return m_deobfuscatingTranslator.translateEntry( m_entry ).toString(); 67 return m_deobfuscatingTranslator.translateEntry( m_entry ).toString();
66 } 68 }
@@ -70,7 +72,7 @@ public class BehaviorReferenceTreeNode extends DefaultMutableTreeNode implements
70 // get all the child nodes 72 // get all the child nodes
71 for( EntryReference<BehaviorEntry,BehaviorEntry> reference : index.getBehaviorReferences( m_entry ) ) 73 for( EntryReference<BehaviorEntry,BehaviorEntry> reference : index.getBehaviorReferences( m_entry ) )
72 { 74 {
73 add( new BehaviorReferenceTreeNode( m_deobfuscatingTranslator, reference ) ); 75 add( new BehaviorReferenceTreeNode( m_deobfuscatingTranslator, reference, index.getAccess( m_entry ) ) );
74 } 76 }
75 77
76 if( recurse && children != null ) 78 if( recurse && children != null )
diff --git a/src/cuchaz/enigma/analysis/FieldReferenceTreeNode.java b/src/cuchaz/enigma/analysis/FieldReferenceTreeNode.java
index 94d0da7e..2652f64a 100644
--- a/src/cuchaz/enigma/analysis/FieldReferenceTreeNode.java
+++ b/src/cuchaz/enigma/analysis/FieldReferenceTreeNode.java
@@ -23,7 +23,8 @@ public class FieldReferenceTreeNode extends DefaultMutableTreeNode implements Re
23 private Translator m_deobfuscatingTranslator; 23 private Translator m_deobfuscatingTranslator;
24 private FieldEntry m_entry; 24 private FieldEntry m_entry;
25 private EntryReference<FieldEntry,BehaviorEntry> m_reference; 25 private EntryReference<FieldEntry,BehaviorEntry> m_reference;
26 26 private Access m_access;
27
27 public FieldReferenceTreeNode( Translator deobfuscatingTranslator, FieldEntry entry ) 28 public FieldReferenceTreeNode( Translator deobfuscatingTranslator, FieldEntry entry )
28 { 29 {
29 m_deobfuscatingTranslator = deobfuscatingTranslator; 30 m_deobfuscatingTranslator = deobfuscatingTranslator;
@@ -31,11 +32,12 @@ public class FieldReferenceTreeNode extends DefaultMutableTreeNode implements Re
31 m_reference = null; 32 m_reference = null;
32 } 33 }
33 34
34 private FieldReferenceTreeNode( Translator deobfuscatingTranslator, EntryReference<FieldEntry,BehaviorEntry> reference ) 35 private FieldReferenceTreeNode( Translator deobfuscatingTranslator, EntryReference<FieldEntry,BehaviorEntry> reference, Access access )
35 { 36 {
36 m_deobfuscatingTranslator = deobfuscatingTranslator; 37 m_deobfuscatingTranslator = deobfuscatingTranslator;
37 m_entry = reference.entry; 38 m_entry = reference.entry;
38 m_reference = reference; 39 m_reference = reference;
40 m_access = access;
39 } 41 }
40 42
41 @Override 43 @Override
@@ -55,7 +57,7 @@ public class FieldReferenceTreeNode extends DefaultMutableTreeNode implements Re
55 { 57 {
56 if( m_reference != null ) 58 if( m_reference != null )
57 { 59 {
58 return m_deobfuscatingTranslator.translateEntry( m_reference.context ).toString(); 60 return String.format( "%s (%s)", m_deobfuscatingTranslator.translateEntry( m_reference.context ), m_access );
59 } 61 }
60 return m_deobfuscatingTranslator.translateEntry( m_entry ).toString(); 62 return m_deobfuscatingTranslator.translateEntry( m_entry ).toString();
61 } 63 }
@@ -67,14 +69,14 @@ public class FieldReferenceTreeNode extends DefaultMutableTreeNode implements Re
67 { 69 {
68 for( EntryReference<FieldEntry,BehaviorEntry> reference : index.getFieldReferences( m_entry ) ) 70 for( EntryReference<FieldEntry,BehaviorEntry> reference : index.getFieldReferences( m_entry ) )
69 { 71 {
70 add( new FieldReferenceTreeNode( m_deobfuscatingTranslator, reference ) ); 72 add( new FieldReferenceTreeNode( m_deobfuscatingTranslator, reference, index.getAccess( m_entry ) ) );
71 } 73 }
72 } 74 }
73 else 75 else
74 { 76 {
75 for( EntryReference<BehaviorEntry,BehaviorEntry> reference : index.getBehaviorReferences( m_reference.context ) ) 77 for( EntryReference<BehaviorEntry,BehaviorEntry> reference : index.getBehaviorReferences( m_reference.context ) )
76 { 78 {
77 add( new BehaviorReferenceTreeNode( m_deobfuscatingTranslator, reference ) ); 79 add( new BehaviorReferenceTreeNode( m_deobfuscatingTranslator, reference, index.getAccess( m_reference.context ) ) );
78 } 80 }
79 } 81 }
80 82
diff --git a/src/cuchaz/enigma/analysis/JarIndex.java b/src/cuchaz/enigma/analysis/JarIndex.java
index 947453ef..deacf16d 100644
--- a/src/cuchaz/enigma/analysis/JarIndex.java
+++ b/src/cuchaz/enigma/analysis/JarIndex.java
@@ -23,6 +23,7 @@ import javassist.CannotCompileException;
23import javassist.CtBehavior; 23import javassist.CtBehavior;
24import javassist.CtClass; 24import javassist.CtClass;
25import javassist.CtConstructor; 25import javassist.CtConstructor;
26import javassist.CtField;
26import javassist.CtMethod; 27import javassist.CtMethod;
27import javassist.NotFoundException; 28import javassist.NotFoundException;
28import javassist.bytecode.AccessFlag; 29import 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() );
diff --git a/src/cuchaz/enigma/gui/Gui.java b/src/cuchaz/enigma/gui/Gui.java
index 3ee8ade0..ec0f842a 100644
--- a/src/cuchaz/enigma/gui/Gui.java
+++ b/src/cuchaz/enigma/gui/Gui.java
@@ -189,6 +189,7 @@ public class Gui
189 @Override 189 @Override
190 public void uncaughtException( Thread thread, Throwable ex ) 190 public void uncaughtException( Thread thread, Throwable ex )
191 { 191 {
192 ex.printStackTrace( System.err );
192 CrashDialog.show( ex ); 193 CrashDialog.show( ex );
193 } 194 }
194 } ); 195 } );