23
23
24
24
25
25
-module (sys_core_bsm ).
26
+ -compile (warn_missing_spec_all ).
26
27
-moduledoc false .
27
28
-export ([module /2 ]).
28
29
33
34
module (# c_module {defs = Ds }= Mod , _Opts ) ->
34
35
{ok ,Mod # c_module {defs = function (Ds )}}.
35
36
37
+ -spec function ([{cerl :c_var (), cerl :cerl ()}]) -> [{cerl :c_var (), cerl :cerl ()}].
36
38
function ([{# c_var {name = {F ,Arity }}= Name ,B0 }|Fs ]) ->
37
39
try cerl_trees :map (fun bsm_reorder /1 , B0 ) of
38
40
B -> [{Name ,B } | function (Fs )]
@@ -46,13 +48,15 @@ function([]) ->
46
48
47
49
% %% Reorder bit syntax matching to facilitate optimization in further passes.
48
50
51
+ -spec bsm_reorder (cerl :cerl ()) -> cerl :cerl ().
49
52
bsm_reorder (# c_case {arg = # c_var {}= V }= Case ) ->
50
53
bsm_reorder_1 ([V ], Case );
51
54
bsm_reorder (# c_case {arg = # c_values {es = Es }}= Case ) ->
52
55
bsm_reorder_1 (Es , Case );
53
56
bsm_reorder (Core ) ->
54
57
Core .
55
58
59
+ -spec bsm_reorder_1 ([cerl :cerl ()], cerl :c_case ()) -> cerl :cerl ().
56
60
bsm_reorder_1 (Vs0 , # c_case {clauses = Cs0 }= Case ) ->
57
61
case bsm_leftmost (Cs0 ) of
58
62
Pos when Pos > 0 , Pos =/= none ->
@@ -64,6 +68,7 @@ bsm_reorder_1(Vs0, #c_case{clauses=Cs0}=Case) ->
64
68
Case
65
69
end .
66
70
71
+ -spec move_from_col (integer (), [cerl :cerl ()]) -> [cerl :cerl ()].
67
72
move_from_col (Pos , L ) ->
68
73
{First ,[Col |Rest ]} = lists :split (Pos - 1 , L ),
69
74
[Col |First ] ++ Rest .
@@ -72,15 +77,18 @@ move_from_col(Pos, L) ->
72
77
% % Find the leftmost argument that matches a nonempty binary.
73
78
% % Return either 'none' or the argument number (1-N).
74
79
80
+ -spec bsm_leftmost ([cerl :c_clause ()]) -> integer () | none .
75
81
bsm_leftmost (Cs ) ->
76
82
bsm_leftmost_1 (Cs , none ).
77
83
84
+ -spec bsm_leftmost_1 ([cerl :c_clause ()], integer () | none ) -> integer () | none .
78
85
bsm_leftmost_1 ([_ |_ ], 1 ) ->
79
86
1 ;
80
87
bsm_leftmost_1 ([# c_clause {pats = Ps }|Cs ], Pos ) ->
81
88
bsm_leftmost_2 (Ps , Cs , 1 , Pos );
82
89
bsm_leftmost_1 ([], Pos ) -> Pos .
83
90
91
+ -spec bsm_leftmost_2 ([cerl :cerl ()], [cerl :c_clause ()], integer (), integer () | none ) -> integer () | none .
84
92
bsm_leftmost_2 (_ , Cs , Pos , Pos ) ->
85
93
bsm_leftmost_1 (Cs , Pos );
86
94
bsm_leftmost_2 ([# c_binary {segments = [_ |_ ]}|_ ], Cs , N , _ ) ->
0 commit comments