1-module(read).
2
3-export([lc/0, funfuns/0, bi/0]).
4
5-xref({xx,ff,22}).
6-xref({{all,0},{no,0}}).
7-xref([{{all,0},{i,0}},{{all,0},{x2,5}}]).
8-xref([apa]).
9-xref({all,0}).
10-xref([{{{all},0},{no,0}},{{all,0},{m,x2,5}}]).
11-xref([{{a,14},{q,f,17}}]).
12-xref({{i,f,17},{g,18}}).
13-xref({{j,f,17},{i,g,18}}).
14
15-xref({{funfuns,0},{'$F_EXPR',177}}).
16-xref({{funfuns,0},{?MODULE,'$F_EXPR',178}}).
17-xref({{funfuns,0},{modul,'$F_EXPR',179}}).
18
19lc() ->
20    Tab = ets:new(),
21    [Mt||{_M,Mt} <- ets:tab2list(Tab)].
22
23funfuns() ->
24    A = variable,
25
26    %% Spawn...
27
28    %% Recognized. POS1=28.
29    spawn(fun() -> mod17:fun17() end),
30    spawn(fun local/0),
31    spawn(fun binary_to_term/1), % builtin, not collected
32    spawn({dist,func}),
33    spawn({dist,A}), % {dist,'$F_EXPR',0}
34    spawn_link(fun() -> mod17:fun17() end),
35    spawn_link({dist,func}),
36    spawn_link({dist,A}), % {dist,'$F_EXPR',0}
37
38    %% POS2=POS1+10
39    spawn({dist,func}(arg1,arg2), {d,f}),
40    spawn({dist,func}(arg1,arg2), fun() -> mod42:func() end),
41    spawn_link({dist,func}(arg1,arg2), {d,f}),
42    spawn_link({dist,func}(arg1,arg2), fun() -> mod42:func() end),
43
44    %% POS3=POS2+6
45    spawn(dist, func, [arg1,arg2]), % spawn/3 is builtin
46    spawn(expr, A, [arg1]), % {expr,'$F_EXPR',1}
47    spawn_link(dist, func, [arg1,arg2]), % spawn_link/3 is builtin
48    spawn_link(expr, A, [arg1,arg2]), % {expr,'$F_EXPR',2}
49
50    %% POS4=POS3+6
51    spawn(node, modul, function, []),
52    spawn(node, modul, A, [a]), % {modul,'$F_EXPR',1}
53    spawn({dist,func}(arg1,arg2), spm, spf, [a,b]),
54    spawn({dist,func}(arg1,arg2), spm, A, [a]), % {spm,'$F_EXPR',1}
55    spawn_link({dist,func}(arg1,arg2), spm, spf, [a,b]),
56    spawn_link({dist,func}(arg1,arg2), spm, A, [a]), % {spm,'$F_EXPR',1}
57    spawn_opt(spm, spf, [arg3, arg4], [opt1, bi()]),
58    spawn_opt(spm, A, [a], [opt1, bi()]), % {spm,'$F_EXPR',1}
59
60    %% Not recognized or invalid. POS5=POS4+10
61    spawn(A), % {'$M_EXPR','$F_EXPR',0}
62    spawn(17), % {'$M_EXPR','$F_EXPR',0}
63    spawn_link(A), % {'$M_EXPR','$F_EXPR',0}
64
65    %% POS6=POS5+5
66    spawn({a,b},[1008]), % {'$M_EXPR','$F_EXPR',0}
67    spawn_link({a,b},[1008]), % {'$M_EXPR','$F_EXPR',0}
68
69    spawn(n, A, A), % {n,'$F_EXPR',-1}
70
71    %% POS7=POS6+6
72    spawn(n, A,f,[1007]), % {'$M_EXPR',f,1}, spawn/3 is builtin
73    spawn_opt(A,f,[1007],[]), % {'$M_EXPR',f,1}
74
75    %% Apply...
76
77    %% Recognized. POS8=POS7+6
78    {hej,san}(1002),
79    {hej,A}(1002), % {hej,'$F_EXPR',1}
80    t:A(1003), % {t,'$F_EXPR',1}
81    apply({a,b},[1005]),
82    apply({a,A},[1005]), % {a,'$F_EXPR',1}
83    apply(m,f,[100011]),
84    apply(m,A,[100011]), % {m,'$F_EXPR',1}
85    %% POS9=POS8+8
86    apply(A, f, [bi()]), % {'$M_EXPR',f,1}
87    {erlang,apply}({a,b},[8888]),
88    {erlang,apply}({a,A},[8888]), % {a,'$F_EXPR',1}
89    {erlang,apply}({erlang,apply},[{erlang,not_a_function},[7777]]),
90    apply(erlang, apply, [erlang, apply, [mod, func, [atom77,tjohej]]]),
91    erlang:apply(foo), % not an apply, but an unknown function
92    apply(fun(X) -> math:add3(X) end, [7]),
93    (fun(X) -> q:f(X) end)(3008),
94
95    %% Not recognized or invalid. POS10=POS9+10
96    A:foo(1000), % {'$M_EXPR',foo,1}
97    A(17), % {'$M_EXPR','$F_EXPR',1}
98    A(17,[one,two]), % {'$M_EXPR','$F_EXPR',2}
99    apply(apa,[1001]), % {'$M_EXPR','$F_EXPR',1}
100    {mod1:fun1(hej),san}(1017), % {'$M_EXPR',san,1}
101    A:A(1004), % {'$M_EXPR','$F_EXPR',1}
102    %% POS11=POS10+7
103    apply(A,A,[1006]), % {'$M_EXPR','$F_EXPR',1}
104    apply(A,A,[1009 | 10010]), % {'$M_EXPR','$F_EXPR',-1}
105    apply(m,f,[10000 | 9999]), % {m,f,-1}
106    apply(m,f,a), % {m,f,-1}
107    3(a), % {'$M_EXPR','$F_EXPR',1}
108    apply(3,[a]), % {'$M_EXPR','$F_EXPR',1}
109
110    %% POS12=POS11+8
111    apply(A, A), % number of arguments is not known, {'$M_EXPR','$F_EXPR',-1}
112    Args0 = [list],
113    Args = [a | Args0], % number of arguments is known
114    apply(A, Args), % {'$M_EXPR','$F_EXPR',2}
115    apply(m3, f3, Args), %
116    NotArgs = [is_not, a | list], % number of arguments is not known
117    apply(A, NotArgs), % {'$M_EXPR','$F_EXPR',-1}
118    apply(m4, f4, NotArgs), % {m4,f4,-1}
119
120    %% OTP Internal. POS13=POS12+10
121    erts_debug:apply(dm, df, [17], foobar),
122    erts_debug:apply(debug, A, [], A), % {debug,'$F_EXPR',0}
123    erts_debug:apply(A, A, A, A). % {'$M_EXPR','$F_EXPR',-1}
124
125bi() when length([]) > 17 ->
126    foo:module_info(),
127    module_info(),
128    A = true andalso tjo ,
129    t:foo(A),
130    case true of
131	true when integer(1) ->
132	    X = foo;
133	false ->
134	    X = flopp
135    end,
136    self() ! X == -A orelse false;
137bi() ->
138    %% POS14=POS13+18
139    Z = fun(Y) -> Y end,
140    case true of
141	true when length([a,b]) > 4 ->
142	    F = fun(X) -> X end,
143	    F(3);
144	false  ->
145	    F = 17,
146	    F(3) % {'$M_EXPR','$F_EXPR',1}
147    end,
148    Z(apa),
149    erlang:module_info();
150bi() ->
151    Bin11 = <<1, 17, 42>>,
152    Bin12 = <<"abc">>,
153    false = (Bin11 == Bin12),
154    A = 1, B = 17,
155    Bin3 = <<A, B, (bi()):16>>,
156    <<D:16, E, F/binary>> = Bin3,
157    X = 9, <<(X+1):8>>,
158    _Fyy = <<X:4/little-signed-integer-unit:8>>,
159    D + E + F;
160bi() ->
161    %% EEP37. POS15=POS14+23
162    F = fun Fact(N) when N > 0 ->
163                N * Fact(N - 1);
164            Fact(0) ->
165                1
166        end,
167    F(6),
168    G = fun _(foo) -> bar;
169            _(X) -> X / 3
170        end,
171    G(foo).
172
173local() ->
174    true.
175