comp.lang.ada
 help / color / mirror / Atom feed
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!  ------




             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