File 0272-beam_ssa_pp-Improve-readability.patch of Package erlang
From aaebf0633d1b1309e91266918ca27ba1e043edfc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?John=20H=C3=B6gberg?= <john@erlang.org>
Date: Thu, 6 Feb 2020 09:54:18 +0100
Subject: [PATCH 2/2] beam_ssa_pp: Improve readability
Sprinkling 'literal' and 'label' everywhere made large switches
more or less unreadable. This commit makes literals `tick-quoted`
and label ordinals ^uptick-prefixed.
This also splits #b_switch{} into multiple lines, as practically
any switch with more than 5 elements was unreadable even with the
above changes.
---
lib/compiler/src/beam_ssa_pp.erl | 40 +++++++++++++++++++++++-----------------
1 file changed, 23 insertions(+), 17 deletions(-)
diff --git a/lib/compiler/src/beam_ssa_pp.erl b/lib/compiler/src/beam_ssa_pp.erl
index 0ddebf500a..aad62612b1 100644
--- a/lib/compiler/src/beam_ssa_pp.erl
+++ b/lib/compiler/src/beam_ssa_pp.erl
@@ -48,7 +48,8 @@ format_function(#b_function{anno=Anno0,args=Args,
io_lib:format("%% Counter = ~p\n", [Counter]),
[format_anno(Key, Value) ||
{Key,Value} <- lists:sort(maps:to_list(Anno))],
- io_lib:format("function ~p:~p(~ts) {\n", [M,F,format_args(Args, FuncAnno)]),
+ io_lib:format("function `~p`:`~p`(~ts) {\n",
+ [M, F, format_args(Args, FuncAnno)]),
[format_live_interval(Var, FuncAnno) || Var <- Args],
format_blocks(ReachableBlocks, Blocks, FuncAnno),
case Unreachable of
@@ -140,16 +141,20 @@ format_i_number(#{n:=N}) ->
format_i_number(#{}) -> [].
format_terminator(#b_br{anno=A,bool=#b_literal{val=true},succ=Lbl}, _) ->
- io_lib:format(" ~sbr label ~p\n", [format_i_number(A),Lbl]);
+ io_lib:format(" ~sbr ~ts\n", [format_i_number(A),format_label(Lbl)]);
format_terminator(#b_br{anno=A,bool=#b_literal{val=false},fail=Lbl}, _) ->
- io_lib:format(" ~sbr label ~p\n", [format_i_number(A),Lbl]);
+ io_lib:format(" ~sbr ~ts\n", [format_i_number(A),format_label(Lbl)]);
format_terminator(#b_br{anno=A,bool=Bool,succ=Succ,fail=Fail}, FuncAnno) ->
- io_lib:format(" ~sbr ~ts, label ~p, label ~p\n",
- [format_i_number(A),format_arg(Bool, FuncAnno),Succ,Fail]);
+ io_lib:format(" ~sbr ~ts, ~ts, ~ts\n",
+ [format_i_number(A),
+ format_arg(Bool, FuncAnno),
+ format_label(Succ),
+ format_label(Fail)]);
format_terminator(#b_switch{anno=A,arg=Arg,fail=Fail,list=List}, FuncAnno) ->
- io_lib:format(" ~sswitch ~ts, label ~p, ~ts\n",
- [format_i_number(A),format_arg(Arg, FuncAnno),Fail,
- format_list(List,FuncAnno)]);
+ io_lib:format(" ~sswitch ~ts, ~ts, ~ts\n",
+ [format_i_number(A),format_arg(Arg, FuncAnno),
+ format_label(Fail),
+ format_switch_list(List, FuncAnno)]);
format_terminator(#b_ret{anno=A,arg=Arg}, FuncAnno) ->
io_lib:format(" ~sret ~ts\n", [format_i_number(A),format_arg(Arg, FuncAnno)]).
@@ -189,24 +194,25 @@ format_args(Args, FuncAnno) ->
format_arg(#b_var{}=Arg, FuncAnno) ->
format_var(Arg, FuncAnno);
format_arg(#b_literal{val=Val}, _FuncAnno) ->
- io_lib:format("literal ~p", [Val]);
+ io_lib:format("`~p`", [Val]);
format_arg(#b_remote{mod=Mod,name=Name,arity=Arity}, FuncAnno) ->
- io_lib:format("remote (~ts):(~ts)/~p",
+ io_lib:format("(~ts:~ts/~p)",
[format_arg(Mod, FuncAnno),format_arg(Name, FuncAnno),Arity]);
format_arg(#b_local{name=Name,arity=Arity}, FuncAnno) ->
- io_lib:format("local ~ts/~p", [format_arg(Name, FuncAnno),Arity]);
+ io_lib:format("(~ts/~p)", [format_arg(Name, FuncAnno),Arity]);
format_arg({Value,Label}, FuncAnno) when is_integer(Label) ->
- io_lib:format("{ ~ts, ~p }", [format_arg(Value, FuncAnno),Label]);
+ io_lib:format("{ ~ts, ~ts }", [format_arg(Value, FuncAnno),
+ format_label(Label)]);
format_arg(Other, _) ->
io_lib:format("*** ~p ***", [Other]).
-format_list(List, FuncAnno) ->
- Ss = [io_lib:format("{ ~ts, ~ts }", [format_arg(Val, FuncAnno),format_label(L)]) ||
- {Val,L} <- List],
- io_lib:format("[ ~ts ]", [lists:join(", ", Ss)]).
+format_switch_list(List, FuncAnno) ->
+ Ss = [io_lib:format("{ ~ts, ~ts }", [format_arg(Val, FuncAnno),
+ format_label(L)]) || {Val,L} <- List],
+ io_lib:format("[\n ~ts\n ]", [lists:join(",\n ", Ss)]).
format_label(L) ->
- ["label ",integer_to_list(L)].
+ io_lib:format("^~w", [L]).
format_anno(#{n:=_}=Anno) ->
format_anno(maps:remove(n, Anno));
--
2.16.4