[erlang-patches] Optimize handling of local fun variables in v3_kernel
Fredrik
fredrik@REDACTED
Fri Jan 18 10:41:03 CET 2013
Hello,
Graduated to master!
Thanks for your contribution!
BR Fredrik Gustafsson
Erlang OTP Team
On 01/15/2013 11:39 AM, Anthony Ramine wrote:
> Hi Fredrik,
>
> I can't find any modules nor on_load cases in cover_SUITE.
>
> Regards,
>
> -- Anthony Ramine Le 15 janv. 2013 à 10:42, Fredrik a écrit :
>> > After further research we can see that the patch is also failing these testcases in tools,
>> > cover_SUITE, modules
>> > cover_SUITE, on_load
>> >
>> > Please fix this and give me notice,
>> >
>> > BR Fredrik Gustafsson
>> > Erlang OTP Team
>> > On 01/10/2013 01:33 PM, Anthony Ramine wrote:
>>> >> Le 9 janv. 2013 à 17:32, Björn Gustavsson a écrit :
>>> >>
>>>> >>> The code handles free variables. As far as I can understand, there
>>>> >>> can be no free variables in this case, so you should simplify the code.
>>> >> You're right and wrong:) There can be no free variables if the Core Erlang
>>> >> code comes from a current Erlang module, but there can be if the Core Erlang
>>> >> was handwritten or generated by my EEP37 patch, for example:
>>> >>
>>> >> module 'foo' ['bar'/1,
>>> >> 'module_info'/0,
>>> >> 'module_info'/1]
>>> >> attributes []
>>> >> 'bar'/1 =
>>> >> %% Line 4
>>> >> fun (_cor0) ->
>>> >> letrec
>>> >> 'Bar'/1 =
>>> >> %% Line 5
>>> >> ( fun (_cor4) ->
>>> >> let<Bar> = 'Bar'/1
>>> >> in case _cor4 of
>>> >> <1> when 'true' ->
>>> >> 1
>>> >> <N> when 'true' ->
>>> >> let<_cor3> =
>>> >> call 'erlang':'*'
>>> >> (N, _cor0)
>>> >> in let<_cor1> =
>>> >> call 'erlang':'-'
>>> >> (N, 1)
>>> >> in let<_cor2> =
>>> >> apply Bar
>>> >> (_cor1)
>>> >> in call 'erlang':'*'
>>> >> (_cor3, _cor2)
>>> >> end
>>> >> -| [{'id',{0,0,'Bar'}}] )
>>> >> in 'Bar'/1
>>> >> 'module_info'/0 =
>>> >> fun () ->
>>> >> call 'erlang':'get_module_info'
>>> >> ('foo')
>>> >> 'module_info'/1 =
>>> >> fun (_cor0) ->
>>> >> call 'erlang':'get_module_info'
>>> >> ('foo', _cor0)
>>> >> end
>>> >>
>>> >> In 'bar'/1, _cor0 is a free variable inside 'Bar'/1; thus free variables need
>>> >> to be handled to remove the reverse eta conversion in a future-proof way.
>>> >>
>>> >> The differences between master and my patch when running erlc +to_kernel foo.core
>>> >> are:
>>> >>
>>> >> --- foo.kernel.orig 2013-01-10 13:27:28.000000000 +0100
>>> >> +++ foo.kernel 2013-01-10 13:27:36.000000000 +0100
>>> >> @@ -5,18 +5,16 @@
>>> >> attributes []
>>> >> fdef 'bar'/1(_Xcor0) =
>>> >> do
>>> >> - bif (internal 'make_fun'/4)('-bar/1-anonymous-2-', 2, 0, 0, _Xcor0)>> <_ker2>
>>> >> + bif (internal 'make_fun'/4)('-bar/1-Bar/1-0-', 2, 0, 0, _Xcor0)>> <_ker1>
>>> >> then
>>> >> -<<_ker2>>
>>> >> +<<_ker1>>
>>> >> fdef 'module_info'/0() =
>>> >> enter (remote 'erlang':'get_module_info'/1)('foo')
>>> >> fdef 'module_info'/1(_Xcor0) =
>>> >> enter (remote 'erlang':'get_module_info'/2)('foo', _Xcor0)
>>> >> -fdef '-bar/1-anonymous-2-'/2(_ker0, _Xcor0) =
>>> >> - enter (local '-bar/1-Bar/1-0-'/2)(_ker0, _Xcor0)
>>> >> fdef '-bar/1-Bar/1-0-'/2(_Xcor4, _Xcor0) =
>>> >> do
>>> >> - bif (internal 'make_fun'/4)('-bar/1-anonymous-1-', 2, 0, 0, _Xcor0)>> <Bar>
>>> >> + bif (internal 'make_fun'/4)('-bar/1-Bar/1-0-', 2, 0, 0, _Xcor0)>> <Bar>
>>> >> then
>>> >> match _Xcor4
>>> >> alt
>>> >> @@ -34,10 +32,8 @@
>>> >> call (Bar)(_Xcor1)>> <_Xcor2>
>>> >> then
>>> >> do
>>> >> - bif (remote 'erlang':'*'/2)(_Xcor3, _Xcor2)>> <_ker1>
>>> >> + bif (remote 'erlang':'*'/2)(_Xcor3, _Xcor2)>> <_ker0>
>>> >> then
>>> >> -<<_ker1>>
>>> >> +<<_ker0>>
>>> >> end>> <>
>>> >> -fdef '-bar/1-anonymous-1-'/2(V1, _Xcor0) =
>>> >> - enter (local '-bar/1-Bar/1-0-'/2)(V1, _Xcor0)
>>> >> end
>>> >> \ No newline at end of file
>>> >>
>>> >> Fredrik, I'll fix the failing test cases from trace_local_SUITE and come back to you
>>> >> when I'm done. Thanks for the feedback.
>>> >>
>>> >> Regards,
>>> >>
More information about the erlang-patches
mailing list