From: Adam Beneschan <adam@irvine.com>
Subject: Re: unexpected behaviour of finalize
Date: Fri, 4 Apr 2008 09:08:28 -0700 (PDT)
Date: 2008-04-04T09:08:28-07:00 [thread overview]
Message-ID: <308722a0-7372-4a2b-9dbd-8d8704a3fcae@s33g2000pri.googlegroups.com> (raw)
In-Reply-To: Pine.LNX.4.64.0804041131050.2100@medsec1.medien.uni-weimar.de
On Apr 4, 2:33 am, stefan-lu...@see.the.signature wrote:
> Hi,
>
> I have written a little program to demonstrate finalisation. The idea is
> to locally declare a singelton object of a class derived from
> Ada.Finalization.Limited_Controlled, and to override the Finalize method.
> When the sigelton object leaves scope, Finalize than cleans up whatever
> needs to be cleaned up. At a first look this appeared to work nicely. But
> when done in a recursive subprogram, Finalize rather unexpectedly seems to
> always read the local parameters of the innermost scope.
>
> Here is a test case:
>
> ---begin fin_test_case.adb
>
> with Ada.Text_IO, Ada.Finalization;
>
> procedure Fin_Test_Case is
> type Fin is new Ada.Finalization.Limited_Controlled with null record;
>
> procedure Do_Something (I: Natural) is
>
> type My_Fin is new Fin with null record;
>
> overriding procedure Finalize(Self: in out My_Fin) is
> S: String := Natural'Image(I);
> begin
> Ada.Text_IO.Put_Line(" Do_Something Finalization " & S);
> end Finalize;
>
> Singleton: My_Fin;
>
> begin -- Do_Something
> Ada.Text_IO.Put_Line(" I = " & Natural'Image(I));
> if I>0 then
> Do_Something(I-1);
> Do_Something(I-1);
> end if;
> end Do_Something;
>
> begin
> Ada.Text_IO.Put_Line("Start Do_Something (2)");
> Do_Something(2);
> Ada.Text_IO.Put_Line("Stop Do_Something (2)");
> end Fin_Test_Case;
>
> ---end fin_test_case.adb
>
> This is what I got:
>
> ---begin output
>
> Start Do_Something (2)
> I = 2
> I = 1
> I = 0
> Do_Something Finalization 0
> I = 0
> Do_Something Finalization 0
> Do_Something Finalization 0
> I = 1
> I = 0
> Do_Something Finalization 0
> I = 0
> Do_Something Finalization 0
> Do_Something Finalization 0
> Do_Something Finalization 0
> Stop Do_Something (2)
>
> ---end output
>
> Somehow, the local parameter I is always 0 when finalize is called. What I
> expected was the following:
>
> ---begin expected output
>
> Start Do_Something (2)
> I = 2
> I = 1
> I = 0
> Do_Something Finalization 0
> I = 0
> Do_Something Finalization 0
> Do_Something Finalization 1
> I = 1
> I = 0
> Do_Something Finalization 0
> I = 0
> Do_Something Finalization 0
> Do_Something Finalization 1
> Do_Something Finalization 2
> Stop Do_Something (2)
>
> ---end expected output
>
> Now, is my expectation wrong? Or is this a compiler bug? I am using
> GNAT GPL 2007 (20070405-41).
This looks like a pretty clear compiler bug, especially since by the
time Finalize is called by the outermost Do_Something, it's using, for
the value of I, the parameter from a Do_Something call that is no
longer active. It shouldn't be hard to modify this slightly, using
(say) a string or record as a parameter to Do_Something, to create a
test where utter garbage is displayed; then it would be clearer that
this is a compiler bug.
-- Adam
next prev parent reply other threads:[~2008-04-04 16:08 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-04-04 9:33 unexpected behaviour of finalize stefan-lucks
2008-04-04 16:08 ` Adam Beneschan [this message]
2008-04-04 17:34 ` george.priv
2008-04-04 17:38 ` george.priv
2008-04-04 17:52 ` stefan-lucks
2008-04-04 19:53 ` george.priv
2008-04-04 17:51 ` stefan-lucks
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox