Current section

Files

Jump to
ephp src ephp_tracer.erl
Raw

src/ephp_tracer.erl

-module(ephp_tracer).
-author('manuel@altenwald.com').
-behaviour(gen_server).
-include("ephp.hrl").
-export([
start_link/0,
start_link/1,
stop/0,
calls/1,
erase/1
]).
% gen_server callbacks
-export([
init/1,
handle_call/3,
handle_cast/2,
handle_info/2,
code_change/3,
terminate/2
]).
start_link() ->
Output = fun(#stack_trace{file = File, line = Line,
args = Args} = StackTrace) ->
io:format("=> ~s:~b\n\tName => ~s\n\tArgs => ~p~n",
[File, Line, key_name(StackTrace), Args])
end,
start_link(Output).
start_link(Output) ->
Args = [Output],
gen_server:start_link({local, ?MODULE}, ?MODULE, Args, []).
stop() ->
gen_server:stop(?MODULE).
calls(Name) ->
gen_server:cast(?MODULE, {calls, Name}).
erase(Name) ->
gen_server:cast(?MODULE, {erase, Name}).
init([OutputFun]) ->
{ok, #{filters => [],
output => OutputFun}}.
handle_cast(#stack_trace{} = StackTrace, #{filters := Filters} = State) ->
Options = [
{function, key_name(StackTrace)},
{file, filename:absname(StackTrace#stack_trace.file)}
],
Check = fun(Filter) -> lists:member(Filter, Options) end,
case lists:any(Check, Filters) of
true ->
#{output := OutputFun} = State,
OutputFun(StackTrace);
false ->
ok
end,
{noreply, State};
handle_cast({erase, Name}, #{filters := Filters} = State) ->
{noreply, State#{filters => Filters -- [Name]}};
handle_cast({calls, Name}, #{filters := Filters} = State) ->
case lists:member(Name, Filters) of
true -> {noreply, State};
false -> {noreply, State#{filters => [Name|Filters]}}
end.
handle_call(_Msg, _From, State) ->
{reply, ok, State}.
handle_info(_Info, State) ->
{noreply, State}.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
terminate(_Reason, _State) ->
ok.
key_name(#stack_trace{type = undefined, function = Fun}) ->
ephp_data:to_bin(Fun);
key_name(#stack_trace{type = <<"::">>, class = Class, function = Fun}) ->
<<Class/binary, "::", (ephp_data:to_bin(Fun))/binary>>;
key_name(#stack_trace{type = <<"->">>, class = Class, function = Fun}) ->
<<Class/binary, "->", (ephp_data:to_bin(Fun))/binary>>.