comp.lang.ada
 help / color / mirror / Atom feed
From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: Gem 39 - compiler specific?
Date: Thu, 3 Sep 2009 09:26:56 +0200
Date: 2009-09-03T09:26:56+02:00	[thread overview]
Message-ID: <19268dbw82hf4.aii8as09aapk.dlg@40tude.net> (raw)
In-Reply-To: h7mumh$707$1@munin.nbi.dk

On Wed, 2 Sep 2009 18:20:36 -0500, Randy Brukardt wrote:

> "Maciej Sobczak" <see.my.homepage@gmail.com> wrote in message 
> news:9e0bbbcd-260f-48ed-8043-d6280c633e85@h3g2000yqa.googlegroups.com...
>> Consider:
>>
>> http://www.adacore.com/2008/06/09/gem-39/
>>
>> The example code performs Unchecked_Conversion between addresses of
>> two different array types.
>> As far as I understand, there is no standard provision for arrays to
>> occupy contiguous memory space (and not even for the alignment of
>> their components) and such a conversion relies heavily on the
>> assumption that arrays can be "overlaid" by plain address
>> reinterpretation.
>>
>> Still, this technique is quite attractive. What is the chance (in
>> practice) to hit the compiler that does not get it "right"?
> 
> This is horrible code; it should never be written in Ada 95 or newer! The 
> problem is that System.Address is not necessarily the same as a general 
> access type, so this Unchecked_Conversion may not work (or may not even 
> compile) on another implementation. (It won't on at least some versions of 
> Janus/Ada, for instance.)
> 
> Ada 95 provides System.Address_to_Access_Conversions for this purpose, so at 
> the very least the writer of the Rock (it surely isn't a "Gem"!!!) should 
> have used it:
> 
> procedure Write_Buffer
>       (Stream : not null access Ada.Streams.Root_Stream_Type'Class;
>        Item   : in Buffer)  is
>       Item_Size : constant Stream_Element_Offset :=
>                      Buffer'Object_Size / Stream_Element'Size;
> 
>      subtype SEA is Stream_Element_Array (1..Item_Size);
> 
>      package A2A is new System.Address_to_Access_Conversions (SEA);
> 
> begin
>       Ada.Streams.Write (Stream.all, A2A.To_Pointer (Item'Address).all);
> end Write_Buffer;
> 
> (As an aside, this technique could not work in Janus/Ada if Buffer was an 
> unconstrained array: 'Address of an unconstrained array points at the array 
> descriptor, not the data.

It must point to the first array element 13.3(14). BTW, it is interesting
where it should point when the array is empty.

> (That's in fact true for all objects in Janus/Ada: 
> there is a static part and an optional dynamic part, and all operations like 
> 'Address and 'Size point at the static part. That was decided long before 
> Ada 95 came around and tried to change these definitions; it's not practical 
> to change in Janus/Ada as address clauses could not be made to work - among 
> other things - if the static part is ignored.)

Skewed address is not a problem here. The problem is that
System.Address_To_Access_Conversions should take an access type as a
parameter rather than declare it new. This makes its use quite limited.

-- 
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de



  reply	other threads:[~2009-09-03  7:26 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-09-02 20:38 Gem 39 - compiler specific? Maciej Sobczak
2009-09-02 23:20 ` Randy Brukardt
2009-09-03  7:26   ` Dmitry A. Kazakov [this message]
2009-09-03 15:26     ` Adam Beneschan
2009-09-03 16:38       ` Dmitry A. Kazakov
2009-09-03 17:27         ` Adam Beneschan
2009-09-03 20:26           ` Dmitry A. Kazakov
2009-09-03 22:06             ` Randy Brukardt
2009-09-04  7:29               ` Dmitry A. Kazakov
2009-09-04 12:07                 ` Maciej Sobczak
2009-09-04 13:06                   ` Dmitry A. Kazakov
2009-09-04 17:18                     ` Dmitry A. Kazakov
2009-09-04 20:34                     ` Maciej Sobczak
2009-09-04 22:41                   ` sjw
2009-09-05 20:45                     ` Maciej Sobczak
2009-09-06  6:54                       ` sjw
2009-09-03 21:58           ` Randy Brukardt
2009-09-04 17:26           ` Robert A Duff
2009-09-03 21:53     ` Randy Brukardt
2009-09-03  0:12 ` Adam Beneschan
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox