evaluate method
Evaluates the rule and returns derived facts.
Implementation
@override
List<Fact> evaluate(
Map<String, List<List<Object>>> facts,
Map<String, List<List<Object>>> derived,
) {
final result = <Fact>[];
final loads = facts['LoadField'] ?? [];
final pointsTo = getCombined('VarPointsTo', facts, derived);
final heapPointsTo = getCombined('HeapPointsTo', facts, derived);
for (final load in loads) {
final baseVar = load[0];
final field = load[1];
final targetVar = load[2];
// Find what base points to
for (final basePt in pointsTo) {
if (basePt[0] == baseVar) {
final baseHeap = basePt[1];
// Find what the heap field points to
for (final heapPt in heapPointsTo) {
if (heapPt[0] == baseHeap && heapPt[1] == field) {
final targetHeap = heapPt[2];
result.add(Fact('VarPointsTo', [targetVar, targetHeap]));
}
}
}
}
}
return result;
}