File 6071-compiler-remove-NomatchGuard-from-strict-generators.patch of Package erlang

From 5e5d83c6de04e15ab1f45b5926a90c91bb4ae988 Mon Sep 17 00:00:00 2001
From: lucioleKi <isabell@erlang.org>
Date: Tue, 5 Nov 2024 13:26:05 +0100
Subject: [PATCH] compiler: remove NomatchGuard from strict generators

`NomatchGuard` was only needed for strict binary generators to test for non-empty
binaries. Now `TailPat` for strict binary generators is changed to an empty
binary, and `TailClause` is moved before `NomatchClause` for this case.
There is no need to have NomatchGuard anymore.
---
 lib/compiler/src/v3_core.erl | 43 +++++++++++++++++++++---------------
 1 file changed, 25 insertions(+), 18 deletions(-)

diff --git a/lib/compiler/src/v3_core.erl b/lib/compiler/src/v3_core.erl
index 448b321326..a7c04fe04e 100644
--- a/lib/compiler/src/v3_core.erl
+++ b/lib/compiler/src/v3_core.erl
@@ -121,7 +121,7 @@
 -record(itry,      {anno=#a{},args,vars,body,evars,handler}).
 -record(ifilter,   {anno=#a{},arg}).
 -record(igen,      {anno=#a{},acc_pat,acc_guard,
-                    nomatch_pat,nomatch_guard,nomatch_mode,
+                    nomatch_pat,nomatch_mode,
                     tail,tail_pat,arg,
                     refill={nomatch,ignore}}).
 -record(isimple,   {anno=#a{},term :: cerl:cerl()}).
@@ -1605,7 +1605,6 @@ fun_tq(Cs0, L, St0, NameInfo) ->
 lc_tq(Line, E, [#igen{anno=#a{anno=GA}=GAnno,
 		      acc_pat=AccPat,acc_guard=AccGuard,
                       nomatch_pat=NomatchPat,
-                      nomatch_guard=NomatchGuard,
                       nomatch_mode=NomatchMode,
                       tail=Tail,tail_pat=TailPat,
                       refill={RefillPat,RefillAction},
@@ -1626,7 +1625,7 @@ lc_tq(Line, E, [#igen{anno=#a{anno=GA}=GAnno,
     {[FcVar,Var],St2} = new_vars(2, St1),
     Fc = bad_generator([FcVar], FcVar, Arg),
     NomatchClause = make_clause([nomatch_clause,compiler_generated|LA],
-                                NomatchPat, [], NomatchGuard, [Nc]),
+                                NomatchPat, [], [], [Nc]),
     TailClause = make_clause(LA, TailPat, [], [], [Mc]),
     {Lc,Lps,St3} = lc_tq(Line, E, Qs, Sc, St2),
     AccClause = make_clause(LA, AccPat, [], AccGuard, Lps ++ [Lc]),
@@ -1640,7 +1639,15 @@ lc_tq(Line, E, [#igen{anno=#a{anno=GA}=GAnno,
                                             AccPat, [], [], [Sc])
                         end,
     RefillClause = make_clause(LA, RefillPat, [], [], [RefillAction,Sc]),
-    Cs0 = [AccClause,AccClauseNoGuards,NomatchClause,TailClause,RefillClause],
+    Cs0 = [AccClause,AccClauseNoGuards|
+           case TailPat of
+               #ibinary{segments=[]} ->
+                   %% Order clauses for strict binary generator.
+                   [TailClause,NomatchClause,RefillClause];
+               _ ->
+                   %% Order clauses for relaxed generator.
+                   [NomatchClause,TailClause,RefillClause]
+           end],
     Cs = [C || C <- Cs0, C =/= nomatch],
     Fun = #ifun{anno=GAnno,id=[],vars=[Var],clauses=Cs,fc=Fc},
     {#iletrec{anno=GAnno#a{anno=[list_comprehension|GA]},defs=[{{Name,1},Fun}],
@@ -1680,7 +1687,6 @@ bc_tq(Line, Exp, Qs0, St0) ->
 bc_tq1(Line, E, [#igen{anno=#a{anno=GA}=GAnno,
 		       acc_pat=AccPat,acc_guard=AccGuard,
                        nomatch_pat=NomatchPat,
-                       nomatch_guard=NomatchGuard,
                        nomatch_mode=NomatchMode,
                        tail=Tail,tail_pat=TailPat,
                        refill={RefillPat,RefillAction},
@@ -1704,7 +1710,7 @@ bc_tq1(Line, E, [#igen{anno=#a{anno=GA}=GAnno,
           end,
     Fc = bad_generator(FcVars, hd(FcVars), Arg),
     NomatchClause = make_clause([compiler_generated,nomatch_clause|LA],
-                             NomatchPat, [IgnoreVar], NomatchGuard, [Nc]),
+                             NomatchPat, [IgnoreVar], [], [Nc]),
     TailClause = make_clause(LA, TailPat, [IgnoreVar], [], [AccVar]),
     {Bc,Bps,St5} = bc_tq1(Line, E, Qs, AccVar, St4),
     Body = Bps ++ [#iset{var=AccVar,arg=Bc},Sc],
@@ -1719,7 +1725,15 @@ bc_tq1(Line, E, [#igen{anno=#a{anno=GA}=GAnno,
                                             AccPat, [IgnoreVar], [], [Sc])
                         end,
     RefillClause = make_clause(LA, RefillPat, [AccVar], [], [RefillAction,Sc]),
-    Cs0 = [AccClause,AccClauseNoGuards,NomatchClause,TailClause,RefillClause],
+    Cs0 = [AccClause,AccClauseNoGuards|
+           case TailPat of
+               #ibinary{segments=[]} ->
+                   %% Order clauses for strict binary generator.
+                   [TailClause,NomatchClause,RefillClause];
+               _ ->
+                   %% Order clauses for relaxed generator.
+                   [NomatchClause,TailClause,RefillClause]
+           end],
     Cs = [C || C <- Cs0, C =/= nomatch],
     Fun = #ifun{anno=GAnno,id=[],vars=Vars,clauses=Cs,fc=Fc},
 
@@ -1873,7 +1887,6 @@ get_qual_anno(Abstract) -> element(2, Abstract).
 %%    generator in the qualifier list input.
 %%  - nomatch_pat is the no-match pattern, e.g. <<X,_:X,Tail/bitstring>>
 %%    for <<X,1:X>> <= Expr.
-%%  - nomatch_guard is the list of guards to add to the no-match clause.
 %%  - nomatch_mode is either skip (not matching elements of the relaxed
 %%    generator have to be silently skipped by the comprehension) or a
 %%    value X (to be used in the {badmatch, X} error a strict generator
@@ -1914,7 +1927,7 @@ generator(Line, {Generate,Lg,P0,E}, Gs, St0) when Generate =:= generate;
                   end,
     {Ce,Pre,St4} = safe(E, St3),
     Gen = #igen{anno=#a{anno=GA},acc_pat=AccPat,acc_guard=Cg,
-                nomatch_pat=NomatchPat,nomatch_guard=[],nomatch_mode=NomatchMode,
+                nomatch_pat=NomatchPat,nomatch_mode=NomatchMode,
                 tail=Tail,tail_pat=#c_literal{anno=LA,val=[]},arg={Pre,Ce}},
     {Gen,St4};
 generator(Line, {Generate,Lg,P,E}, Gs, St0) when Generate =:= b_generate;
@@ -1965,7 +1978,7 @@ generator(Line, {Generate,Lg,P,E}, Gs, St0) when Generate =:= b_generate;
             NomatchPat = Cp#ibinary{segments=SkipSegs},
             {Ce,Pre,St5} = safe(E, St4),
             Gen = #igen{anno=GAnno,acc_pat=AccPat,acc_guard=Cg,
-                        nomatch_pat=NomatchPat,nomatch_guard=[],nomatch_mode=skip,
+                        nomatch_pat=NomatchPat,nomatch_mode=skip,
                         tail=Tail,tail_pat=#ibinary{anno=#a{anno=LA},segments=[TailSeg]},
                         arg={Pre,Ce}},
             {Gen,St5};
@@ -1973,23 +1986,18 @@ generator(Line, {Generate,Lg,P,E}, Gs, St0) when Generate =:= b_generate;
             {AccSegs,Tail,TailSeg,St2} = append_tail_segment(Segs, St1),
             AccPat = Cp#ibinary{segments=AccSegs},
             {Cg,St3} = lc_guard_tests(Gs, St2),
-            Guard = #icall{anno=GAnno,
-                           module=#c_literal{anno=GA,val=erlang},
-                           name=#c_literal{anno=GA,val='=/='},
-                           args=[Tail,#c_literal{anno=GA,val= <<>>}]},
             {Ce,Pre,St4} = safe(E, St3),
             Gen = #igen{anno=GAnno,acc_pat=AccPat,acc_guard=Cg,
                         nomatch_pat=#ibinary{anno=#a{anno=LA},segments=[TailSeg]},
-                        nomatch_guard=[Guard],
                         nomatch_mode=Tail,
-                        tail=Tail,tail_pat=#ibinary{anno=#a{anno=LA},segments=[TailSeg]},
+                        tail=Tail,tail_pat=#ibinary{anno=#a{anno=LA},segments=[]},
                         arg={Pre,Ce}},
             {Gen,St4}
     catch
         throw:nomatch ->
             {Ce,Pre,St1} = safe(E, St0),
             Gen = #igen{anno=#a{anno=GA},acc_pat=nomatch,acc_guard=[],
-                        nomatch_pat=nomatch,nomatch_guard=[],nomatch_mode=skip,
+                        nomatch_pat=nomatch,nomatch_mode=skip,
                         tail_pat=#c_var{name='_'},
                         arg={Pre,Ce}},
             {Gen,St1}
@@ -2089,7 +2097,6 @@ generator(Line, {Generate,Lg,{map_field_exact,_,K0,V0},E}, Gs, St0) when
     Gen = #igen{anno=#a{anno=GA},
 		acc_pat=AccPat,acc_guard=Cg,
                 nomatch_pat=NomatchPat,
-                nomatch_guard=[],
                 nomatch_mode=NomatchMode,
                 tail=IterVar,tail_pat=#c_literal{anno=LA,val=none},
                 refill=Refill,
-- 
2.43.0

openSUSE Build Service is sponsored by