geometric memory growth

Ulf Wiger ulf@REDACTED
Sat Nov 26 22:38:48 CET 2005


Den 2005-11-26 19:44:48 skrev Matthias Lang <matthias@REDACTED>:

> I failed to notice that your suggestion only applied to things
> carried in via the environment. So it seemed stranger than it was,
> because it seemed to make funs behave differently to normal functions.
>
> Now I see it's 'merely' that you want record field selectors to be
> more than just syntactic sugar for an element/2 call.

Well, it is.  (:

Or, at least, if Kostis gets his way, it will be.


In OTP R10B, the following code:

   -module(foo).
   -export([new/0,f/1]).
   -record(rec, {a,b}).

   new() -> #rec{}.

   f(R) ->
      R#rec.a.

compiled as:

   new() ->
       {rec,undefined,undefined}.

   f(R) ->
       erlang:element(2,R).

   module_info() ->
       erlang:get_module_info(foo).

   module_info(X) ->
       erlang:get_module_info(foo,X).



and consequently:

2> c(foo).
{ok,foo}
3> foo:f({a,b,c}).
b

(which almost makes Thomas's argument against me moot,
because as things work today, you may or may not get
an exception if State is not a record. If it's a tuple
of sufficient arity, you will get _something_, but quite
possibly not at all what you expected.)

But if we check debug_info for the same module:

           {function,
               7,
               f,
               1,
               [{clause,
                 7,
                 [{var,7,'R'}],
                 [],
                 [{record_field,
                   8,
                   {var,8,'R'},
                   rec,
                   {atom,8,a}}]}]},


It's when the compiler goes beyond this point and
transforms record_field(R, a) that it over-simplifies
and currently produces code that (a) is not always
safe, and (b) sometimes causes memory explosions.

I think these are two very good reasons to make
record field selectors into something more than
just syntactic sugar for element/2.

/Uffe
-- 
Ulf Wiger




More information about the erlang-questions mailing list