From 0f63c779f4a290a82c94b876388e27df81b0ce2c Mon Sep 17 00:00:00 2001 From: Son Ho Date: Thu, 27 Jan 2022 01:00:01 +0100 Subject: Implement the backward case of translate_return --- src/SymbolicToPure.ml | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) (limited to 'src/SymbolicToPure.ml') diff --git a/src/SymbolicToPure.ml b/src/SymbolicToPure.ml index 8a62ba70..e823016d 100644 --- a/src/SymbolicToPure.ml +++ b/src/SymbolicToPure.ml @@ -858,10 +858,26 @@ and translate_return (opt_v : V.typed_value option) (ctx : bs_ctx) : expression *) match ctx.bid with | None -> + (* Forward function *) let v = Option.get opt_v in let v = typed_value_to_rvalue ctx v in Return v - | Some bid -> raise Unimplemented + | Some bid -> + (* Backward function *) + (* Sanity check *) + assert (opt_v = None); + (* We simply need to return the variables in which we stored the values + * we need to give back. + * See the explanations for the [SynthInput] case in [translate_end_abstraction] *) + let backward_outputs = + T.RegionGroupId.Map.find bid ctx.backward_outputs + in + let field_values = List.map mk_typed_rvalue_from_var backward_outputs in + let ret_value = RvAdt { variant_id = None; field_values } in + let ret_tys = List.map (fun (v : typed_rvalue) -> v.ty) field_values in + let ret_ty = Adt (T.Tuple, ret_tys) in + let ret_value : typed_rvalue = { value = ret_value; ty = ret_ty } in + Return ret_value and translate_function_call (call : S.call) (e : S.expression) (ctx : bs_ctx) : expression = -- cgit v1.2.3