Loading src/main/java/tfm/graphs/Graph.java +1 −1 Original line number Diff line number Diff line Loading @@ -133,7 +133,7 @@ public abstract class Graph extends edg.graphlib.Graph<String, ArcData> { .anyMatch(node -> Objects.equals(node, graphNode)); } public abstract Graph slice(SlicingCriterion slicingCriterion); public abstract Set<Integer> slice(SlicingCriterion slicingCriterion); /** * Deprecated for incorrect behaviour. Use removeNode instead Loading src/main/java/tfm/graphs/PDGGraph.java +9 −33 Original line number Diff line number Diff line Loading @@ -11,9 +11,7 @@ import tfm.arcs.pdg.DataDependencyArc; import tfm.nodes.GraphNode; import tfm.slicing.SlicingCriterion; import tfm.utils.ASTUtils; import tfm.utils.Logger; import tfm.utils.NodeNotFoundException; import tfm.visitors.pdg.PDGBuilder; import java.util.Comparator; import java.util.HashSet; Loading Loading @@ -172,39 +170,19 @@ public class PDGGraph extends Graph { } @Override public PDGGraph slice(SlicingCriterion slicingCriterion) { Optional<GraphNode<?>> optionalGraphNode = slicingCriterion.findNode(this); if (!optionalGraphNode.isPresent()) { public Set<Integer> slice(SlicingCriterion slicingCriterion) { Optional<GraphNode<?>> node = slicingCriterion.findNode(this); if (!node.isPresent()) throw new NodeNotFoundException(slicingCriterion); Set<Integer> visited = new HashSet<>(); getSliceNodes(visited, node.get()); return visited; } GraphNode<?> node = optionalGraphNode.get(); // Simply get slice nodes from GraphNode Set<Integer> sliceNodes = getSliceNodes(new HashSet<>(), node); PDGGraph sliceGraph = new PDGGraph(); Node astCopy = ASTUtils.cloneAST(node.getAstNode()); astCopy.accept(new PDGBuilder(sliceGraph), sliceGraph.getRootNode()); for (GraphNode<?> sliceNode : sliceGraph.getNodes()) { if (!sliceNodes.contains(sliceNode.getId())) { Logger.log("Removing node " + sliceNode.getId()); sliceNode.getAstNode().removeForced(); sliceGraph.removeNode(sliceNode); } } return sliceGraph; } private Set<Integer> getSliceNodes(Set<Integer> visited, GraphNode<?> root) { visited.add(root.getId()); protected void getSliceNodes(Set<Integer> visited, GraphNode<?> node) { visited.add(node.getId()); for (Arc<ArcData> arc : root.getIncomingArcs()) { for (Arc<ArcData> arc : node.getIncomingArcs()) { GraphNode<?> from = arc.getFromNode(); if (visited.contains(from.getId())) Loading @@ -212,8 +190,6 @@ public class PDGGraph extends Graph { getSliceNodes(visited, from); } return visited; } public CFGGraph getCfgGraph() { Loading src/main/java/tfm/graphs/SDGGraph.java +2 −2 Original line number Diff line number Diff line Loading @@ -34,8 +34,8 @@ public class SDGGraph extends Graph { } @Override public Graph slice(SlicingCriterion slicingCriterion) { return this; public Set<Integer> slice(SlicingCriterion slicingCriterion) { throw new RuntimeException("Slicing not implemented for the SDG"); } public Map<Context, PDGGraph> getContextPDGGraphMap() { Loading src/main/java/tfm/slicing/GraphNodeCriterion.java 0 → 100644 +32 −0 Original line number Diff line number Diff line package tfm.slicing; import tfm.graphs.CFGGraph; import tfm.graphs.PDGGraph; import tfm.graphs.SDGGraph; import tfm.nodes.GraphNode; import java.util.Optional; public class GraphNodeCriterion extends SlicingCriterion { private final GraphNode<?> node; public GraphNodeCriterion(GraphNode<?> node, String variable) { super(variable); this.node = node; } @Override public Optional<GraphNode<?>> findNode(CFGGraph graph) { return graph.findNodeById(node.getId()); } @Override public Optional<GraphNode<?>> findNode(PDGGraph graph) { return graph.findNodeById(node.getId()); } @Override public Optional<GraphNode<?>> findNode(SDGGraph graph) { return graph.findNodeById(node.getId()); } } src/main/java/tfm/slicing/Slice.java +9 −8 Original line number Diff line number Diff line Loading @@ -11,6 +11,7 @@ import tfm.visitors.pdg.PDGBuilder; import java.io.File; import java.io.IOException; import java.util.Set; public class Slice { Loading @@ -28,13 +29,13 @@ public class Slice { Logger.log("= Starting slice ="); Logger.log("=================="); PDGGraph sliced = pdgGraph.slice(new LineNumberCriterion(18, "x")); PDGLog pdgLog = new PDGLog(sliced); pdgLog.log(); pdgLog.generateImages(PROGRAM_NAME + "-sliced"); pdgLog.openVisualRepresentation(); PDGValidator.printPDGProgram("Slice" + PROGRAM_NAME, sliced); // PDGGraph sliced = pdgGraph.slice(new LineNumberCriterion(18, "x")); // // PDGLog pdgLog = new PDGLog(sliced); // pdgLog.log(); // pdgLog.generateImages(PROGRAM_NAME + "-sliced"); // pdgLog.openVisualRepresentation(); // // PDGValidator.printPDGProgram("Slice" + PROGRAM_NAME, sliced); } } Loading
src/main/java/tfm/graphs/Graph.java +1 −1 Original line number Diff line number Diff line Loading @@ -133,7 +133,7 @@ public abstract class Graph extends edg.graphlib.Graph<String, ArcData> { .anyMatch(node -> Objects.equals(node, graphNode)); } public abstract Graph slice(SlicingCriterion slicingCriterion); public abstract Set<Integer> slice(SlicingCriterion slicingCriterion); /** * Deprecated for incorrect behaviour. Use removeNode instead Loading
src/main/java/tfm/graphs/PDGGraph.java +9 −33 Original line number Diff line number Diff line Loading @@ -11,9 +11,7 @@ import tfm.arcs.pdg.DataDependencyArc; import tfm.nodes.GraphNode; import tfm.slicing.SlicingCriterion; import tfm.utils.ASTUtils; import tfm.utils.Logger; import tfm.utils.NodeNotFoundException; import tfm.visitors.pdg.PDGBuilder; import java.util.Comparator; import java.util.HashSet; Loading Loading @@ -172,39 +170,19 @@ public class PDGGraph extends Graph { } @Override public PDGGraph slice(SlicingCriterion slicingCriterion) { Optional<GraphNode<?>> optionalGraphNode = slicingCriterion.findNode(this); if (!optionalGraphNode.isPresent()) { public Set<Integer> slice(SlicingCriterion slicingCriterion) { Optional<GraphNode<?>> node = slicingCriterion.findNode(this); if (!node.isPresent()) throw new NodeNotFoundException(slicingCriterion); Set<Integer> visited = new HashSet<>(); getSliceNodes(visited, node.get()); return visited; } GraphNode<?> node = optionalGraphNode.get(); // Simply get slice nodes from GraphNode Set<Integer> sliceNodes = getSliceNodes(new HashSet<>(), node); PDGGraph sliceGraph = new PDGGraph(); Node astCopy = ASTUtils.cloneAST(node.getAstNode()); astCopy.accept(new PDGBuilder(sliceGraph), sliceGraph.getRootNode()); for (GraphNode<?> sliceNode : sliceGraph.getNodes()) { if (!sliceNodes.contains(sliceNode.getId())) { Logger.log("Removing node " + sliceNode.getId()); sliceNode.getAstNode().removeForced(); sliceGraph.removeNode(sliceNode); } } return sliceGraph; } private Set<Integer> getSliceNodes(Set<Integer> visited, GraphNode<?> root) { visited.add(root.getId()); protected void getSliceNodes(Set<Integer> visited, GraphNode<?> node) { visited.add(node.getId()); for (Arc<ArcData> arc : root.getIncomingArcs()) { for (Arc<ArcData> arc : node.getIncomingArcs()) { GraphNode<?> from = arc.getFromNode(); if (visited.contains(from.getId())) Loading @@ -212,8 +190,6 @@ public class PDGGraph extends Graph { getSliceNodes(visited, from); } return visited; } public CFGGraph getCfgGraph() { Loading
src/main/java/tfm/graphs/SDGGraph.java +2 −2 Original line number Diff line number Diff line Loading @@ -34,8 +34,8 @@ public class SDGGraph extends Graph { } @Override public Graph slice(SlicingCriterion slicingCriterion) { return this; public Set<Integer> slice(SlicingCriterion slicingCriterion) { throw new RuntimeException("Slicing not implemented for the SDG"); } public Map<Context, PDGGraph> getContextPDGGraphMap() { Loading
src/main/java/tfm/slicing/GraphNodeCriterion.java 0 → 100644 +32 −0 Original line number Diff line number Diff line package tfm.slicing; import tfm.graphs.CFGGraph; import tfm.graphs.PDGGraph; import tfm.graphs.SDGGraph; import tfm.nodes.GraphNode; import java.util.Optional; public class GraphNodeCriterion extends SlicingCriterion { private final GraphNode<?> node; public GraphNodeCriterion(GraphNode<?> node, String variable) { super(variable); this.node = node; } @Override public Optional<GraphNode<?>> findNode(CFGGraph graph) { return graph.findNodeById(node.getId()); } @Override public Optional<GraphNode<?>> findNode(PDGGraph graph) { return graph.findNodeById(node.getId()); } @Override public Optional<GraphNode<?>> findNode(SDGGraph graph) { return graph.findNodeById(node.getId()); } }
src/main/java/tfm/slicing/Slice.java +9 −8 Original line number Diff line number Diff line Loading @@ -11,6 +11,7 @@ import tfm.visitors.pdg.PDGBuilder; import java.io.File; import java.io.IOException; import java.util.Set; public class Slice { Loading @@ -28,13 +29,13 @@ public class Slice { Logger.log("= Starting slice ="); Logger.log("=================="); PDGGraph sliced = pdgGraph.slice(new LineNumberCriterion(18, "x")); PDGLog pdgLog = new PDGLog(sliced); pdgLog.log(); pdgLog.generateImages(PROGRAM_NAME + "-sliced"); pdgLog.openVisualRepresentation(); PDGValidator.printPDGProgram("Slice" + PROGRAM_NAME, sliced); // PDGGraph sliced = pdgGraph.slice(new LineNumberCriterion(18, "x")); // // PDGLog pdgLog = new PDGLog(sliced); // pdgLog.log(); // pdgLog.generateImages(PROGRAM_NAME + "-sliced"); // pdgLog.openVisualRepresentation(); // // PDGValidator.printPDGProgram("Slice" + PROGRAM_NAME, sliced); } }