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
|
From: Stephane Glondu <glondu@debian.org>
Date: Thu, 18 Dec 2025 08:44:57 +0100
Subject: Add OCaml 5.4 support
Origin: https://github.com/ocamllibs/stdcompat/pull/70
---
stdcompat__array.ml.in | 19 +++++++++++++++++++
stdcompat__arrayLabels_s.mli.in | 4 ++++
stdcompat__array_s.mli.in | 6 ++++++
tools/compiler_version.ml | 2 ++
tools/compiler_version.mli | 1 +
5 files changed, 32 insertions(+)
diff --git a/stdcompat__array.ml.in b/stdcompat__array.ml.in
index 8bb2998..7b88e49 100644
--- a/stdcompat__array.ml.in
+++ b/stdcompat__array.ml.in
@@ -229,3 +229,22 @@ let rec find_mapi_from index f array =
let find_mapi f array =
find_mapi_from 0 f array
@END_BEFORE_5_1_0@
+
+@BEGIN_BEFORE_5_4_0@
+(* copied from OCaml 5.4 stdlib/array.ml *)
+let equal eq a b =
+ if length a <> length b then false else
+ let i = ref 0 in
+ let len = length a in
+ while !i < len && eq (unsafe_get a !i) (unsafe_get b !i) do incr i done;
+ !i = len
+
+let compare cmp a b =
+ let len_a = length a and len_b = length b in
+ let diff = len_a - len_b in
+ if diff <> 0 then (if diff < 0 then -1 else 1) else
+ let i = ref 0 and c = ref 0 in
+ while !i < len_a && !c = 0
+ do c := cmp (unsafe_get a !i) (unsafe_get b !i); incr i done;
+ !c
+@END_BEFORE_5_4_0@
diff --git a/stdcompat__arrayLabels_s.mli.in b/stdcompat__arrayLabels_s.mli.in
index c09705b..bf1ba30 100644
--- a/stdcompat__arrayLabels_s.mli.in
+++ b/stdcompat__arrayLabels_s.mli.in
@@ -267,4 +267,8 @@ external unsafe_get : 'a array -> int -> 'a = "%array_unsafe_get"
external unsafe_set : 'a array -> int -> 'a -> unit = "%array_unsafe_set"
(** Alias for {!ArrayLabels.unsafe_set} *)
+(* OCaml 5.4 *)
+val equal : eq:('a -> 'a -> bool) -> 'a array -> 'a array -> bool
+val compare : cmp:('a -> 'a -> int) -> 'a array -> 'a array -> int
+
end
diff --git a/stdcompat__array_s.mli.in b/stdcompat__array_s.mli.in
index 837ac58..97b20ff 100644
--- a/stdcompat__array_s.mli.in
+++ b/stdcompat__array_s.mli.in
@@ -258,4 +258,10 @@ external unsafe_get : 'a array -> int -> 'a = "%array_unsafe_get"
external unsafe_set : 'a array -> int -> 'a -> unit = "%array_unsafe_set"
(** Alias for {!Array.unsafe_set} *)
+(* OCaml 5.4 *)
+
+val equal : ('a -> 'a -> bool) -> 'a array -> 'a array -> bool
+val compare : ('a -> 'a -> int) -> 'a array -> 'a array -> int
+
end
+
diff --git a/tools/compiler_version.ml b/tools/compiler_version.ml
index f675a20..856f9d1 100644
--- a/tools/compiler_version.ml
+++ b/tools/compiler_version.ml
@@ -87,6 +87,7 @@ let v5_1_1 = mk 5 1 1
let v5_2_0 = mk 5 2 0
let v5_2_1 = mk 5 2 1
let v5_3_0 = mk 5 3 0
+let v5_4_0 = mk 5 4 0
let known_versions =
[
@@ -133,6 +134,7 @@ let known_versions =
v5_2_0;
v5_2_1;
v5_3_0;
+ v5_4_0;
]
let is_known v = List.mem v known_versions
diff --git a/tools/compiler_version.mli b/tools/compiler_version.mli
index c3ab3d6..ed05e36 100644
--- a/tools/compiler_version.mli
+++ b/tools/compiler_version.mli
@@ -51,6 +51,7 @@ val v5_1_1 : t
val v5_2_0 : t
val v5_2_1 : t
val v5_3_0 : t
+val v5_4_0 : t
val known_versions : t list
|