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
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
(* SPDX-License-Identifier: AGPL-3.0-or-later *)
(* Copyright © 2021-2024 OCamlPro *)
(* Written by the Owi programmers *)

include (
  struct
    type vbool = bool

    type int32 = Int32.t

    let pp_int32 fmt i = Fmt.pf fmt "%ld" i

    type int64 = Int64.t

    let pp_int64 fmt i = Fmt.pf fmt "%Ld" i

    type float32 = Float32.t

    let pp_float32 = Float32.pp

    type float64 = Float64.t

    let pp_float64 = Float64.pp

    let const_i32 x = x

    let const_i64 x = x

    let const_f32 x = x

    let const_f64 x = x

    include Concrete_value

    let pp_ref_value = Concrete_value.pp_ref_value

    module Ref = struct
      let get_func (r : ref_value) : Func_intf.t Value_intf.get_ref =
        match r with
        | Funcref (Some f) -> Ref_value f
        | Funcref None -> Null
        | _ -> Type_mismatch

      let get_externref (type t) (r : ref_value) (t : t Type.Id.t) :
        t Value_intf.get_ref =
        match r with
        | Externref (Some (E (ety, v))) -> (
          match Type.Id.provably_equal t ety with
          | None -> assert false
          | Some Equal -> Ref_value v )
        | _ -> assert false
    end

    module Bool = struct
      let const c = c

      let not = not

      let and_ = ( && )

      let or_ = ( || )

      let int32 = function true -> 1l | false -> 0l

      let pp = Fmt.bool
    end

    module I32 = struct
      include Int32
      include Convert.Int32

      let to_bool i = Int32.ne i 0l

      let eq_const = eq
    end

    module I64 = struct
      include Int64
      include Convert.Int64

      let eq_const = eq
    end

    module F32 = struct
      include Float32
      include Convert.Float32
    end

    module F64 = struct
      include Float64
      include Convert.Float64
    end
  end :
    Value_intf.T
      with type vbool = Bool.t
       and type int32 = Int32.t
       and type int64 = Int64.t
       and type float32 = Float32.t
       and type float64 = Float64.t
       and type ref_value = Concrete_value.ref_value
       and type t = Concrete_value.t )