Loading sdg-core/src/main/java/es/upv/mist/slicing/graphs/jsysdg/JSysCFG.java +27 −1 Original line number Diff line number Diff line Loading @@ -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)) Loading Loading @@ -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()) Loading sdg-core/src/main/java/es/upv/mist/slicing/graphs/jsysdg/JSysPDG.java +11 −0 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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)); } } } Loading Loading
sdg-core/src/main/java/es/upv/mist/slicing/graphs/jsysdg/JSysCFG.java +27 −1 Original line number Diff line number Diff line Loading @@ -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)) Loading Loading @@ -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()) Loading
sdg-core/src/main/java/es/upv/mist/slicing/graphs/jsysdg/JSysPDG.java +11 −0 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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)); } } } Loading