open Obc open C open Modules open Idents open Names open Signature let async_global_var_name od = "g_async__" ^ (name od.o_ident) 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_vars cd = List.map (fun od -> let name = async_global_var_name od in let ty = Cty_id (qn_append od.o_class "_async") in name, ty) (filter_async_objs cd) let async_global_objs_defs cd = List.map (fun (name, ty) -> Cvardef (name, ty)) (async_global_objs_vars cd) let async_global_objs_decls cd = List.map (fun (name, ty) -> Cdecl_extern (name, ty)) (async_global_objs_vars cd) let od_is_stateful od = let sig_info = find_value od.o_class in sig_info.node_stateful let async_reset cd = let async_objs = filter_async_objs cd in let stateful = List.filter od_is_stateful async_objs in List.map (fun od -> let global = Cvar (async_global_var_name od) in let field = Cfield (global, local_qn "self") in let reset = cname_of_qn od.o_class ^ "_reset" in Csexpr (Cfun_call (reset, [Caddrof field]))) stateful