package jqian.sootex.dependency.slicing; import java.util.*; import jqian.sootex.dependency.pdg.*; import soot.MethodOrMethodContext; /** * Horwitz-Reps-Binkely two phased slicing algorithm */ public class GlobalSlicer extends Slicer{ public GlobalSlicer(SDG sdg){ this._sdg = sdg; } public Set<DependenceNode> slice(Collection<JimpleSlicingCriterion> stmtCriteria){ Set<DependenceNode> reached = new HashSet<DependenceNode>(); Set<DependenceNode> criteriaNodes = new HashSet<DependenceNode>(); getStartingNodes(stmtCriteria,criteriaNodes,reached); phase1(reached); phase2(reached); reached.addAll(criteriaNodes); return reached; } protected PDG getDependenceGraph(MethodOrMethodContext mc){ return _sdg.getPDG(mc); } public Collection<DependenceEdge> getInEdges(DependenceNode n){ return _sdg.edgesInto(n); } /** excluding parameter-out edge. */ protected void phase1(Set<DependenceNode> reached){ class Helper implements TraverseHelper{ public boolean isExcluded(DependenceEdge e){ if((e.getFrom() instanceof FormalOut) && (e.getTo() instanceof ActualOut)){ return true; } return false; } } traverse(reached,new Helper()); } /** excluding parameter-in edge and call edge. */ protected void phase2(Set<DependenceNode> reached){ class Helper implements TraverseHelper{ public boolean isExcluded(DependenceEdge e){ DependenceNode from = e.getFrom(); DependenceNode to = e.getTo(); if((from instanceof ActualIn && to instanceof FormalIn) || (from instanceof CallNode && to instanceof EntryNode)){ return true; } return false; } } traverse(reached,new Helper()); } protected SDG _sdg; }