From eca2974bba3a93531a340b6b890ed8ef59f63239 Mon Sep 17 00:00:00 2001 From: Tom Barthe Date: Thu, 24 Dec 2020 06:41:47 +0100 Subject: [PATCH] Define global variables for async state --- compiler/obc/c/cgen.ml | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/compiler/obc/c/cgen.ml b/compiler/obc/c/cgen.ml index 84286fd..a70b74e 100644 --- a/compiler/obc/c/cgen.ml +++ b/compiler/obc/c/cgen.ml @@ -504,6 +504,8 @@ let step_fun_call vr var_env sig_info objn out args async = | Some async -> args @ [Caddrof out; Caddrof async] | None -> args @ [Caddrof out] +let async_global_var_name od = "g_async__" ^ (name od.o_ident) + (** Generate the statement to call [objn]. [outvl] is a list of lhs where to put the results. [args] is the list of expressions to use as arguments. @@ -521,7 +523,7 @@ let generate_function_call vr var_env obj_env outvl objn args = cop_of_op_aux classln args else let async = match od.o_ack with - | Some _ -> Some (Cvar "GlobalValueToChange") + | Some _ -> Some (Cvar (async_global_var_name od)) | None -> None in (* The step function takes scalar arguments and its own internal @@ -924,6 +926,21 @@ let reset_fun_def_of_class_def cd = } } +let filter_async_objs cd = + List.filter + (fun od -> + match od.o_ack with + | Some _ -> true + | None -> false) + cd.cd_objs + +let async_global_objs_defs cd = + List.map + (fun od -> + let name = async_global_var_name od in + let ty = Cty_id (qn_append od.o_class "_async") in + Cvardef (name, ty)) + (filter_async_objs cd) (** [cdecl_and_cfun_of_class_def cd] translates the class definition [cd] to a C program. *) @@ -937,7 +954,7 @@ let cdefs_and_cdecls_of_class_def cd = let in_struct_decl = in_decl_of_class_def cd in let out_struct_decl = out_decl_of_class_def cd in let async_struct_decl = async_decl_of_class_def cd in - + let objs = async_global_objs_defs cd in let step = fun_def_of_step_fun cd.cd_name cd.cd_objs cd.cd_mems cd.cd_objs step_m in (* TODO(Arduino): let the user choose the backend they want *) @@ -963,7 +980,7 @@ let cdefs_and_cdecls_of_class_def cd = let decls = List.map cdecl_of_cfundef defs in memory_struct_decl @ in_struct_decl @ out_struct_decl @ async_struct_decl - @ decls, defs + @ decls, objs @ defs (** {2 Type translation} *)