https://gitlab.com/tezos/tezos
Raw File
Tip revision: e5df8d3840ea4022271fa14f27645aa6c7bc9dd3 authored by Alain Mebsout on 15 March 2024, 16:39:29 UTC
Doc: changelog
Tip revision: e5df8d3
api_funcs_desc.ml
(*****************************************************************************)
(*                                                                           *)
(* Open Source License                                                       *)
(* Copyright (c) 2022 TriliTech <contact@trili.tech>                         *)
(*                                                                           *)
(* Permission is hereby granted, free of charge, to any person obtaining a   *)
(* copy of this software and associated documentation files (the "Software"),*)
(* to deal in the Software without restriction, including without limitation *)
(* the rights to use, copy, modify, merge, publish, distribute, sublicense,  *)
(* and/or sell copies of the Software, and to permit persons to whom the     *)
(* Software is furnished to do so, subject to the following conditions:      *)
(*                                                                           *)
(* The above copyright notice and this permission notice shall be included   *)
(* in all copies or substantial portions of the Software.                    *)
(*                                                                           *)
(* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR*)
(* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,  *)
(* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL   *)
(* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER*)
(* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING   *)
(* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER       *)
(* DEALINGS IN THE SOFTWARE.                                                 *)
(*                                                                           *)
(*****************************************************************************)

open Ctypes
module Types = Api_types

(** This functor is used by Ctypes to generate function bindings for the
    Wasmer C API. *)
module Functions (S : FOREIGN) = struct
  open S

  (** This functor corresponds to the [WASM_DECLARE_VEC] macro in [wasm.h]. *)
  module Declare_vec (Vector : sig
    include Types.Named_type

    type item

    val item : item typ
  end) =
  struct
    let new_empty =
      foreign
        ("wasm_" ^ Vector.name ^ "_new_empty")
        (ptr Vector.t @-> returning void)

    let new_ =
      foreign
        ("wasm_" ^ Vector.name ^ "_new")
        (ptr Vector.t @-> size_t @-> ptr Vector.item @-> returning void)

    let new_uninitialized =
      foreign
        ("wasm_" ^ Vector.name ^ "_new_uninitialized")
        (ptr Vector.t @-> size_t @-> returning void)

    let delete =
      foreign
        ("wasm_" ^ Vector.name ^ "_delete")
        (ptr Vector.t @-> returning void)
  end

  (** Generate a pointer type from another type. *)
  module Ptr (Item : sig
    val name : string

    type t

    val t : t typ
  end) =
  struct
    include Item

    type t = Item.t Ctypes.ptr

    let t = ptr Item.t
  end

  (** Functions with the [wasmer_] prefix *)
  module Wasmer = struct
    module Compiler = struct
      let is_available =
        foreign
          "wasmer_is_compiler_available"
          (Types.Wasmer.Compiler.t @-> returning bool)
    end

    module Features = struct
      let new_ =
        foreign
          "wasmer_features_new"
          (void @-> returning (ptr Types.Wasmer.Features.t))

      let bulk_memory =
        foreign
          "wasmer_features_bulk_memory"
          (ptr Types.Wasmer.Features.t @-> bool @-> returning bool)

      let memory64 =
        foreign
          "wasmer_features_memory64"
          (ptr Types.Wasmer.Features.t @-> bool @-> returning bool)

      let module_linking =
        foreign
          "wasmer_features_module_linking"
          (ptr Types.Wasmer.Features.t @-> bool @-> returning bool)

      let multi_memory =
        foreign
          "wasmer_features_multi_memory"
          (ptr Types.Wasmer.Features.t @-> bool @-> returning bool)

      let multi_value =
        foreign
          "wasmer_features_multi_value"
          (ptr Types.Wasmer.Features.t @-> bool @-> returning bool)

      let reference_types =
        foreign
          "wasmer_features_reference_types"
          (ptr Types.Wasmer.Features.t @-> bool @-> returning bool)

      let simd =
        foreign
          "wasmer_features_simd"
          (ptr Types.Wasmer.Features.t @-> bool @-> returning bool)

      let tail_call =
        foreign
          "wasmer_features_tail_call"
          (ptr Types.Wasmer.Features.t @-> bool @-> returning bool)

      let threads =
        foreign
          "wasmer_features_threads"
          (ptr Types.Wasmer.Features.t @-> bool @-> returning bool)
    end

    let last_error_length =
      foreign "wasmer_last_error_length" (void @-> returning int)

    let last_error =
      foreign "wasmer_last_error_message" (ptr char @-> int @-> returning int)
  end

  (** Functions with the [wasm_config_] prefix *)
  module Config = struct
    let new_ =
      foreign "wasm_config_new" (void @-> returning (ptr Types.Config.t))

    let set_compiler =
      foreign
        "wasm_config_set_compiler"
        (ptr Types.Config.t @-> Types.Wasmer.Compiler.t @-> returning void)

    let set_features =
      foreign
        "wasm_config_set_features"
        (ptr Types.Config.t @-> ptr Types.Wasmer.Features.t @-> returning void)

    let delete =
      foreign "wasm_config_delete" (ptr Types.Config.t @-> returning void)
  end

  (** Functions with the [wasm_engine_] prefix *)
  module Engine = struct
    let new_with_config =
      foreign
        "wasm_engine_new_with_config"
        (ptr Types.Config.t @-> returning (ptr Types.Engine.t))

    let delete =
      foreign "wasm_engine_delete" (ptr Types.Engine.t @-> returning void)
  end

  (** Functions with the [wasm_store_] prefix *)
  module Store = struct
    let new_ =
      foreign
        "wasm_store_new"
        (ptr Types.Engine.t @-> returning (ptr Types.Store.t))

    let delete =
      foreign "wasm_store_delete" (ptr Types.Store.t @-> returning void)
  end

  (** Functions with the [wasm_module_] prefix *)
  module Module = struct
    let new_ =
      foreign
        "wasm_module_new"
        (ptr Types.Store.t @-> ptr Types.Byte_vec.t
        @-> returning (ptr Types.Module.t))

    let delete =
      foreign "wasm_module_delete" (ptr Types.Module.t @-> returning void)

    let imports =
      foreign
        "wasm_module_imports"
        (ptr Types.Module.t @-> ptr Types.Importtype.Vec.t @-> returning void)

    let exports =
      foreign
        "wasm_module_exports"
        (ptr Types.Module.t @-> ptr Types.Exporttype.Vec.t @-> returning void)
  end

  (** Functions with the [wasm_byte_vec_] prefix *)
  module Byte_vec = struct
    (* NOTE: This module does not use [Declare_vec] to allow us to use the
       better [Ctypes.string] type which takes care of string marshalling. *)

    let new_ =
      foreign
        "wasm_byte_vec_new"
        (ptr Types.Byte_vec.t @-> Ctypes.size_t @-> Ctypes.string
       @-> returning void)

    let new_empty =
      foreign "wasm_byte_vec_new_empty" (ptr Types.Byte_vec.t @-> returning void)

    let delete =
      foreign "wasm_byte_vec_delete" (ptr Types.Byte_vec.t @-> returning void)
  end

  (** Functions with the [wasm_val_vec_] prefix *)
  module Val_vec = Declare_vec (Types.Val_vec)

  (** Functions with the [wasm_valtype_] prefix *)
  module Valtype = struct
    let new_ =
      foreign
        "wasm_valtype_new"
        (Types.Valkind.t @-> returning (ptr Types.Valtype.t))

    let kind =
      foreign
        "wasm_valtype_kind"
        (ptr Types.Valtype.t @-> returning Types.Valkind.t)
  end

  (** Functions with the [wasm_valtype_vec_] prefix *)
  module Valtype_vec = Declare_vec (Types.Valtype.Vec)

  (** Functions with the [wasm_extern_] prefix *)
  module Extern = struct
    let as_func =
      foreign
        "wasm_extern_as_func"
        (ptr Types.Extern.t @-> returning (ptr Types.Func.t))

    let as_memory =
      foreign
        "wasm_extern_as_memory"
        (ptr Types.Extern.t @-> returning (ptr Types.Memory.t))

    let delete =
      foreign "wasm_extern_delete" (ptr Types.Extern.t @-> returning void)
  end

  (** Functions with the [wasm_extern_vec_] prefix *)
  module Extern_vec = Declare_vec (Types.Extern.Vec)

  (** Functions with the [wasm_functype_] prefix *)
  module Functype = struct
    let new_ =
      foreign
        "wasm_functype_new"
        (ptr Types.Valtype.Vec.t @-> ptr Types.Valtype.Vec.t
        @-> returning (ptr Types.Functype.t))

    let params =
      foreign
        "wasm_functype_params"
        (ptr Types.Functype.t @-> returning (ptr Types.Valtype.Vec.t))

    let results =
      foreign
        "wasm_functype_results"
        (ptr Types.Functype.t @-> returning (ptr Types.Valtype.Vec.t))

    let delete =
      foreign "wasm_functype_delete" (ptr Types.Functype.t @-> returning void)
  end

  (** Functions with the [wasm_func_] prefix *)
  module Func = struct
    let new_ =
      foreign
        "wasm_func_new"
        (ptr Types.Store.t @-> ptr Types.Functype.t @-> Types.Func_callback.t
        @-> returning (ptr Types.Func.t))

    let as_extern =
      foreign
        "wasm_func_as_extern"
        (ptr Types.Func.t @-> returning (ptr Types.Extern.t))

    let call =
      foreign
        "wasm_func_call"
        (ptr Types.Func.t @-> ptr Types.Val_vec.t @-> ptr Types.Val_vec.t
        @-> returning (ptr Types.Trap.t))

    let param_arity =
      foreign "wasm_func_param_arity" (ptr Types.Func.t @-> returning size_t)

    let result_arity =
      foreign "wasm_func_result_arity" (ptr Types.Func.t @-> returning size_t)

    let type_ =
      foreign
        "wasm_func_type"
        (ptr Types.Func.t @-> returning (ptr Types.Functype.t))
  end

  (** Functions with the [wasm_memory_] prefix *)
  module Memory = struct
    let data =
      foreign "wasm_memory_data" (ptr Types.Memory.t @-> returning (ptr uint8_t))

    let data_size =
      foreign "wasm_memory_data_size" (ptr Types.Memory.t @-> returning size_t)

    let type_ =
      foreign
        "wasm_memory_type"
        (ptr Types.Memory.t @-> returning (ptr Types.Memorytype.t))
  end

  (** Functions with the [wasm_memory_type_] prefix *)
  module Memory_type = struct
    let limits =
      foreign
        "wasm_memorytype_limits"
        (ptr Types.Memorytype.t @-> returning (ptr Types.Limits.t))

    let delete =
      foreign
        "wasm_memorytype_delete"
        (ptr Types.Memorytype.t @-> returning void)
  end

  (** Functions with the [wasm_instance_] prefix *)
  module Instance = struct
    let new_ =
      foreign
        "wasm_instance_new"
        (ptr Types.Store.t @-> ptr Types.Module.t @-> ptr Types.Extern.Vec.t
        @-> ptr (ptr Types.Trap.t)
        @-> returning (ptr Types.Instance.t))

    let delete =
      foreign "wasm_instance_delete" (ptr Types.Instance.t @-> returning void)

    let exports =
      foreign
        "wasm_instance_exports"
        (ptr Types.Instance.t @-> ptr Types.Extern.Vec.t @-> returning void)
  end

  (** Functions with the [wasm_name_] prefix *)
  module Name = Byte_vec

  (** Functions with the [wasm_message_] prefix *)
  module Message = Name

  (** Functions with the [wasm_trap_] prefix *)
  module Trap = struct
    let new_ =
      foreign
        "wasm_trap_new"
        (ptr Types.Store.t @-> ptr Types.Message.t
        @-> returning (ptr Types.Trap.t))

    let message =
      foreign
        "wasm_trap_message"
        (ptr Types.Trap.t @-> ptr Types.Message.t @-> returning void)

    let delete = foreign "wasm_trap_delete" (ptr Types.Trap.t @-> returning void)
  end

  (** Functions with the [wasm_externtype_] prefix *)
  module Externtype = struct
    let kind =
      foreign
        "wasm_externtype_kind"
        (ptr Types.Externtype.t @-> returning Types.Externkind.t)
  end

  (** Functions with the [wasm_importtype_] prefix *)
  module Importtype = struct
    let module_ =
      foreign
        "wasm_importtype_module"
        (ptr Types.Importtype.t @-> returning (ptr Types.Name.t))

    let name =
      foreign
        "wasm_importtype_name"
        (ptr Types.Importtype.t @-> returning (ptr Types.Name.t))

    let type_ =
      foreign
        "wasm_importtype_type"
        (ptr Types.Importtype.t @-> returning (ptr Types.Externtype.t))
  end

  (** Functions with the [wasm_importtype_vec_] prefix *)
  module Importtype_vec = Declare_vec (Types.Importtype.Vec)

  (** Functions with the [wasm_exporttype_] prefix *)
  module Exporttype = struct
    let name =
      foreign
        "wasm_exporttype_name"
        (ptr Types.Exporttype.t @-> returning (ptr Types.Name.t))

    let type_ =
      foreign
        "wasm_exporttype_type"
        (ptr Types.Exporttype.t @-> returning (ptr Types.Externtype.t))

    let delete =
      foreign
        "wasm_exporttype_delete"
        (ptr Types.Exporttype.t @-> returning void)
  end

  (** Functions with the [wasm_exporttype_vec_] prefix *)
  module Exporttype_vec = Declare_vec (Types.Exporttype.Vec)

  let wat2wasm =
    foreign
      "wat2wasm"
      (ptr Types.Byte_vec.t @-> ptr Types.Byte_vec.t @-> returning void)
end
back to top