Current section
Files
Jump to
Current section
Files
lib/beam_analyzer.ex
defmodule BeamAnalyzer do
@moduledoc """
The BEAM analyzer.
Get a parsed tree of information about a BEAM file.
"""
defp code(binary) when is_binary(binary) do
{:ok,
{_,
[abstract_code:
{:raw_abstract_v1, code}]}} = :beam_lib.chunks(binary, [:abstract_code])
{:ok, code}
end
defp code(module) do
case :code.get_object_code(module) do
{_module, binary, _filename} ->
code(binary)
{:error, reason} ->
{:error, reason}
end
end
"""
http://www.erlang.org/doc/apps/erts/absform.html
function := {:function, line, name, arity, metadata}
metadata := [clause_1, clause_2, ...]
clause := {:clause, line, params, guards, expressions}
"""
defp do_function(module, name, arity) do
case code(module) do
{:ok, code} ->
function = Enum.find(
code,
fn
{:function, _, n, a, _metadata} ->
name == n and arity == a
_ ->
false
end
)
case function do
nil ->
{:error, :not_found}
_ ->
{:ok, function}
end
{:error, reason} ->
{:error, reason}
end
end
def function(module, name, arity) do
case do_function(module, name, arity) do
{:ok, {:function, _, _name, _, metadata}} ->
{:ok, metadata}
{:error, reason} ->
{:error, reason}
end
end
def functions(module) do
:erlang.get_module_info(module, :functions)
end
def exports(module) do
:erlang.get_module_info(module, :exports)
end
def private_functions(module) do
functions(module) -- exports(module)
end
end