From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: Extending a third party tagged type while adding finalization
Date: Mon, 4 Dec 2017 14:55:18 +0100
Date: 2017-12-04T14:55:18+01:00 [thread overview]
Message-ID: <p03k46$k2v$1@gioia.aioe.org> (raw)
In-Reply-To: c9805932-476c-43b4-a56b-7b3853ee44a9@googlegroups.com
On 04/12/2017 14:19, AdaMagica wrote:
> There is no Initialize defined for derived S. This is defined then implicitly as:
>
> procedure Initialize (X: in out S) is
> begin
> Initialize (T (X));
> end Initialize;
>
> This is the calling sequence:
> Init S
> Init T
> Foo S
Which is a wrong sequence per Ada design. Actually it is just
Initialize of S
This wrong sequence is fixed in practice by applying the pattern:
procedure Initialize (X : in out Derived) is
begin
Parent (X).Initialize; -- Ensure parent's initialization
<do user initialization of Derived>
end Initialize;
Using the pattern you get a semantically correct sequence:
-- enter Initialize of S
-- enter Initialize of T
<do user initialization of T>
-- leave Initialize of T
<do user initialization of S>
-- leave Initialize of S
But with Foo it becomes wrong again:
<do user initialization of T> + call Foo of S
<do user initialization of S>
Which is catastrophic and there is *no* way to make it right in presence
of multiple derived types. You cannot announce a call to a deferred
implementation during initialization of a specific type T. That may
happen only after initializations of all derived specific types are
complete.
Semantically it means that it must be called in the initialization of
T'Class. The proper sequence must be:
<do user initialization of T>
<do user initialization of S>
<do user initialization of S'Class>
<do user initialization of T'Class> + call Foo of S
--
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de
next prev parent reply other threads:[~2017-12-04 13:55 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-11-22 12:43 Extending a third party tagged type while adding finalization Jere
2017-11-22 16:42 ` AdaMagica
2017-11-26 17:33 ` Jere
2017-11-26 18:15 ` Dmitry A. Kazakov
2017-11-26 19:31 ` Jere
2017-11-27 9:46 ` AdaMagica
2017-11-27 12:56 ` Jere
2017-11-27 15:00 ` AdaMagica
2017-11-27 16:38 ` Jere
2017-11-27 18:37 ` AdaMagica
2017-11-27 19:53 ` Jere
2017-11-28 11:48 ` AdaMagica
2017-12-03 2:22 ` Jere
2017-12-03 21:53 ` Robert Eachus
2017-12-04 7:58 ` Dmitry A. Kazakov
2017-12-04 14:59 ` Robert Eachus
2017-12-04 15:39 ` Dmitry A. Kazakov
2017-11-27 18:10 ` Shark8
2017-11-27 19:56 ` Jere
2017-11-28 1:55 ` Randy Brukardt
2017-12-03 2:47 ` Jere
2017-12-03 9:29 ` Dmitry A. Kazakov
2017-12-03 15:10 ` AdaMagica
2017-12-03 16:39 ` Dmitry A. Kazakov
2017-12-03 19:34 ` AdaMagica
2017-12-03 19:41 ` Dmitry A. Kazakov
2017-12-04 12:38 ` AdaMagica
2017-12-04 13:19 ` AdaMagica
2017-12-04 13:55 ` Dmitry A. Kazakov [this message]
2017-12-04 15:44 ` AdaMagica
2017-12-04 16:19 ` Dmitry A. Kazakov
2017-12-04 20:54 ` Randy Brukardt
2017-12-04 21:02 ` Dmitry A. Kazakov
2017-12-05 21:09 ` Randy Brukardt
2017-12-05 21:29 ` Dmitry A. Kazakov
2017-12-07 1:13 ` Randy Brukardt
2017-12-07 8:36 ` Dmitry A. Kazakov
2017-12-07 23:22 ` Randy Brukardt
2017-12-08 9:30 ` Dmitry A. Kazakov
2017-12-09 0:17 ` Randy Brukardt
2017-12-11 9:03 ` Dmitry A. Kazakov
2017-12-11 22:42 ` Randy Brukardt
2017-12-12 16:11 ` AdaMagica
2017-12-12 20:08 ` G. B.
2017-12-12 20:32 ` Dmitry A. Kazakov
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox