package jqian.sootex.dependency.slicing; import soot.MethodOrMethodContext; import java.util.*; import jqian.sootex.dependency.pdg.DependenceEdge; import jqian.sootex.dependency.pdg.DependenceNode; import jqian.sootex.dependency.pdg.PDG; /** * Perform intraprocedural slicing. */ public class LocalSlicer extends Slicer{ public LocalSlicer(PDG pdg){ this._pdg = pdg; } protected PDG getDependenceGraph(MethodOrMethodContext mc){ return _pdg; } public Collection<DependenceEdge> getInEdges(DependenceNode n){ return _pdg.edgesInto(n); } protected class MyTraverseHelper implements TraverseHelper{ public boolean isExcluded(DependenceEdge e){ return false; } } public Set<DependenceNode> slice(Collection<JimpleSlicingCriterion> stmtCriteria){ Set<DependenceNode> result = new HashSet<DependenceNode>(); Set<DependenceNode> criteriaNodes = new HashSet<DependenceNode>(); getStartingNodes(stmtCriteria,criteriaNodes,result); traverse(result,new MyTraverseHelper()); // XXX: include the criterion site itself result.addAll(criteriaNodes); return result; } private PDG _pdg; }