From: stefan-lucks@see.the.signature
Subject: unexpected behaviour of finalize
Date: Fri, 4 Apr 2008 11:33:27 +0200
Date: 2008-04-04T11:33:27+02:00 [thread overview]
Message-ID: <Pine.LNX.4.64.0804041131050.2100@medsec1.medien.uni-weimar.de> (raw)
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).
So long
Stefan
--
------ Stefan Lucks -- Bauhaus-University Weimar -- Germany ------
Stefan dot Lucks at uni minus weimar dot de
------ I love the taste of Cryptanalysis in the morning! ------
next reply other threads:[~2008-04-04 9:33 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-04-04 9:33 stefan-lucks [this message]
2008-04-04 16:08 ` unexpected behaviour of finalize Adam Beneschan
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