comp.lang.ada
 help / color / mirror / Atom feed
From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: [announcement] SYSAPI and SYSSVC for Windows
Date: Wed, 24 Dec 2003 12:20:45 +0100
Date: 2003-12-24T12:20:45+01:00	[thread overview]
Message-ID: <bsbsfg$bnln4$1@ID-77047.news.uni-berlin.de> (raw)
In-Reply-To: wccekuv9lyi.fsf@shell01.TheWorld.com

Robert A Duff wrote:

> "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de> writes:
> 
>> Ekkehard Morgenstern wrote:
> 
>> > so I could've just used a tagged limited record?
>> > 
>> > Like this:
>> > 
>> >     type T is tagged limited
>> >     record
>> >         A : My_Array_Type;
>> >     end record;
>> > 
>> >     procedure F ( O : in out T ) is
>> >         Ptr : My_Array_Cell_Ptr;
>> >     begin
>> >         Ptr := O.A(1)'Access;
>> >     end;
>> > 
>> > Right?
>> 
>> No. It is unrelated. The thing you are getting access of has to be
>> aliased. So it is the array elements which has to be, for example:
>> 
>>    type T is limited private;
>> private
>>    type Integer_Array is array (Integer range <>) of aliased Integer;
>>    type T is limited record
>>       A : Integer_Array (1..3);
>>    end record;
>> 
>>    procedure F (O : in out T ) is
>>    begin
>>        ... O.A(1)'Access; -- This is OK, A(i) are aliased
> 
> No, that's not quite good enough.  The parameter O is considered to be
> nested within F, so you need 'Unchecked_Access instead of 'Access here.
> Whenever you use 'Unchecked_Access, you have to make sure you don't
> use dangling pointers -- so the & operator in C or C++ is more like
> 'Unchecked_Access than 'Access in that regard.

It depends on the target, which was not specified.

Then it is a good style to always write 'Access first, and then to try to
understand why it does not compile. Because if it does not, that probably
indicates a potential design problem.

> The point is: when you say 'Access, the compiler can prove that you
> don't have dangling pointers.  Otherwise, you need 'Unchecked_Access
> (but then you better prove it yourself, or your program might do bad
> things).

Yes.

>> If the array elements be tagged, then you would need not write "aliased"
>> in the array declaration.
> 
> That's not quite right.  Tagged *parameters* (like O in the above
> example) are automatically aliased. But other objects are aliased only
> if declared so (by the "aliased" keyword) or if allocated in the heap by
> "new" (whether tagged or not).

Formally yes, but techincally it is no matter. One can always circumvent
this silly limitation (after all the tagged elements of an array remain
tagged!). So:

type Element is tagged ...
type Element_Ptr is access all Element;
type Container is array (Integer range <>) of Element;
   -- Elements are aliased even if not specified

X : Container (1..3);
X_Ptr : Element_Ptr;
...
X_Ptr := X (1)'Unchecked_Access; -- Illegal

But this is OK:

procedure Get_Ptr (E : in out Element; P : out Element_Ptr) is
begin
   P := E'Unchecked_Access;
end Get_Ptr;

Get_Ptr (X (1), X_Ptr); -- This is fine!

> IMHO, it was a mistake to make tagged parameters automatically aliased.

Agree. But this was rather a consequence of the idea of view conversions,
that was the mistake, IMO.

> We should, instead, have allowed the "aliased" keyword on parameters.

No, I think that "aliased" should better be used as a type qualifier:

type X is aliased tagged ...; -- This is a by-reference type
type X is tagged ...; -- The compiler is free to choose
                      -- (with all the consequences)

For parameters there are access types. IMO it is a bad idea to get pointers
to parameters, if that is really needed one should pass a pointer instead.
A good example is Finalize. There is a nasty problem to get a pointer to
the parameter of Finalize, because there is no way to figure out which pool
it should be. For by-reference types it should be sort of:

procedure Finalize (Object : access not all Object_Type); -- (:-))

Then I would disallow overloading like this:

procedure Foo (Object : access Object_Type);
procedure Foo (Object : in out Object_Type);

Instead of this I would make access types transparent to primitive
operations, as they are to array indexing and record member extraction.

> Summary: To get an access value to an existing object, you must first
> make sure it's aliased (which means allocated on the heap, explicitly
> declared "aliased", or a tagged parameter).  Then you must worry about
> accessibility level (which determines whether you should use 'Access or
> 'Unchecked_Access).

-- 
Merry Christmas!
Dmitry A. Kazakov
www.dmitry-kazakov.de



  reply	other threads:[~2003-12-24 11:20 UTC|newest]

Thread overview: 67+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-12-17 19:17 [announcement] SYSAPI and SYSSVC for Windows amado.alves
2003-12-17 19:56 ` Georg Bauhaus
2003-12-18  9:08 ` Dmitry A. Kazakov
2003-12-18 12:14   ` Ekkehard Morgenstern
2003-12-18 13:31     ` Georg Bauhaus
2003-12-19 10:45       ` Ekkehard Morgenstern
2003-12-19 17:12         ` Georg Bauhaus
2003-12-19 17:22           ` Vinzent 'Gadget' Hoefler
2003-12-20  0:21           ` Ekkehard Morgenstern
2003-12-20  2:18             ` Georg Bauhaus
2003-12-20  4:40               ` Ekkehard Morgenstern
2003-12-21  3:45                 ` Georg Bauhaus
2003-12-21 19:01                   ` Piracy was " Robert I. Eachus
2003-12-18 14:32     ` Dmitry A. Kazakov
2003-12-19 11:11       ` Ekkehard Morgenstern
2003-12-19 15:15         ` Hyman Rosen
2003-12-19 15:50           ` Ekkehard Morgenstern
2003-12-19 16:48             ` Hyman Rosen
2003-12-19 16:57               ` Hyman Rosen
2003-12-20  1:17               ` Ekkehard Morgenstern
2003-12-21  2:19                 ` Hyman Rosen
2003-12-21 10:34                   ` Ekkehard Morgenstern
2003-12-22  9:02                     ` Hyman Rosen
2003-12-22 15:17                       ` Ekkehard Morgenstern
2003-12-22 15:08                     ` Hyman Rosen
2003-12-22 15:31                       ` Ekkehard Morgenstern
2003-12-22 16:35                         ` Ekkehard Morgenstern
2003-12-23  1:47                           ` Hyman Rosen
2003-12-23  8:40                             ` Ekkehard Morgenstern
2003-12-23  9:05                               ` Stephen Leake
2003-12-19 17:06         ` Dmitry A. Kazakov
2003-12-20  1:49           ` Ekkehard Morgenstern
2003-12-20 11:13             ` Dmitry A. Kazakov
2003-12-20 13:40               ` Ekkehard Morgenstern
2003-12-20 17:21                 ` Dmitry A. Kazakov
2003-12-20 19:52                   ` Ekkehard Morgenstern
2003-12-21  4:24                     ` Georg Bauhaus
2003-12-21 13:42                     ` Dmitry A. Kazakov
2003-12-21 15:48                       ` Ekkehard Morgenstern
2003-12-21 17:46                         ` Michal Morawski
2003-12-21 18:05                           ` Ekkehard Morgenstern
2003-12-22  0:50                             ` Robert I. Eachus
2003-12-23 23:02                       ` Robert A Duff
2003-12-24 11:20                         ` Dmitry A. Kazakov [this message]
2003-12-24 16:57                           ` Robert A Duff
2003-12-25 14:00                             ` Dmitry A. Kazakov
2003-12-28  1:49                       ` Dave Thompson
  -- strict thread matches above, loose matches on Subject: below --
2003-12-15 14:18 Ekkehard Morgenstern
2003-12-15 15:10 ` Ekkehard Morgenstern
2003-12-15 17:10 ` Jeffrey Carter
2003-12-15 18:38   ` Ekkehard Morgenstern
2003-12-16  0:25     ` Stephen Leake
2003-12-16  0:56       ` Ekkehard Morgenstern
2003-12-16  2:47         ` Ludovic Brenta
2003-12-16 17:45           ` Ekkehard Morgenstern
2003-12-16 19:54             ` Ludovic Brenta
2003-12-16 22:09               ` Ekkehard Morgenstern
2003-12-17 15:24                 ` Ludovic Brenta
2003-12-17 23:23                   ` Ekkehard Morgenstern
2003-12-19 18:14                   ` Warren W. Gay VE3WWG
2003-12-16  5:36         ` tmoran
2003-12-16 17:30           ` Ekkehard Morgenstern
2003-12-15 20:44 ` David Marceau
2003-12-16  0:34   ` Ekkehard Morgenstern
2003-12-17 12:05 ` Dmitry A. Kazakov
2003-12-17 15:00   ` Ekkehard Morgenstern
2003-12-20 19:24 ` Ekkehard Morgenstern
replies disabled

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