51 lines
1.2 KiB
OCaml
51 lines
1.2 KiB
OCaml
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
|
|
|