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
open Api
exception Kind_mismatch of {expected : Types.Valkind.t; got : Types.Valkind.t}
let check_kind value expected =
let got = Ctypes.getf value Types.Val_repr.kind in
if expected <> got then raise (Kind_mismatch {expected; got})
let unpack_value value field =
let of_ = Ctypes.getf value Types.Val_repr.of_ in
Ctypes.getf of_ field
let unpack : type a. a Value_type.t -> Types.Val.t -> a =
fun typ value ->
match typ with
| I32 ->
check_kind value Types.Valkind.i32 ;
unpack_value value Types.Val_repr.Of.i32
| I64 ->
check_kind value Types.Valkind.i64 ;
unpack_value value Types.Val_repr.Of.i64
| F32 ->
check_kind value Types.Valkind.f32 ;
unpack_value value Types.Val_repr.Of.f32
| F64 ->
check_kind value Types.Valkind.f64 ;
unpack_value value Types.Val_repr.Of.f64
| AnyRef ->
check_kind value Types.Valkind.anyref ;
Ref (unpack_value value Types.Val_repr.Of.ref)
| FuncRef ->
check_kind value Types.Valkind.funcref ;
Ref (unpack_value value Types.Val_repr.Of.ref)
let pack_value kind field value =
let repr = Ctypes.make Types.Val_repr.t in
let of_ =
let of_ = Ctypes.make Types.Val_repr.Of.t in
Ctypes.setf of_ field value ;
of_
in
Ctypes.setf repr Types.Val_repr.kind kind ;
Ctypes.setf repr Types.Val_repr.of_ of_ ;
repr
let pack : type a. a Value_type.t -> a -> Types.Val.t =
fun typ value ->
match typ with
| I32 -> pack_value Types.Valkind.i32 Types.Val_repr.Of.i32 value
| I64 -> pack_value Types.Valkind.i64 Types.Val_repr.Of.i64 value
| F32 -> pack_value Types.Valkind.f32 Types.Val_repr.Of.f32 value
| F64 -> pack_value Types.Valkind.f64 Types.Val_repr.Of.f64 value
| AnyRef ->
let (Ref ref) = value in
pack_value Types.Valkind.anyref Types.Val_repr.Of.ref ref
| FuncRef ->
let (Ref ref) = value in
pack_value Types.Valkind.funcref Types.Val_repr.Of.ref ref