evaluate method

  1. @override
List<Fact> evaluate(
  1. Map<String, List<List<Object>>> facts,
  2. Map<String, List<List<Object>>> derived
)
override

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;
}