From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,3fc1c2283df835d5 X-Google-Attributes: gid103376,public X-Google-ArrivalTime: 2003-07-31 03:54:45 PST Path: archiver1.google.com!news1.google.com!newsfeed.stanford.edu!bloom-beacon.mit.edu!nycmny1-snh1.gtei.net!news.gtei.net!newsfeed.mathworks.com!nntp-out.monmouth.com!newspeer.monmouth.com!newsfeed.icl.net!newsfeed.fjserv.net!news-FFM2.ecrc.net!news.iks-jena.de!not-for-mail From: Lutz Donnerhacke Newsgroups: comp.lang.ada Subject: Re: Limited_Controlled types as 'out' arguments Date: Thu, 31 Jul 2003 10:54:44 +0000 (UTC) Organization: IKS GmbH Jena Message-ID: References: <73mfiv811s5187ci5cesv12dsbf88a0rvn@4ax.com> <93nhiv8khhibv15shv21g2t3o179gf69kl@4ax.com> NNTP-Posting-Host: taranis.iks-jena.de X-Trace: branwen.iks-jena.de 1059648884 27145 217.17.192.37 (31 Jul 2003 10:54:44 GMT) X-Complaints-To: usenet@iks-jena.de NNTP-Posting-Date: Thu, 31 Jul 2003 10:54:44 +0000 (UTC) User-Agent: slrn/0.9.7.4 (Linux) Xref: archiver1.google.com comp.lang.ada:41069 Date: 2003-07-31T10:54:44+00:00 List-Id: * Dmitry A Kazakov wrote: >>> 1. to leave "out" parameters uninitialized. This is bad. >> >>This is the most common implementation on most types. (most = unless you >>define an Initialize procedure, default component data, or provide >>initialization data) > > No they all are initialized, but probably with a garbage. (:-)) It's not that funny, if you need those data to manage ressources. Managing data which is possibly garbage is very hard. >>Discriminants of 'out' types have mode 'in'. Always. > > Not always: > > type A (I : Integer := 10) is null record; Ok. >>3) Finalize the current data of the 'limited out' parameter. >> Adjust the assigned data of the 'unlimited out' paramter after return. > > It would be inconsistent. Adjust is called after a raw copy is made, > your subprogram uses a valid type interface instead. And you better > don't do it after Finalize [+ other destructors] were called. Consider > a task object as a member of your limited type. I still do not get it completely. ------------------------------------------------------------------------ with Ada.Finalization; package t1 is type Char_Access is access Character; type Test is new Ada.Finalization.Limited_Controlled with record a : Char_Access; end record; procedure Initialize(o : in out Test); procedure Finalize(o : in out Test); procedure Set(o1, o2 : out Test; i : Test); end t1; ------------------------------------------------------------------------ with Ada.Text_IO; with System.Storage_Elements, System.Address_To_Access_Conversions; with Unchecked_Deallocation; use Ada.Text_IO; package body t1 is procedure Debug (msg : String; p : Char_Access) is use System.Storage_Elements; package Convert is new System.Address_To_Access_Conversions(Character); begin Put_Line(msg & Integer_Address'Image(To_Integer( Convert.To_Address(Convert.Object_Pointer(p)))) & '(' & p.all & ')'); end Debug; global : Character := '0'; procedure Initialize(o : in out Test) is begin o.a := new Character'(global); Debug("Initializing", o.a); global := Character'Succ(global); end Initialize; procedure Free is new Unchecked_Deallocation(Character, Char_Access); procedure Finalize(o : in out Test) is begin Debug("Finalizing ", o.a); Free(o.a); end Finalize; procedure Set(o1, o2 : out Test; i : Test) is begin Debug("Setting from", i.a); Debug("Setting o1 ", o1.a); Debug("Setting o2 ", o2.a); Finalize(o1); Finalize(o2); o1.a := new Character'(global); Debug("Setting to1 ", o1.a); global := Character'Succ(global); o2.a := new Character'(i.a.all); Debug("Setting to2 ", o2.a); end Set; end t1; ------------------------------------------------------------------------ with t1; use t1; procedure t is a, b : Test; begin Set(a, a, b); end t; ------------------------------------------------------------------------ Results in: Initializing 134630800(0) Initializing 134630816(1) Setting from 134630816(1) Setting o1 134630800(0) Setting o2 134630800(0) Finalizing 134630800(0) raised PROGRAM_ERROR : t1.adb:14 Finalizing 134630816(1) I'am mad?