MCPcopy Create free account
hub / github.com/LFYSec/MScan / WorkList

Class WorkList

src/main/java/pascal/taie/analysis/pta/core/solver/WorkList.java:40–94  ·  view source on GitHub ↗

Represents work list in pointer analysis.

Source from the content-addressed store, hash-verified

38 * Represents work list in pointer analysis.
39 */
40final class WorkList {
41
42 /**
43 * Pointer entries to be processed.
44 */
45 private final Map<Pointer, PointsToSet> pointerEntries = Maps.newLinkedHashMap();
46
47 /**
48 * Call edges to be processed.
49 */
50 private final Queue<Edge<CSCallSite, CSMethod>> callEdges = new ArrayDeque<>();
51
52 void addEntry(Pointer pointer, PointsToSet pointsToSet) {
53 PointsToSet set = pointerEntries.get(pointer);
54 if (set != null) {
55 set.addAll(pointsToSet);
56 } else {
57 pointerEntries.put(pointer, pointsToSet.copy());
58 }
59 }
60
61 void addEntry(Edge<CSCallSite, CSMethod> edge) {
62 callEdges.add(edge);
63 }
64
65 Entry pollEntry() {
66 if (!callEdges.isEmpty()) {
67 // for correctness, we need to ensure that any call edges in
68 // the work list must be processed prior to the pointer entries
69 return new CallEdgeEntry(callEdges.poll());
70 } else if (!pointerEntries.isEmpty()) {
71 var it = pointerEntries.entrySet().iterator();
72 var e = it.next();
73 it.remove();
74 return new PointerEntry(e.getKey(), e.getValue());
75 } else {
76 throw new NoSuchElementException();
77 }
78 }
79
80 boolean isEmpty() {
81 return pointerEntries.isEmpty() && callEdges.isEmpty();
82 }
83
84 interface Entry {
85 }
86
87 record PointerEntry(Pointer pointer, PointsToSet pointsToSet)
88 implements Entry {
89 }
90
91 record CallEdgeEntry(Edge<CSCallSite, CSMethod> edge)
92 implements Entry {
93 }
94}

Callers

nothing calls this directly

Calls 1

newLinkedHashMapMethod · 0.95

Tested by

no test coverage detected