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
open! Stdlib
type t = string * int
exception Bad_magic_number of string
exception Bad_magic_version of t
let size = 12
let kind_of_string = function
| "Caml1999X" -> "exe"
| "Caml1999I" -> "cmi"
| "Caml1999O" -> "cmo"
| "Caml1999A" -> "cma"
| "Caml1999Y" -> "cmx"
| "Caml1999Z" -> "cmxa"
| "Caml2007D" -> "cmxs"
| "Caml2012T" -> "cmt"
| "Caml1999M" -> "impl"
| "Caml1999N" -> "intf"
| _ -> raise Not_found
let of_string s =
try
if String.length s <> size then raise Not_found;
let kind = String.sub s ~pos:0 ~len:9 in
let v = String.sub s ~pos:9 ~len:3 in
let _ = kind_of_string kind in
kind, int_of_string v
with _ -> raise (Bad_magic_number s)
let kind (s, _) =
match kind_of_string s with
| "exe" -> `Exe
| "cmo" -> `Cmo
| "cma" -> `Cma
| other -> `Other other
let to_string (k, v) = Printf.sprintf "%s%03d" k v
let compare (p1, n1) (p2, n2) =
match String.compare p1 p2 with
| 0 -> compare n1 n2
| n -> n
let equal a b = compare a b = 0
let v =
let current = Ocaml_version.current in
match current with
| 4 :: 13 :: _ -> 30
| 4 :: 14 :: _ -> 31
| 5 :: 00 :: _ -> 32
| 5 :: 01 :: _ -> 33
| 5 :: 02 :: _ -> 34
| 5 :: 03 :: _ -> 35
| 5 :: 04 :: _ -> 36
| _ ->
if Ocaml_version.compare current [ 4; 13 ] < 0
then failwith "OCaml version unsupported. Upgrade to OCaml 4.13 or newer."
else (
assert (Ocaml_version.compare current [ 5; 5 ] >= 0);
failwith "OCaml version unsupported. Upgrade js_of_ocaml.")
let current_exe = "Caml1999X", v
let current_cmo = "Caml1999O", v
let current_cma = "Caml1999A", v
let current = function
| `Exe -> current_exe
| `Cmo -> current_cmo
| `Cma -> current_cma