comp.lang.ada
 help / color / mirror / Atom feed
From: george.priv@gmail.com
Subject: Re: unexpected behaviour of finalize
Date: Fri, 4 Apr 2008 10:34:29 -0700 (PDT)
Date: 2008-04-04T10:34:29-07:00	[thread overview]
Message-ID: <d3381dae-b2b4-45e6-815c-09c2d63ceb62@d45g2000hsc.googlegroups.com> (raw)
In-Reply-To: 308722a0-7372-4a2b-9dbd-8d8704a3fcae@s33g2000pri.googlegroups.com

On Apr 4, 12:08 pm, Adam Beneschan <a...@irvine.com> wrote:
> 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




  reply	other threads:[~2008-04-04 17:34 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
2008-04-04 17:34   ` george.priv [this message]
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