[erlang-patches] Optimize handling of local fun variables in v3_kernel

Fredrik <>
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