[erlang-questions] Getting code from closures

Richard Carlsson carlsson.richard@REDACTED
Tue Dec 3 14:02:35 CET 2013


On 2013-12-03 13:14 , Thomas Lindgren wrote:
> Hi guys,
>
> Before I start hacking on something, I thought I'd ask whether there
> already is a standard way to get the original code from a compiled
> fun/closure. (I know you can get it for interpreted funs by using fun_info.)
>
> E.g., for code like this:
>
> -module(a).
> -compile(export_all).
> adder(N) -> fun(X) X+N end.
>
> I'd like to be able to write something like this:
>
>  > c(a), F = a:adder(3), magic:get_code(F).
> {fun, 0, [{clause, 0, [{var, 0, 'X'}], [], [{op, '+', {var,
> 0,'X'},{var,0,'N'}}]}], [{'N', 3}]}  %% AST of fun F with free var env
>
> Or the equivalent.

Use fun_info to get the name/arity of the generated function and dig it 
out from the debug_info AST (or for bonus points, reverse-compile the 
beam code)?

Keep in mind that if the code in the fun contains a local call to a 
function in the same module, you'll need to include the code for all 
reachable functions as well. Hence, the whole AST or the .beam file as a 
binary might be more suitable for whatever it is you're doing.

    /Richard




More information about the erlang-questions mailing list