From: Stephane Glondu 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 --- stdcompat__array.ml.in +++ 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 --- stdcompat__arrayLabels_s.mli.in +++ 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 --- stdcompat__array_s.mli.in +++ 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 --- tools/compiler_version.ml +++ 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 --- tools/compiler_version.mli +++ 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