Commit f7f50af2 authored by Carlos Galindo's avatar Carlos Galindo
Browse files

Slicing for all PDG variants.

API changed from returning a graph to returning a set of `GraphNode#id`s.
parent f02c0088
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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
+9 −33
Original line number Diff line number Diff line
@@ -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;
@@ -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()))
@@ -212,8 +190,6 @@ public class PDGGraph extends Graph {

            getSliceNodes(visited, from);
        }

        return visited;
    }

    public CFGGraph getCfgGraph() {
+2 −2
Original line number Diff line number Diff line
@@ -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() {
+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());
    }
}
+9 −8
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@ import tfm.visitors.pdg.PDGBuilder;

import java.io.File;
import java.io.IOException;
import java.util.Set;

public class Slice {

@@ -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