Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Page
Library
Module
Module type
Parameter
Class
Class type
Source
function.ml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
open Ctypes type t = { mutable pointer : unit ptr; mutable user_data : unit ptr; name : string; } let free t = let () = if not (is_null t.user_data) then let () = Root.release t.user_data in t.user_data <- null in if not (is_null t.pointer) then let () = Bindings.extism_function_free t.pointer in t.pointer <- null let free_all l = List.iter free l let create name ~params ~results ~user_data f = let inputs = CArray.of_list Bindings.Extism_val_type.t params in let n_inputs = Unsigned.UInt64.of_int (CArray.length inputs) in let outputs = CArray.of_list Bindings.Extism_val_type.t results in let n_outputs = Unsigned.UInt64.of_int (CArray.length outputs) in let free' = Some Root.release in let user_data = Root.create user_data in let f current inputs n_inputs outputs n_outputs user_data = let user_data = Root.get user_data in let inputs = CArray.from_ptr inputs (Unsigned.UInt64.to_int n_inputs) in let outputs = CArray.from_ptr outputs (Unsigned.UInt64.to_int n_outputs) in f current inputs outputs user_data in let pointer = Bindings.extism_function_new name (CArray.start inputs) n_inputs (CArray.start outputs) n_outputs f user_data free' in let t = { pointer; user_data; name } in Gc.finalise free t; t