From 05f249ce9a7e38857f2144b153a841ff96cc7d06 Mon Sep 17 00:00:00 2001 From: Ulf Wiger Date: Tue, 20 Jan 2026 21:09:34 +0100 Subject: [PATCH] Support multiple clauses in select() match specs --- patches/stdlib/gen_server.erl | 2 +- src/gproc.erl | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/patches/stdlib/gen_server.erl b/patches/stdlib/gen_server.erl index be2900a..588b7a8 100644 --- a/patches/stdlib/gen_server.erl +++ b/patches/stdlib/gen_server.erl @@ -797,7 +797,7 @@ format_status(Opt, StatusData) -> end, Header = lists:concat(["Status for generic server ", NameTag]), Log = sys:get_debug(log, Debug, []), - Specific = + Specific = case erlang:function_exported(Mod, format_status, 2) of true -> case catch Mod:format_status(Opt, [PDict, State]) of diff --git a/src/gproc.erl b/src/gproc.erl index 1799662..5b7281a 100644 --- a/src/gproc.erl +++ b/src/gproc.erl @@ -2895,17 +2895,18 @@ monitor_me() -> end. +pattern(L, Ctxt) when is_list(L) -> + [pattern_(P, Ctxt) || P <- L]. - -pattern([{'_', Gs, As}], T) -> +pattern_({'_', Gs, As}, T) -> ?l, {HeadPat, Vs} = headpat(T, '$1', '$2', '$3'), - [{HeadPat, rewrite(Gs,Vs), rewrite(As,Vs)}]; -pattern([{{A,B,C},Gs,As}], Scope) -> + {HeadPat, rewrite(Gs,Vs), rewrite(As,Vs)}; +pattern_({{A,B,C},Gs,As}, Scope) -> ?l, {HeadPat, Vars} = headpat(Scope, A,B,C), - [{HeadPat, rewrite(Gs,Vars), rewrite(As,Vars)}]; -pattern([{Head, Gs, As}], Scope) -> + {HeadPat, rewrite(Gs,Vars), rewrite(As,Vars)}; +pattern_({Head, Gs, As}, Scope) -> ?l, {S, T} = get_s_t(Scope), case is_var(Head) of @@ -2914,7 +2915,7 @@ pattern([{Head, Gs, As}], Scope) -> Vs = [{Head, obj_prod()}], %% the headpat function should somehow verify that Head is %% consistent with Scope (or should we add a guard?) - [{HeadPat, rewrite(Gs, Vs), rewrite(As, Vs)}]; + {HeadPat, rewrite(Gs, Vs), rewrite(As, Vs)}; false -> erlang:error(badarg) end.