Newer
Older
import com.github.javaparser.ast.expr.VariableDeclarationExpr;
import tfm.arcs.Arc;
import tfm.arcs.pdg.ControlDependencyArc;
import tfm.arcs.pdg.DataDependencyArc;
import tfm.nodes.PDGVertex;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
public abstract class PDGGraph extends Graph<PDGVertex> {
private Map<String, List<VariableDeclarationExpr>> variablesDeclarations;
private Map<String, List<VariableDeclarationExpr>> variablesUses;
public PDGGraph() {
setRootVertex(new PDGVertex(VertexId.getVertexId(), getRootNodeData()));
variablesDeclarations = new HashMap<>();
variablesUses = new HashMap<>();
}
protected abstract String getRootNodeData();
@Override
public PDGVertex addVertex(String instruction) {
PDGVertex vertex = new PDGVertex(VertexId.getVertexId(), instruction);
super.addVertex(vertex);
return vertex;
}
@SuppressWarnings("unchecked")
private void addArc(Arc arc) {
super.addEdge(arc);
}
public void addControlDependencyArc(PDGVertex from, PDGVertex to) {
ControlDependencyArc controlDependencyArc = new ControlDependencyArc(from, to);
this.addArc(controlDependencyArc);
}
public void addDataDependencyArc(PDGVertex from, PDGVertex to, String variable) {
DataDependencyArc dataDataDependencyArc = new DataDependencyArc(from, to, variable);
this.addArc(dataDataDependencyArc);
}
public void addVariableDeclaration(String variable, VariableDeclarationExpr expr) {
doAddVariableUseOrDeclaration(variable, expr, variablesDeclarations);
}
public void addVariableUse(String variable, VariableDeclarationExpr expr) {
doAddVariableUseOrDeclaration(variable, expr, variablesUses);
}
private void doAddVariableUseOrDeclaration(String variable, VariableDeclarationExpr expr, Map<String, List<VariableDeclarationExpr>> map) {
List<VariableDeclarationExpr> list = map.getOrDefault(variable, new ArrayList<>());
list.add(expr);
if (!map.containsKey(variable)) {
map.put(variable, list);
}
}
public List<VariableDeclarationExpr> getDeclarationsOf(String variable) {
return variablesDeclarations.get(variable);
}
public List<VariableDeclarationExpr> getUsesOf(String variable) {
return variablesUses.get(variable);
}
}