Plans for stricter record semantics in R8

Bjorn Gustavsson <>
Mon Oct 16 14:26:45 CEST 2000


In R8, we preliminary plan to stricten the test for valid records
in cases like:

func(R) ->
   A = R#r.field,
   ...
   R#r{field=New}.

In the present implementation, there is no test that R is bound to
a record of the correct size and that the first element is the record
tag. (Retrieving a field is simple a call to element/2 and updating
one field is done through a call to setelement/3.)

However, if you access more than one field at the same time, as in

func(R) ->
   R#r{field1=A,field2=B} = R,
   ...
   R#r{field1=New1,field2=New2}.

the type of R will be checked.

In R8, we plan to always check the record types.

To avoid slowing down record operations, we plan to introduce some
new optimisations:

(1) Using a destructive version of setelement/3 to speed up updates
    of multiple fields. (The update of the first field will be done
    with the normal setelement/3, to avoid both nasty semantic problems
    and nasty crashes in the garbage collector. :-) )

(2) Avoiding multiple type tests on record variables. Typically, the
    same record is typically used several times within a single function.
    In the present implementation, type tests (at least to ensure that it
    is a tuple) will be done every time the record is accessed. It is
    enough to test the type once.

On the average, we except that these optimsations will actually make
record operations faster.

Drawbacks: Sloppy code that depends on the records tests not being done
will stop to work.

/Björn
-- 
Björn Gustavsson            Ericsson Utvecklings AB
      ÄT2/UAB/F/P
			    BOX 1505
+46 8 727 56 87 	    125 25 Älvsjö



More information about the erlang-questions mailing list