@@ -25,6 +25,32 @@ module ClosureWriter =
2525 let append = (@ );
2626 });
2727
28+ /* Record a sample for a probed type.
29+ * When a type has a probe on it (i.e., its ID is in targets), and we're
30+ * processing an ascription, we record the value being ascribed as a sample
31+ * for that type's probe. */
32+ let record_type_probe =
33+ (~targets: Sample . targets , typ: Typ . t , value: DHExp . t )
34+ : ClosureWriter . t(unit) => {
35+ let typ_id = Typ . rep_id(typ);
36+ switch (Id . Map . find_opt(typ_id, targets)) {
37+ | Some (spec ) =>
38+ ClosureWriter . tell([
39+ (call_stack: Sample . call_stack , step_start: int , step_end: int ) =>
40+ Sample . mk(
41+ ~step_start,
42+ ~step_end,
43+ typ_id,
44+ value,
45+ Environment . empty,
46+ call_stack,
47+ spec,
48+ ),
49+ ] )
50+ | None => ClosureWriter . return()
51+ };
52+ };
53+
2854let rec transition =
2955 (~recursive= false , ~targets: Sample . targets , d: DHExp . t )
3056 : ClosureWriter . t(option(DHExp . t)) => {
@@ -99,6 +125,8 @@ let rec transition =
99125 |> ClosureWriter . sequence ;
100126 Some (IdTagged . fast_copy(DHExp . rep_id(e), Tuple (es) |> DHExp . fresh));
101127 | (_ , Unknown (_ )) =>
128+ /* Record sample if this type is probed */
129+ let * () = record_type_probe(~targets, t, e);
102130 let + e = recur(e);
103131 Some (e );
104132 | (Cons (d1 , d2 ), List (ty )) =>
0 commit comments