|
35 | 35 | variables: outer_ecx.variables,
|
36 | 36 | var_values: outer_ecx.var_values,
|
37 | 37 | is_normalizes_to_goal: outer_ecx.is_normalizes_to_goal,
|
| 38 | + is_coinductive_probe: outer_ecx.is_coinductive_probe, |
| 39 | + predefined_opaques_in_body: outer_ecx.predefined_opaques_in_body, |
| 40 | + max_input_universe, |
| 41 | + search_graph: outer_ecx.search_graph, |
| 42 | + nested_goals: outer_ecx.nested_goals.clone(), |
| 43 | + origin_span: outer_ecx.origin_span, |
| 44 | + tainted: outer_ecx.tainted, |
| 45 | + inspect: outer_ecx.inspect.take_and_enter_probe(), |
| 46 | + }; |
| 47 | + let r = nested_ecx.delegate.probe(|| { |
| 48 | + let r = f(&mut nested_ecx); |
| 49 | + nested_ecx.inspect.probe_final_state(delegate, max_input_universe); |
| 50 | + r |
| 51 | + }); |
| 52 | + if !nested_ecx.inspect.is_noop() { |
| 53 | + let probe_kind = probe_kind(&r); |
| 54 | + nested_ecx.inspect.probe_kind(probe_kind); |
| 55 | + outer_ecx.inspect = nested_ecx.inspect.finish_probe(); |
| 56 | + } |
| 57 | + r |
| 58 | + } |
| 59 | + |
| 60 | + pub(in crate::solve) fn enter_coinductively( |
| 61 | + self, |
| 62 | + f: impl FnOnce(&mut EvalCtxt<'_, D>) -> T, |
| 63 | + ) -> T { |
| 64 | + let ProbeCtxt { ecx: outer_ecx, probe_kind, _result } = self; |
| 65 | + |
| 66 | + let delegate = outer_ecx.delegate; |
| 67 | + let max_input_universe = outer_ecx.max_input_universe; |
| 68 | + let mut nested_ecx = EvalCtxt { |
| 69 | + delegate, |
| 70 | + variables: outer_ecx.variables, |
| 71 | + var_values: outer_ecx.var_values, |
| 72 | + is_normalizes_to_goal: outer_ecx.is_normalizes_to_goal, |
| 73 | + is_coinductive_probe: true, |
38 | 74 | predefined_opaques_in_body: outer_ecx.predefined_opaques_in_body,
|
39 | 75 | max_input_universe,
|
40 | 76 | search_graph: outer_ecx.search_graph,
|
|
0 commit comments