File 2137-erts_internal-Add-support-functions-for-map-comprehe.patch of Package erlang

From 4194ff46bc6575642d7bc7e623fbfb972ac53b69 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org>
Date: Thu, 19 Jan 2023 17:31:56 +0100
Subject: [PATCH 07/12] erts_internal: Add support functions for map
 comprehensions

---
 erts/preloaded/src/erts_internal.erl | 56 ++++++++++++++++++++++++++++
 1 file changed, 56 insertions(+)

diff --git a/erts/preloaded/src/erts_internal.erl b/erts/preloaded/src/erts_internal.erl
index 5363dbd33a..7286c3eedc 100644
--- a/erts/preloaded/src/erts_internal.erl
+++ b/erts/preloaded/src/erts_internal.erl
@@ -33,6 +33,7 @@
 -export([cmp_term/2]).
 -export([map_to_tuple_keys/1, term_type/1, map_hashmap_children/1,
          map_next/3]).
+-export([mc_iterator/1, mc_refill/1]).
 -export([open_port/2, port_command/3, port_connect/2, port_close/1,
 	 port_control/3, port_call/3, port_info/1, port_info/2]).
 
@@ -440,6 +441,61 @@ map_hashmap_children(_M) ->
 map_next(_I, _M, _A) ->
     erlang:nif_error(undefined).
 
+%% Introduced in Erlang/OTP 26. This function is a helper, called from
+%% code generated by the compiler. It must be kept compatible as long
+%% code calling this helper can still be loaded.
+-spec mc_iterator(MapOrIter) -> NI | [] when
+      MapOrIter :: map() | maps:iterator(),
+      NI :: maps:iterator().
+
+mc_iterator(Map) when is_map(Map) ->
+    erts_internal:map_next(0, Map, iterator);
+mc_iterator([Path | Map]) ->
+    %% This is probably an iterator.
+    try erts_internal:map_next(Path, Map, iterator) of
+        Iter ->
+            Iter
+    catch
+        error:badarg ->
+            []
+    end;
+mc_iterator(MapIter) ->
+    %% Possible "used" iterator. Must validate it.
+    case is_map_iter(MapIter) of
+        true -> MapIter;
+        false -> []
+    end.
+
+is_map_iter({_, _, Iter}) ->
+    is_map_iter(Iter);
+is_map_iter(Iter) ->
+    case Iter of
+        [Path | Map] ->
+            try erts_internal:map_next(Path, Map, iterator) of
+                _ ->
+                    true
+            catch
+                error:badarg ->
+                    false
+            end;
+        none -> true;
+        _ -> false
+    end.
+
+%% Introduced in Erlang/OTP 26. This function is a helper, called from
+%% code generated by the compiler. It must be kept compatible as long
+%% code calling this helper can still be loaded.
+-spec mc_refill(IM) -> {K,V,NI} when
+      IM :: nonempty_improper_list(I, M),
+      I :: non_neg_integer(),
+      M :: map(),
+      K :: term(),
+      V :: term(),
+      NI :: maps:iterator().
+
+mc_refill([Path | Map]) ->
+    erts_internal:map_next(Path, Map, iterator).
+
 -spec erts_internal:flush_monitor_messages(Ref, Multi, Res) -> term() when
       Ref :: reference(),
       Multi :: boolean(),
-- 
2.35.3

openSUSE Build Service is sponsored by