Commit dbe01631 by Ed Schonberg Committed by Arnaud Charlet

g-awk.adb (Finalize): Do not use directly objects of the type in the…

g-awk.adb (Finalize): Do not use directly objects of the type in the finalization routine to prevent...

2008-08-06  Ed Schonberg  <schonberg@adacore.com>

	* g-awk.adb (Finalize): Do not use directly objects of the type in the
	finalization routine to prevent elaboration order anomalies in new
	finalization scheme.

From-SVN: r138772
parent 4dd80bb7
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
-- -- -- --
-- B o d y -- -- B o d y --
-- -- -- --
-- Copyright (C) 2000-2007, AdaCore -- -- Copyright (C) 2000-2008, AdaCore --
-- -- -- --
-- GNAT is free software; you can redistribute it and/or modify it under -- -- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- -- -- terms of the GNU General Public License as published by the Free Soft- --
...@@ -36,10 +36,6 @@ pragma Ada_95; ...@@ -36,10 +36,6 @@ pragma Ada_95;
-- Default_Session (see below) do not work when compiling clients of this -- Default_Session (see below) do not work when compiling clients of this
-- package that instantiate generic units herein. -- package that instantiate generic units herein.
pragma Style_Checks (All_Checks);
-- Turn off alpha ordering check for subprograms, since we cannot
-- Put Finalize and Initialize in alpha order (see comments).
with Ada.Exceptions; with Ada.Exceptions;
with Ada.Text_IO; with Ada.Text_IO;
with Ada.Strings.Unbounded; with Ada.Strings.Unbounded;
...@@ -56,6 +52,18 @@ package body GNAT.AWK is ...@@ -56,6 +52,18 @@ package body GNAT.AWK is
use Ada; use Ada;
use Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
-----------------------
-- Local subprograms --
-----------------------
-- The following two subprograms provide a functional interface to the
-- two special session variables, that are manipulated explicitly by
-- Finalize, but must be declared after Finalize to prevent static
-- elaboration warnings.
function Get_Def return Session_Data_Access;
procedure Set_Cur;
---------------- ----------------
-- Split mode -- -- Split mode --
---------------- ----------------
...@@ -277,6 +285,24 @@ package body GNAT.AWK is ...@@ -277,6 +285,24 @@ package body GNAT.AWK is
procedure Free is procedure Free is
new Unchecked_Deallocation (Session_Data, Session_Data_Access); new Unchecked_Deallocation (Session_Data, Session_Data_Access);
--------------
-- Finalize --
--------------
procedure Finalize (Session : in out Session_Type) is
begin
-- We release the session data only if it is not the default session
if Session.Data /= Get_Def then
Free (Session.Data);
-- Since we have closed the current session, set it to point now to
-- the default session.
Set_Cur;
end if;
end Finalize;
---------------- ----------------
-- Initialize -- -- Initialize --
---------------- ----------------
...@@ -301,34 +327,9 @@ package body GNAT.AWK is ...@@ -301,34 +327,9 @@ package body GNAT.AWK is
-- Session Variables -- -- Session Variables --
----------------------- -----------------------
-- These must come after the body of Initialize, since they make
-- implicit calls to Initialize at elaboration time.
Def_Session : Session_Type; Def_Session : Session_Type;
Cur_Session : Session_Type; Cur_Session : Session_Type;
--------------
-- Finalize --
--------------
-- Note: Finalize must come after Initialize and the definition
-- of the Def_Session and Cur_Session variables, since it references
-- the latter.
procedure Finalize (Session : in out Session_Type) is
begin
-- We release the session data only if it is not the default session
if Session.Data /= Def_Session.Data then
Free (Session.Data);
-- Since we have closed the current session, set it to point now to
-- the default session.
Cur_Session.Data := Def_Session.Data;
end if;
end Finalize;
---------------------- ----------------------
-- Private Services -- -- Private Services --
---------------------- ----------------------
...@@ -1480,6 +1481,24 @@ package body GNAT.AWK is ...@@ -1480,6 +1481,24 @@ package body GNAT.AWK is
Split.Current_Line (Session.Data.Separators.all, Session); Split.Current_Line (Session.Data.Separators.all, Session);
end Split_Line; end Split_Line;
-------------
-- Get_Def --
-------------
function Get_Def return Session_Data_Access is
begin
return Def_Session.Data;
end Get_Def;
-------------
-- Set_Cur --
-------------
procedure Set_Cur is
begin
Cur_Session.Data := Def_Session.Data;
end Set_Cur;
begin begin
-- We have declared two sessions but both should share the same data. -- We have declared two sessions but both should share the same data.
-- The current session must point to the default session as its initial -- The current session must point to the default session as its initial
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment