Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:25
erlang
2137-erts_internal-Add-support-functions-for-ma...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
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
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor