Commit 1c08eb01 authored by Carlos Galindo's avatar Carlos Galindo
Browse files

Add declaration arcs between field declarations and its definitions.

parent fef704d0
Loading
Loading
Loading
Loading
Loading
+27 −1
Original line number Diff line number Diff line
@@ -70,6 +70,32 @@ public class JSysCFG extends ESCFG {
        return findLastVarActionsFrom(usage, VariableAction::isDefinition);
    }

    public List<VariableAction> findAllFutureObjectDefinitionsFor(VariableAction action) {
        List<VariableAction> list = new LinkedList<>();
        Predicate<VariableAction> filter = a -> a.isDefinition() && a.getName().equals("this") && a.hasTreeMember(action.getName());
        findAllFutureVarActionsFor(new HashSet<>(), list, action.getGraphNode(), action, filter);
        return list;
    }

    protected void findAllFutureVarActionsFor(Set<GraphNode<?>> visited, List<VariableAction> result,
                                            GraphNode<?> currentNode, VariableAction var,
                                            Predicate<VariableAction> filter) {
        // Base case
        if (visited.contains(currentNode))
            return;
        visited.add(currentNode);

        Stream<VariableAction> stream = currentNode.getVariableActions().stream();
        if (var.getGraphNode().equals(currentNode))
            stream = stream.dropWhile(va -> va != var);
        stream.filter(filter).forEach(result::add);

        // always traverse forwards!
        for (Arc arc : outgoingEdgesOf(currentNode))
            if (arc.isExecutableControlFlowArc())
                findAllFutureVarActionsFor(visited, result, getEdgeTarget(arc), var, filter);
    }

    public List<VariableAction> findLastTotalDefinitionOf(VariableAction action, String member) {
        return findLastVarActionsFrom(action, def ->
                (def.isDeclaration() && def.hasTreeMember(member))
@@ -114,7 +140,7 @@ public class JSysCFG extends ESCFG {
                return true;
        }

        // Not found: traverse backwards!
        // Not found: traverse forwards!
        boolean allBranches = !outgoingEdgesOf(currentNode).isEmpty();
        for (Arc arc : outgoingEdgesOf(currentNode))
            if (arc.isExecutableControlFlowArc())
+11 −0
Original line number Diff line number Diff line
@@ -52,6 +52,11 @@ public class JSysPDG extends ESPDG {
        addEdge(graphNodeOf(source), graphNodeOf(target), new FlowDependencyArc(source.getName()));
    }

    protected void addDeclarationFlowDependencyArc(VariableAction declaration, VariableAction definition) {
        MemberNode defMember = definition.getObjectTree().getNodeFor(declaration.getName());
        addEdge(graphNodeOf(declaration), defMember, new FlowDependencyArc());
    }

    // definicion de miembro --flow--> uso de miembro
    protected void addFlowDependencyArc(VariableAction definition, VariableAction usage, String objMember) {
        GraphNode<?> defMember = definition.getObjectTree().getNodeFor(objMember);
@@ -120,11 +125,17 @@ public class JSysPDG extends ESPDG {
                                    jSysCFG.findLastDefinitionOfObjectMember(varAct, member).forEach(def -> addFlowDependencyArc(def, varAct, member));
                        }
                    } else if (varAct.isDefinition()) {
                        // Flow declaration --> definition
                        if (!varAct.isSynthetic())
                            jSysCFG.findDeclarationFor(varAct).ifPresent(dec -> addFlowDependencyArc(dec, varAct));
                        // Object flow definition --> definition
                        if (!varAct.isPrimitive() && varAct.hasObjectTree())
                            for (String member : varAct.getObjectTree().nameIterable())
                                jSysCFG.findNextObjectDefinitionsFor(varAct, member).forEach(def -> addObjectFlowDependencyArc(varAct, member, def));
                    } else if (varAct.isDeclaration()) {
                        if (varAct.getName().startsWith("this."))
                            jSysCFG.findAllFutureObjectDefinitionsFor(varAct)
                                    .forEach(def -> addDeclarationFlowDependencyArc(varAct, def));
                    }
                }
            }