From 5f9b1805404d384d4c2b1a01c2cd5bb832592d7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20B=C3=BChler?= <david.buhler@cea.fr> Date: Thu, 13 Oct 2022 09:41:12 +0200 Subject: [PATCH] [Dive] Avoids using Seq.take, removes it from transitioning. --- src/libraries/stdlib/transitioning.ml | 15 ++++----------- src/libraries/stdlib/transitioning.mli | 6 +++--- src/plugins/dive/build.ml | 7 +++---- 3 files changed, 10 insertions(+), 18 deletions(-) diff --git a/src/libraries/stdlib/transitioning.ml b/src/libraries/stdlib/transitioning.ml index ba4203fb98d..eaab4f83716 100644 --- a/src/libraries/stdlib/transitioning.ml +++ b/src/libraries/stdlib/transitioning.ml @@ -62,17 +62,10 @@ module Seq = struct | Nil -> ys () | Cons (x, xt) -> Cons (x, append xt ys) - let take n xs = - if n < 0 then invalid_arg "Seq.take"; - let rec aux n xs = - if n = 0 - then empty - else fun () -> - match xs () with - | Nil -> Nil - | Cons (x, xs) -> Cons (x, aux (n-1) xs) - in - aux n xs + let is_empty xs = + match xs () with + | Nil -> true + | Cons _ -> false let drop n xs = if n < 0 diff --git a/src/libraries/stdlib/transitioning.mli b/src/libraries/stdlib/transitioning.mli index eff4a5548f6..d33ebe8091f 100644 --- a/src/libraries/stdlib/transitioning.mli +++ b/src/libraries/stdlib/transitioning.mli @@ -46,6 +46,9 @@ end module Seq: sig open Stdlib.Seq + (** since 4.14.0 *) + val is_empty: 'a t -> bool + (** since 4.14.0 *) val mapi: (int -> 'a -> 'b) -> 'a t -> 'b t @@ -55,9 +58,6 @@ module Seq: sig (** since 4.11.0 *) val append : 'a t -> 'a t -> 'a t - (** since 4.14.0 *) - val take : int -> 'a t -> 'a t - (** since 4.14.0 *) val drop : int -> 'a t -> 'a t end diff --git a/src/plugins/dive/build.ml b/src/plugins/dive/build.ml index 993c989e2d4..2bb9dbb53a7 100644 --- a/src/plugins/dive/build.ml +++ b/src/plugins/dive/build.ml @@ -183,10 +183,9 @@ let build_node_kind ~is_folded_base lval kinstr = (* Build a scalar node even if kinstr is dead *) Scalar (vi, Cil.typeOfLval lval, offset) | Mem _, _ -> - match - enumerate_cells ~is_folded_base lval kinstr |> Seq.take 2 |> List.of_seq - with - | [node_kind] -> node_kind + let cells_seq = enumerate_cells ~is_folded_base lval kinstr in + match cells_seq () with + | Seq.Cons (node_kind, seq) when Seq.is_empty seq -> node_kind | _ -> Scattered (lval, kinstr) let default_node_locality callstack = -- GitLab