* backend-be_ada-skels.adb : Handling unknown and system exceptions

* backend-be_ada-generator.adb : Added the possibility to generate
	"Variable_name : others". Minor reformatting

	* backend-be_ada-helpers.adb : Correct code generation for enumeration
	arrays.

	* backend-be_ada-runtime.ads : Added the runtime entity corresponding
	to the PolyORB.CORBA_P.Exceptions.System_Exception_To_Any function
	which is useful to catch unknown or system exceptions.


[Imported from ENST Subversion rev. 7436]

Subversion-branch: /import/ENST-iac-20061219
Subversion-revision: 41033
This commit is contained in:
Bechir Zalila
2005-06-02 09:36:53 +00:00
parent c6429441f3
commit 3695d433e5
4 changed files with 102 additions and 6 deletions

View File

@@ -307,8 +307,7 @@ package body Backend.BE_Ada.Generator is
Write (Tok_Exception);
Write_Eol;
Increment_Indentation;
-- Replace the following by the generation of exception handler
-- BEGIN
-- Generation of the exception handler
Write_Indentation;
Excp_Handler_Alternative := First_Node (Exception_Handler (N));
while Present (Excp_Handler_Alternative) loop
@@ -770,7 +769,14 @@ package body Backend.BE_Ada.Generator is
end if;
Write_Space;
Generate (Object_Definition (N));
if Present (Object_Definition (N)) then
Generate (Object_Definition (N));
else
-- This workaround doesn't affect the classic object declaration
-- because we must give a type. However it makes the generation
-- of case statement and exception handlers simpler.
Write (Tok_Others);
end if;
if Present (Expression (N)) then
Write_Space;

View File

@@ -1278,7 +1278,23 @@ package body Backend.BE_Ada.Helpers is
(Type_Spec
(Declaration
(E)));
Helper := RE (RE_From_Any_0);
declare
Reference : constant Node_Id := FEN.Reference
(Type_Spec (Declaration (E)));
begin
-- As iac evolves, add the corresponding From_Any nodes
case FEN.Kind (Reference) is
when K_Enumeration_Type =>
Helper := Helper_Node
(BE_Node (Identifier (Reference)));
-- The From_Any function is declared at the second
-- place in the Helper spec
Helper := Next_Node (Helper);
Helper := Defining_Identifier (Helper);
when others =>
Helper := RE (RE_From_Any_0);
end case;
end;
else
raise Program_Error;
end if;
@@ -1875,7 +1891,23 @@ package body Backend.BE_Ada.Helpers is
if Is_Base_Type (Type_Spec (Declaration (E))) then
Helper := RE (RE_To_Any_0);
elsif FEN.Kind (Type_Spec (Declaration (E))) = K_Scoped_Name then
Helper := RE (RE_To_Any_0);
declare
Reference : constant Node_Id := FEN.Reference
(Type_Spec (Declaration (E)));
begin
-- As iac evolves, add the corresponding To_Any nodes
case FEN.Kind (Reference) is
when K_Enumeration_Type =>
Helper := Helper_Node
(BE_Node (Identifier (Reference)));
-- The From_Any function is declared at the third
-- place in the Helper spec
Helper := Next_Node (Next_Node (Helper));
Helper := Defining_Identifier (Helper);
when others =>
Helper := RE (RE_To_Any_0);
end case;
end;
else
raise Program_Error;
end if;

View File

@@ -166,6 +166,8 @@ package Backend.BE_Ada.Runtime is
RE_To_PolyORB_String, -- PolyORB.Types.To_PolyORB_String
RE_Client_Invoke, -- PolyORB.CORBA_P.
-- Interceptors_Hooks.Client_Invoke
RE_System_Exception_To_Any, -- PolyORB.CORBA_P.
-- Exceptions.System_Exception_To_Any
RE_Raise_From_Any, -- PolyORB.CORBA_P.
-- Exceptions.Raise_From_Any
RE_Add, -- PolyORB.Utils.Strings."+"
@@ -284,6 +286,7 @@ package Backend.BE_Ada.Runtime is
RE_User_Get_Members => RU_PolyORB_Exceptions,
RE_User_Raise_Exception => RU_PolyORB_Exceptions,
RE_Raise_From_Any => RU_PolyORB_CORBA_P_Exceptions,
RE_System_Exception_To_Any => RU_PolyORB_CORBA_P_Exceptions,
RE_Client_Invoke => RU_PolyORB_CORBA_P_Interceptors_Hooks,
RE_Module_Info => RU_PolyORB_Initialization,
RE_Register_Module => RU_PolyORB_Initialization,

View File

@@ -119,6 +119,7 @@ package body Backend.BE_Ada.Skels is
function Is_A_Invoke_Part return Node_Id;
function Servant_Is_A_Body return Node_Id;
procedure Skeleton_Initialization (L : List_Id);
function Non_User_Exception_Handler return Node_Id;
procedure Visit_Attribute_Declaration (E : Node_Id);
procedure Visit_Interface_Declaration (E : Node_Id);
@@ -224,6 +225,7 @@ package body Backend.BE_Ada.Skels is
-- Getting the node corresponding to the declaration of the
-- Get_Members procedure.
-- This procedure is declared at the 4th place in the stub spec.
N := Stub_Node (BE_Node (Identifier (Reference (E))));
N := Next_Node (Next_Node (Next_Node (N)));
@@ -238,7 +240,7 @@ package body Backend.BE_Ada.Skels is
-- Getting the node corresponding to the declaration of the
-- To_Any procedure in the helper package.
-- This procedure is declared at the 3rd place in the helper spec.
-- Complete HERE
N := Helper_Node (BE_Node (Identifier (Reference (E))));
N := Next_Node (Next_Node ((N)));
@@ -870,6 +872,49 @@ package body Backend.BE_Ada.Skels is
Append_Node_To_List (N, L);
end Skeleton_Initialization;
function Non_User_Exception_Handler return Node_Id is
Result : Node_Id;
Selector : Node_Id;
Expression : Node_Id;
N : Node_Id;
D : constant List_Id := New_List (K_List_Id);
S : constant List_Id := New_List (K_List_Id);
begin
-- Generation of the "E : others" statement
Selector := Make_Object_Declaration
(Defining_Identifier =>
Make_Defining_Identifier (PN (P_E)),
Object_Definition => No_Node);
-- Body of the exception handler
N := Make_Subprogram_Call
(RE (RE_System_Exception_To_Any),
Make_List_Id
(Make_Defining_Identifier (PN (P_E))));
N := Make_Subprogram_Call
(RE (RE_To_CORBA_Any),
Make_List_Id (N));
N := Make_Subprogram_Call
(RE (RE_Set_Exception),
Make_List_Id
(Make_Defining_Identifier (PN (P_Request)), N));
Append_Node_To_List (N, S);
N := Make_Return_Statement (No_Node);
Append_Node_To_List (N, S);
Expression := Make_Block_Statement
(Declarative_Part => D,
Statements => S);
Result := Make_Component_Association
(Selector,
Expression);
return Result;
end Non_User_Exception_Handler;
-----------
-- Visit --
-----------
@@ -938,6 +983,7 @@ package body Backend.BE_Ada.Skels is
Then_Statements : constant List_Id := New_List (K_List_Id);
Else_Statements : constant List_Id := New_List (K_List_Id);
Invoke_Statements : constant List_Id := New_List (K_List_Id);
Exception_Handler : Node_Id;
begin
N := BEN.Parent (Stub_Node (BE_Node (Identifier (E))));
@@ -982,6 +1028,15 @@ package body Backend.BE_Ada.Skels is
Then_Statements,
Invoke_Elsif_Statements,
Else_Statements);
Exception_Handler := Non_User_Exception_Handler;
N := Make_Block_Statement
(Declarative_Part => No_List,
Statements =>
Make_List_Id (N),
Exception_Handler =>
Make_List_Id (Exception_Handler));
Append_Node_To_List (N, Invoke_Statements);
N := Servant_Is_A_Body;