From 237b2ed2a6b6f537cdbdf9fc9c6d0c7743f34375 Mon Sep 17 00:00:00 2001 From: jeff Date: Thu, 21 Aug 2014 01:10:37 -0400 Subject: fixed call graph searching added system to navigate multiple tokens for the same entry in a behavior --- src/cuchaz/enigma/analysis/EntryReference.java | 13 +++----- src/cuchaz/enigma/analysis/JarIndex.java | 30 ++++++++---------- src/cuchaz/enigma/analysis/SourceIndex.java | 37 ++++++++++++++++++---- .../analysis/SourceIndexBehaviorVisitor.java | 16 +++------- .../enigma/analysis/SourceIndexClassVisitor.java | 23 ++++++++------ 5 files changed, 64 insertions(+), 55 deletions(-) (limited to 'src/cuchaz/enigma/analysis') diff --git a/src/cuchaz/enigma/analysis/EntryReference.java b/src/cuchaz/enigma/analysis/EntryReference.java index 869e08c..768c113 100644 --- a/src/cuchaz/enigma/analysis/EntryReference.java +++ b/src/cuchaz/enigma/analysis/EntryReference.java @@ -18,14 +18,13 @@ public class EntryReference { public E entry; public C context; - public int pos; public EntryReference( E entry ) { - this( entry, null, -1 ); + this( entry, null ); } - public EntryReference( E entry, C context, int pos ) + public EntryReference( E entry, C context ) { if( entry == null ) { @@ -34,7 +33,6 @@ public class EntryReference this.entry = entry; this.context = context; - this.pos = pos; } public ClassEntry getClassEntry( ) @@ -51,7 +49,7 @@ public class EntryReference { if( context != null ) { - return Util.combineHashesOrdered( entry.hashCode(), context.hashCode(), Integer.valueOf( pos ).hashCode() ); + return Util.combineHashesOrdered( entry.hashCode(), context.hashCode() ); } return entry.hashCode(); } @@ -82,7 +80,7 @@ public class EntryReference } else if( context != null && other.context != null ) { - return context.equals( other.context ) && pos == other.pos; + return context.equals( other.context ); } return false; } @@ -96,9 +94,6 @@ public class EntryReference { buf.append( " called from " ); buf.append( context ); - buf.append( " (" ); - buf.append( pos ); - buf.append( ")" ); } return buf.toString(); } diff --git a/src/cuchaz/enigma/analysis/JarIndex.java b/src/cuchaz/enigma/analysis/JarIndex.java index f408d93..315a286 100644 --- a/src/cuchaz/enigma/analysis/JarIndex.java +++ b/src/cuchaz/enigma/analysis/JarIndex.java @@ -146,10 +146,15 @@ public class JarIndex } else if( behavior instanceof CtConstructor ) { - thisEntry = new ConstructorEntry( - new ClassEntry( className ), - behavior.getSignature() - ); + boolean isStatic = behavior.getName().equals( "" ); + if( isStatic ) + { + thisEntry = new ConstructorEntry( new ClassEntry( className ) ); + } + else + { + thisEntry = new ConstructorEntry( new ClassEntry( className ), behavior.getSignature() ); + } } else { @@ -159,7 +164,6 @@ public class JarIndex // index method calls try { - final Multiset callNumbers = HashMultiset.create(); behavior.instrument( new ExprEditor( ) { @Override @@ -171,11 +175,9 @@ public class JarIndex call.getMethodName(), call.getSignature() ); - callNumbers.add( calledMethodEntry ); EntryReference reference = new EntryReference( calledMethodEntry, - thisEntry, - callNumbers.count( calledMethodEntry ) - 1 + thisEntry ); m_behaviorReferences.put( calledMethodEntry, reference ); } @@ -188,11 +190,9 @@ public class JarIndex new ClassEntry( className ), call.getFieldName() ); - callNumbers.add( calledFieldEntry ); EntryReference reference = new EntryReference( calledFieldEntry, - thisEntry, - callNumbers.count( calledFieldEntry ) - 1 + thisEntry ); m_fieldReferences.put( calledFieldEntry, reference ); } @@ -208,11 +208,9 @@ public class JarIndex new ClassEntry( className ), call.getSignature() ); - callNumbers.add( calledConstructorEntry ); EntryReference reference = new EntryReference( calledConstructorEntry, - thisEntry, - callNumbers.count( calledConstructorEntry ) - 1 + thisEntry ); m_behaviorReferences.put( calledConstructorEntry, reference ); } @@ -225,11 +223,9 @@ public class JarIndex new ClassEntry( className ), call.getSignature() ); - callNumbers.add( calledConstructorEntry ); EntryReference reference = new EntryReference( calledConstructorEntry, - thisEntry, - callNumbers.count( calledConstructorEntry ) - 1 + thisEntry ); m_behaviorReferences.put( calledConstructorEntry, reference ); } diff --git a/src/cuchaz/enigma/analysis/SourceIndex.java b/src/cuchaz/enigma/analysis/SourceIndex.java index bf890e3..960ec36 100644 --- a/src/cuchaz/enigma/analysis/SourceIndex.java +++ b/src/cuchaz/enigma/analysis/SourceIndex.java @@ -10,13 +10,15 @@ ******************************************************************************/ package cuchaz.enigma.analysis; -import java.util.HashMap; +import java.util.Collection; import java.util.List; import java.util.Map; import java.util.TreeMap; +import com.google.common.collect.HashMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import com.google.common.collect.Multimap; import com.strobel.decompiler.languages.Region; import com.strobel.decompiler.languages.java.ast.Identifier; @@ -26,7 +28,7 @@ public class SourceIndex { private String m_source; private TreeMap> m_tokenToReference; - private HashMap,Token> m_referenceToToken; + private Multimap,Token> m_referenceToTokens; private Map m_declarationToToken; private List m_lineOffsets; @@ -34,7 +36,7 @@ public class SourceIndex { m_source = source; m_tokenToReference = Maps.newTreeMap(); - m_referenceToToken = Maps.newHashMap(); + m_referenceToTokens = HashMultimap.create(); m_declarationToToken = Maps.newHashMap(); m_lineOffsets = Lists.newArrayList(); @@ -96,7 +98,7 @@ public class SourceIndex if( token != null ) { m_tokenToReference.put( token, deobfReference ); - m_referenceToToken.put( deobfReference, token ); + m_referenceToTokens.put( deobfReference, token ); } } @@ -107,7 +109,7 @@ public class SourceIndex { EntryReference reference = new EntryReference( deobfEntry ); m_tokenToReference.put( token, reference ); - m_referenceToToken.put( reference, token ); + m_referenceToTokens.put( reference, token ); m_declarationToToken.put( deobfEntry, token ); } } @@ -122,9 +124,9 @@ public class SourceIndex return null; } - public Token getReferenceToken( EntryReference deobfReference ) + public Collection getReferenceTokens( EntryReference deobfReference ) { - return m_referenceToToken.get( deobfReference ); + return m_referenceToTokens.get( deobfReference ); } public EntryReference getDeobfReference( Token token ) @@ -151,6 +153,27 @@ public class SourceIndex return m_declarationToToken.get( deobfEntry ); } + public int getLineNumber( int pos ) + { + // line number is 1-based + int line = 0; + for( Integer offset : m_lineOffsets ) + { + if( offset > pos ) + { + break; + } + line++; + } + return line; + } + + public int getColumnNumber( int pos ) + { + // column number is 1-based + return pos - m_lineOffsets.get( getLineNumber( pos ) - 1 ) + 1; + } + private int toPos( int line, int col ) { // line and col are 1-based diff --git a/src/cuchaz/enigma/analysis/SourceIndexBehaviorVisitor.java b/src/cuchaz/enigma/analysis/SourceIndexBehaviorVisitor.java index d3386c5..a943858 100644 --- a/src/cuchaz/enigma/analysis/SourceIndexBehaviorVisitor.java +++ b/src/cuchaz/enigma/analysis/SourceIndexBehaviorVisitor.java @@ -10,8 +10,6 @@ ******************************************************************************/ package cuchaz.enigma.analysis; -import com.google.common.collect.HashMultiset; -import com.google.common.collect.Multiset; import com.strobel.assembler.metadata.MemberReference; import com.strobel.assembler.metadata.MethodDefinition; import com.strobel.assembler.metadata.ParameterDefinition; @@ -36,12 +34,10 @@ import cuchaz.enigma.mapping.MethodEntry; public class SourceIndexBehaviorVisitor extends SourceIndexVisitor { private BehaviorEntry m_behaviorEntry; - private Multiset m_indices; public SourceIndexBehaviorVisitor( BehaviorEntry behaviorEntry ) { m_behaviorEntry = behaviorEntry; - m_indices = HashMultiset.create(); } @Override @@ -64,10 +60,9 @@ public class SourceIndexBehaviorVisitor extends SourceIndexVisitor MethodEntry methodEntry = new MethodEntry( classEntry, ref.getName(), ref.getSignature() ); if( node.getTarget() instanceof MemberReferenceExpression ) { - m_indices.add( methodEntry ); index.addReference( ((MemberReferenceExpression)node.getTarget()).getMemberNameToken(), - new EntryReference( methodEntry, m_behaviorEntry, m_indices.count( methodEntry ) ) + new EntryReference( methodEntry, m_behaviorEntry ) ); } @@ -82,10 +77,9 @@ public class SourceIndexBehaviorVisitor extends SourceIndexVisitor { ClassEntry classEntry = new ClassEntry( ref.getDeclaringType().getInternalName() ); FieldEntry fieldEntry = new FieldEntry( classEntry, ref.getName() ); - m_indices.add( fieldEntry ); index.addReference( node.getMemberNameToken(), - new EntryReference( fieldEntry, m_behaviorEntry, m_indices.count( fieldEntry ) ) + new EntryReference( fieldEntry, m_behaviorEntry ) ); } @@ -99,10 +93,9 @@ public class SourceIndexBehaviorVisitor extends SourceIndexVisitor if( node.getIdentifierToken().getStartLocation() != TextLocation.EMPTY ) { ClassEntry classEntry = new ClassEntry( ref.getInternalName() ); - m_indices.add( classEntry ); index.addReference( node.getIdentifierToken(), - new EntryReference( classEntry, m_behaviorEntry, m_indices.count( classEntry ) ) + new EntryReference( classEntry, m_behaviorEntry ) ); } @@ -130,10 +123,9 @@ public class SourceIndexBehaviorVisitor extends SourceIndexVisitor { ClassEntry classEntry = new ClassEntry( ref.getDeclaringType().getInternalName() ); FieldEntry fieldEntry = new FieldEntry( classEntry, ref.getName() ); - m_indices.add( fieldEntry ); index.addReference( node.getIdentifierToken(), - new EntryReference( fieldEntry, m_behaviorEntry, m_indices.count( fieldEntry ) ) + new EntryReference( fieldEntry, m_behaviorEntry ) ); } diff --git a/src/cuchaz/enigma/analysis/SourceIndexClassVisitor.java b/src/cuchaz/enigma/analysis/SourceIndexClassVisitor.java index 5257088..a1c8271 100644 --- a/src/cuchaz/enigma/analysis/SourceIndexClassVisitor.java +++ b/src/cuchaz/enigma/analysis/SourceIndexClassVisitor.java @@ -10,8 +10,6 @@ ******************************************************************************/ package cuchaz.enigma.analysis; -import com.google.common.collect.HashMultiset; -import com.google.common.collect.Multiset; import com.strobel.assembler.metadata.FieldDefinition; import com.strobel.assembler.metadata.MethodDefinition; import com.strobel.assembler.metadata.TypeDefinition; @@ -26,6 +24,7 @@ import com.strobel.decompiler.languages.java.ast.SimpleType; import com.strobel.decompiler.languages.java.ast.TypeDeclaration; import com.strobel.decompiler.languages.java.ast.VariableInitializer; +import cuchaz.enigma.mapping.BehaviorEntry; import cuchaz.enigma.mapping.ClassEntry; import cuchaz.enigma.mapping.ConstructorEntry; import cuchaz.enigma.mapping.Entry; @@ -35,12 +34,10 @@ import cuchaz.enigma.mapping.MethodEntry; public class SourceIndexClassVisitor extends SourceIndexVisitor { private ClassEntry m_classEntry; - private Multiset m_indices; public SourceIndexClassVisitor( ClassEntry classEntry ) { m_classEntry = classEntry; - m_indices = HashMultiset.create(); } @Override @@ -68,7 +65,7 @@ public class SourceIndexClassVisitor extends SourceIndexVisitor ClassEntry classEntry = new ClassEntry( ref.getInternalName() ); index.addReference( node.getIdentifierToken(), - new EntryReference( classEntry, m_classEntry, m_indices.count( classEntry ) ) + new EntryReference( classEntry, m_classEntry ) ); } @@ -80,11 +77,17 @@ public class SourceIndexClassVisitor extends SourceIndexVisitor { MethodDefinition def = node.getUserData( Keys.METHOD_DEFINITION ); ClassEntry classEntry = new ClassEntry( def.getDeclaringType().getInternalName() ); - MethodEntry methodEntry = new MethodEntry( classEntry, def.getName(), def.getSignature() ); - index.addDeclaration( node.getNameToken(), methodEntry ); - //if( !def.getName().equals( "" ) ) - - return node.acceptVisitor( new SourceIndexBehaviorVisitor( methodEntry ), index ); + BehaviorEntry behaviorEntry; + if( def.getName().equals( "" ) ) + { + behaviorEntry = new ConstructorEntry( classEntry ); + } + else + { + behaviorEntry = new MethodEntry( classEntry, def.getName(), def.getSignature() ); + } + index.addDeclaration( node.getNameToken(), behaviorEntry ); + return node.acceptVisitor( new SourceIndexBehaviorVisitor( behaviorEntry ), index ); } @Override -- cgit v1.2.3