Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /* Soot - a J*va Optimization Framework
   * Copyright (C) 2003 Ondrej Lhotak
   *
   * This library is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
   * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the
  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  * Boston, MA 02111-1307, USA.
  */
 
 package soot.jimple.toolkits.callgraph;
 import soot.*;
 import soot.jimple.*;
 import java.util.*;
 import soot.util.*;
Resolves virtual calls.

Author(s):
Ondrej Lhotak
 
 public final class VirtualCalls
 { 
     public VirtualCallsSingletons.Global g ) {}
     public static VirtualCalls v() { return G.v().soot_jimple_toolkits_callgraph_VirtualCalls(); }
 
     private final LargeNumberedMap typeToVtbl =
         new LargeNumberedMap( Scene.v().getTypeNumberer() );
 
     public SootMethod resolveSpecialSpecialInvokeExpr iieNumberedString subSigSootMethod container ) {
         SootMethod target = iie.getMethod();
         /* cf. JVM spec, invokespecial instruction */
         if( Scene.v().getOrMakeFastHierarchy()
                 .canStoreTypecontainer.getDeclaringClass().getType(),
                     target.getDeclaringClass().getType() )
             && container.getDeclaringClass().getType() !=
                 target.getDeclaringClass().getType() 
             && !target.getName().equals"<init>" ) 
             && subSig !=  ) {
 
             return resolveNonSpecial(
                     container.getDeclaringClass().getSuperclass().getType(),
                     subSig );
         } else {
             return target;
         }
     }
 
     public SootMethod resolveNonSpecialRefType tNumberedString subSig ) {
         SmallNumberedMap vtbl = (SmallNumberedMap.gett );
         ifvtbl == null ) {
             .puttvtbl =
                     new SmallNumberedMap( Scene.v().getMethodNumberer() ) );
         }
         SootMethod ret = (SootMethodvtbl.getsubSig );
         ifret != null ) return ret;
         SootClass cls = (t).getSootClass();
         ifcls.declaresMethodsubSig ) ) {
             SootMethod m = cls.getMethodsubSig );
             ifm.isConcrete() || m.isNative() || m.isPhantom() ) {
                 ret = cls.getMethodsubSig );
             }
         } else {
             ifcls.hasSuperclass() ) {
                 ret = resolveNonSpecialcls.getSuperclass().getType(), subSig );
             }
         }
         vtbl.putsubSigret );
         return ret;
     }
 
     private final Map<Type,List<Type>> baseToSubTypes = new HashMap<Type,List<Type>>();
 
     public void resolveType tType declaredTypeNumberedString subSigSootMethod containerChunkedQueue targets ) {
         resolve(tdeclaredTypenullsubSigcontainertargets);
     }
     public void resolveType tType declaredTypeType sigTypeNumberedString subSigSootMethod containerChunkedQueue targets ) {
         ifdeclaredType instanceof ArrayType ) declaredType = RefType.v("java.lang.Object");
         ifsigType instanceof ArrayType ) sigType = RefType.v("java.lang.Object");
         ift instanceof ArrayType ) t = RefType.v"java.lang.Object" );
         ifdeclaredType != null && !Scene.v().getOrMakeFastHierarchy()
                 .canStoreTypetdeclaredType ) ) {
             return;
         }
         ifsigType != null && !Scene.v().getOrMakeFastHierarchy()
                 .canStoreTypetsigType ) ) {
             return;
         }
         ift instanceof RefType ) {
             SootMethod target = resolveNonSpecial( (RefTypetsubSig );
             iftarget != null ) targets.addtarget );
        } else ift instanceof AnySubType ) {
            RefType base = ((AnySubType)t).getBase();
            List subTypes = .get(base);
            ifsubTypes != null ) {
                forIterator stIt = subTypes.iterator(); stIt.hasNext(); ) {
                    final Type st = (TypestIt.next();
                    resolvestdeclaredTypesigTypesubSigcontainertargets );
                }
                return;
            }
            .put(basesubTypes = new ArrayList() );
            subTypes.add(base);
            LinkedList<SootClassworklist = new LinkedList<SootClass>();
            HashSet<SootClassworkset = new HashSet<SootClass>();
            FastHierarchy fh = Scene.v().getOrMakeFastHierarchy();
            SootClass cl = base.getSootClass();
            ifworkset.addcl ) ) worklist.addcl );
            while( !worklist.isEmpty() ) {
                cl = worklist.removeFirst();
                ifcl.isInterface() ) {
                    forIterator cIt = fh.getAllImplementersOfInterface(cl).iterator(); cIt.hasNext(); ) {
                        final SootClass c = (SootClasscIt.next();
                        ifworkset.addc ) ) worklist.addc );
                    }
                } else {
                    ifcl.isConcrete() ) {
                        resolvecl.getType(), declaredTypesigTypesubSigcontainertargets );
                        subTypes.add(cl.getType());
                    }
                    forIterator cIt = fh.getSubclassesOfcl ).iterator(); cIt.hasNext(); ) {
                        final SootClass c = (SootClasscIt.next();
                        ifworkset.addc ) ) worklist.addc );
                    }
                }
            }
        } else ift instanceof NullType ) {
        } else {
            throw new RuntimeException"oops "+t );
        }
    }
    
    public final NumberedString sigClinit =
        Scene.v().getSubSigNumberer().findOrAdd("void <clinit>()");
    public final NumberedString sigStart =
        Scene.v().getSubSigNumberer().findOrAdd("void start()");
    public final NumberedString sigRun =
        Scene.v().getSubSigNumberer().findOrAdd("void run()");
New to GrepCode? Check out our FAQ X