This change causes the compiler to copy components from runtime record type
System.Partition_Interface.RACW_Stub_Type instead of hard-coding the
component list in Build_Stub_Type. This allows the structure of that type
to be changed in the PCS without having to change the compiler.

Tested on x86_64-pc-linux-gnu, committed on trunk

2011-09-19  Thomas Quinot  <qui...@adacore.com>

        * exp_dist.adb, rtsfind.ads, sem_util.adb, sem_util.ads
        (Build_Stub_Type): Remove, instead copy components from
        System.Partition_Interface.RACW_Stub_Type.
        (RPC_Receiver_Decl): Remainder of code from old Build_Stub_Type routine.
        (Copy_Component_List): New subprogram.

Index: exp_dist.adb
===================================================================
--- exp_dist.adb        (revision 178955)
+++ exp_dist.adb        (working copy)
@@ -328,8 +328,8 @@
 
       RPC_Receiver_Decl : Node_Id;
       --  Declaration for the RPC receiver entity associated with the
-      --  designated type. As an exception, for the case of an RACW that
-      --  implements a RAS, no object RPC receiver is generated. Instead,
+      --  designated type. As an exception, in the case of GARLIC, for an RACW
+      --  that implements a RAS, no object RPC receiver is generated. Instead,
       --  RPC_Receiver_Decl is the declaration after which the RPC receiver
       --  would have been inserted.
 
@@ -559,14 +559,9 @@
    --  call. Decls provides a location where variable declarations can be
    --  appended to construct the necessary values.
 
-   procedure Specific_Build_Stub_Type
-     (RACW_Type         : Entity_Id;
-      Stub_Type_Comps   : out List_Id;
-      RPC_Receiver_Decl : out Node_Id);
-   --  Build a components list for the stub type associated with an RACW type,
-   --  and build the necessary RPC receiver, if applicable. PCS-specific
-   --  ancillary subprogram for Add_Stub_Type. If no RPC receiver declaration
-   --  is generated, then RPC_Receiver_Decl is set to Empty.
+   function Specific_RPC_Receiver_Decl
+     (RACW_Type : Entity_Id) return Node_Id;
+   --  Build the RPC receiver, for RACW, if applicable, else return Empty
 
    procedure Specific_Build_RPC_Receiver_Body
      (RPC_Receiver : Entity_Id;
@@ -656,10 +651,7 @@
          RCI_Locator           : Entity_Id;
          Controlling_Parameter : Entity_Id) return RPC_Target;
 
-      procedure Build_Stub_Type
-        (RACW_Type         : Entity_Id;
-         Stub_Type_Comps   : out List_Id;
-         RPC_Receiver_Decl : out Node_Id);
+      function RPC_Receiver_Decl (RACW_Type : Entity_Id) return Node_Id;
 
       function Build_Subprogram_Receiving_Stubs
         (Vis_Decl                 : Node_Id;
@@ -733,10 +725,7 @@
          RCI_Locator           : Entity_Id;
          Controlling_Parameter : Entity_Id) return RPC_Target;
 
-      procedure Build_Stub_Type
-        (RACW_Type         : Entity_Id;
-         Stub_Type_Comps   : out List_Id;
-         RPC_Receiver_Decl : out Node_Id);
+      function RPC_Receiver_Decl (RACW_Type : Entity_Id) return Node_Id;
 
       function Build_Subprogram_Receiving_Stubs
         (Vis_Decl                 : Node_Id;
@@ -1976,7 +1965,6 @@
 
       Stub_Elements         : constant Stub_Structure :=
                                 Stubs_Table.Get (Designated_Type);
-      Stub_Type_Comps       : List_Id;
       Stub_Type_Decl        : Node_Id;
       Stub_Type_Access_Decl : Node_Id;
 
@@ -1999,8 +1987,10 @@
           Chars => New_External_Name
                      (Related_Id => Chars (Stub_Type), Suffix => 'A'));
 
-      Specific_Build_Stub_Type (RACW_Type, Stub_Type_Comps, RPC_Receiver_Decl);
+      RPC_Receiver_Decl := Specific_RPC_Receiver_Decl (RACW_Type);
 
+      --  Create new stub type, copying components from generic RACW_Stub_Type
+
       Stub_Type_Decl :=
         Make_Full_Type_Declaration (Loc,
           Defining_Identifier => Stub_Type,
@@ -2010,7 +2000,8 @@
               Limited_Present => True,
               Component_List  =>
                 Make_Component_List (Loc,
-                  Component_Items => Stub_Type_Comps)));
+                  Component_Items =>
+                    Copy_Component_List (RTE (RE_RACW_Stub_Type), Loc))));
 
       --  Does the stub type need to explicitly implement interfaces from the
       --  designated type???
@@ -2041,7 +2032,10 @@
 
       if Present (RPC_Receiver_Decl) then
          Append_To (Decls, RPC_Receiver_Decl);
+
       else
+         --  Kludge, requires comment???
+
          RPC_Receiver_Decl := Last (Decls);
       end if;
 
@@ -2399,7 +2393,6 @@
           Limited_Present => True,
           Component_List  =>
             Make_Component_List (Loc,
-
               Component_Items => New_List (
                 Make_Component_Declaration (Loc,
                   Defining_Identifier =>
@@ -3874,7 +3867,7 @@
             --  Compute distribution identifier
 
             Assign_Subprogram_Identifier
-              (Subp_Def, Current_Subp_Number,  Subp_Val);
+              (Subp_Def, Current_Subp_Number, Subp_Val);
 
             pragma Assert (Current_Subp_Number = Get_Subprogram_Id (Subp_Def));
 
@@ -4711,72 +4704,6 @@
          return Target_Info;
       end Build_Stub_Target;
 
-      ---------------------
-      -- Build_Stub_Type --
-      ---------------------
-
-      procedure Build_Stub_Type
-        (RACW_Type         : Entity_Id;
-         Stub_Type_Comps   : out List_Id;
-         RPC_Receiver_Decl : out Node_Id)
-      is
-         Loc    : constant Source_Ptr := Sloc (RACW_Type);
-         Is_RAS : constant Boolean    := not Comes_From_Source (RACW_Type);
-
-      begin
-         Stub_Type_Comps := New_List (
-           Make_Component_Declaration (Loc,
-             Defining_Identifier =>
-               Make_Defining_Identifier (Loc, Name_Origin),
-             Component_Definition =>
-               Make_Component_Definition (Loc,
-                 Aliased_Present    => False,
-                 Subtype_Indication =>
-                   New_Occurrence_Of (RTE (RE_Partition_ID), Loc))),
-
-           Make_Component_Declaration (Loc,
-             Defining_Identifier =>
-               Make_Defining_Identifier (Loc, Name_Receiver),
-             Component_Definition =>
-               Make_Component_Definition (Loc,
-                 Aliased_Present    => False,
-                 Subtype_Indication =>
-                   New_Occurrence_Of (RTE (RE_Unsigned_64), Loc))),
-
-           Make_Component_Declaration (Loc,
-             Defining_Identifier =>
-               Make_Defining_Identifier (Loc, Name_Addr),
-             Component_Definition =>
-               Make_Component_Definition (Loc,
-                 Aliased_Present    => False,
-                 Subtype_Indication =>
-                   New_Occurrence_Of (RTE (RE_Unsigned_64), Loc))),
-
-           Make_Component_Declaration (Loc,
-             Defining_Identifier =>
-               Make_Defining_Identifier (Loc, Name_Asynchronous),
-             Component_Definition =>
-               Make_Component_Definition (Loc,
-                 Aliased_Present    => False,
-                 Subtype_Indication =>
-                   New_Occurrence_Of (Standard_Boolean, Loc))));
-
-         if Is_RAS then
-            RPC_Receiver_Decl := Empty;
-         else
-            declare
-               RPC_Receiver_Request : constant Entity_Id :=
-                                        Make_Defining_Identifier (Loc, Name_R);
-            begin
-               RPC_Receiver_Decl :=
-                 Make_Subprogram_Declaration (Loc,
-                   Build_RPC_Receiver_Specification
-                     (RPC_Receiver      => Make_Temporary (Loc, 'R'),
-                      Request_Parameter => RPC_Receiver_Request));
-            end;
-         end if;
-      end Build_Stub_Type;
-
       --------------------------------------
       -- Build_Subprogram_Receiving_Stubs --
       --------------------------------------
@@ -5253,6 +5180,28 @@
          return Make_Identifier (Loc, Name_V);
       end Result;
 
+      -----------------------
+      -- RPC_Receiver_Decl --
+      -----------------------
+
+      function RPC_Receiver_Decl (RACW_Type : Entity_Id) return Node_Id is
+         Loc    : constant Source_Ptr := Sloc (RACW_Type);
+         Is_RAS : constant Boolean    := not Comes_From_Source (RACW_Type);
+
+      begin
+         --  No RPC receiver for remote access-to-subprogram
+
+         if Is_RAS then
+            return Empty;
+         end if;
+
+         return
+           Make_Subprogram_Declaration (Loc,
+             Build_RPC_Receiver_Specification
+               (RPC_Receiver      => Make_Temporary (Loc, 'R'),
+                Request_Parameter => Make_Defining_Identifier (Loc, Name_R)));
+      end RPC_Receiver_Decl;
+
       ----------------------
       -- Stream_Parameter --
       ----------------------
@@ -7659,46 +7608,6 @@
          return Target_Info;
       end Build_Stub_Target;
 
-      ---------------------
-      -- Build_Stub_Type --
-      ---------------------
-
-      procedure Build_Stub_Type
-        (RACW_Type         : Entity_Id;
-         Stub_Type_Comps   : out List_Id;
-         RPC_Receiver_Decl : out Node_Id)
-      is
-         Loc : constant Source_Ptr := Sloc (RACW_Type);
-
-      begin
-         Stub_Type_Comps := New_List (
-           Make_Component_Declaration (Loc,
-             Defining_Identifier =>
-               Make_Defining_Identifier (Loc, Name_Target),
-             Component_Definition =>
-               Make_Component_Definition (Loc,
-                 Aliased_Present     => False,
-                 Subtype_Indication  =>
-                   New_Occurrence_Of (RTE (RE_Entity_Ptr), Loc))),
-
-           Make_Component_Declaration (Loc,
-             Defining_Identifier =>
-               Make_Defining_Identifier (Loc, Name_Asynchronous),
-
-             Component_Definition =>
-               Make_Component_Definition (Loc,
-                 Aliased_Present    => False,
-                 Subtype_Indication =>
-                   New_Occurrence_Of (Standard_Boolean, Loc))));
-
-         RPC_Receiver_Decl :=
-           Make_Object_Declaration (Loc,
-             Defining_Identifier => Make_Temporary (Loc, 'R'),
-             Aliased_Present     => True,
-             Object_Definition   =>
-               New_Occurrence_Of (RTE (RE_Servant), Loc));
-      end Build_Stub_Type;
-
       -----------------------------
       -- Build_RPC_Receiver_Body --
       -----------------------------
@@ -11160,6 +11069,21 @@
          Overload_Counter_Table.Set (Name_Find, 1);
       end Reserve_NamingContext_Methods;
 
+      -----------------------
+      -- RPC_Receiver_Decl --
+      -----------------------
+
+      function RPC_Receiver_Decl (RACW_Type : Entity_Id) return Node_Id is
+         Loc : constant Source_Ptr := Sloc (RACW_Type);
+
+      begin
+         return
+           Make_Object_Declaration (Loc,
+             Defining_Identifier => Make_Temporary (Loc, 'R'),
+             Aliased_Present     => True,
+             Object_Definition   => New_Occurrence_Of (RTE (RE_Servant), Loc));
+      end RPC_Receiver_Decl;
+
    end PolyORB_Support;
 
    -------------------------------
@@ -11514,26 +11438,22 @@
       end case;
    end Specific_Build_Stub_Target;
 
-   ------------------------------
-   -- Specific_Build_Stub_Type --
-   ------------------------------
+   --------------------------------
+   -- Specific_RPC_Receiver_Decl --
+   --------------------------------
 
-   procedure Specific_Build_Stub_Type
-     (RACW_Type         : Entity_Id;
-      Stub_Type_Comps   : out List_Id;
-      RPC_Receiver_Decl : out Node_Id)
+   function Specific_RPC_Receiver_Decl
+     (RACW_Type : Entity_Id) return Node_Id
    is
    begin
       case Get_PCS_Name is
          when Name_PolyORB_DSA =>
-            PolyORB_Support.Build_Stub_Type
-              (RACW_Type, Stub_Type_Comps, RPC_Receiver_Decl);
+            return PolyORB_Support.RPC_Receiver_Decl (RACW_Type);
 
          when others =>
-            GARLIC_Support.Build_Stub_Type
-              (RACW_Type, Stub_Type_Comps, RPC_Receiver_Decl);
+            return GARLIC_Support.RPC_Receiver_Decl (RACW_Type);
       end case;
-   end Specific_Build_Stub_Type;
+   end Specific_RPC_Receiver_Decl;
 
    -----------------------------------------------
    -- Specific_Build_Subprogram_Receiving_Stubs --
Index: rtsfind.ads
===================================================================
--- rtsfind.ads (revision 178955)
+++ rtsfind.ads (working copy)
@@ -1163,6 +1163,7 @@
      RE_Get_RACW,                        -- System.Partition_Interface
      RE_Get_RCI_Package_Receiver,        -- System.Partition_Interface
      RE_Get_Unique_Remote_Pointer,       -- System.Partition_Interface
+     RE_RACW_Stub_Type,                  -- System.Partition_Interface
      RE_RACW_Stub_Type_Access,           -- System.Partition_Interface
      RE_RAS_Proxy_Type_Access,           -- System.Partition_Interface
      RE_Raise_Program_Error_Unknown_Tag, -- System.Partition_Interface
@@ -2357,6 +2358,7 @@
      RE_Get_RACW                         => System_Partition_Interface,
      RE_Get_RCI_Package_Receiver         => System_Partition_Interface,
      RE_Get_Unique_Remote_Pointer        => System_Partition_Interface,
+     RE_RACW_Stub_Type                   => System_Partition_Interface,
      RE_RACW_Stub_Type_Access            => System_Partition_Interface,
      RE_RAS_Proxy_Type_Access            => System_Partition_Interface,
      RE_Raise_Program_Error_Unknown_Tag  => System_Partition_Interface,
Index: sem_util.adb
===================================================================
--- sem_util.adb        (revision 178955)
+++ sem_util.adb        (working copy)
@@ -2265,6 +2265,39 @@
    end Conditional_Delay;
 
    -------------------------
+   -- Copy_Component_List --
+   -------------------------
+
+   function Copy_Component_List
+     (R_Typ : Entity_Id;
+      Loc   : Source_Ptr) return List_Id
+   is
+      Comp  : Node_Id;
+      Comps : constant List_Id := New_List;
+   begin
+      Comp := First_Component (Underlying_Type (R_Typ));
+
+      while Present (Comp) loop
+         if Comes_From_Source (Comp) then
+            declare
+               Comp_Decl : constant Node_Id := Declaration_Node (Comp);
+            begin
+               Append_To (Comps,
+                 Make_Component_Declaration (Loc,
+                   Defining_Identifier =>
+                     Make_Defining_Identifier (Loc, Chars (Comp)),
+                   Component_Definition =>
+                     New_Copy_Tree
+                       (Component_Definition (Comp_Decl), New_Sloc => Loc)));
+            end;
+         end if;
+         Next_Component (Comp);
+      end loop;
+
+      return Comps;
+   end Copy_Component_List;
+
+   -------------------------
    -- Copy_Parameter_List --
    -------------------------
 
Index: sem_util.ads
===================================================================
--- sem_util.ads        (revision 178955)
+++ sem_util.ads        (working copy)
@@ -272,6 +272,13 @@
    --  of inlining, and for private protected ops. Also used to create bodies
    --  for stubbed subprograms.
 
+   function Copy_Component_List
+     (R_Typ : Entity_Id;
+      Loc   : Source_Ptr) return List_Id;
+   --  Copy components from record type R_Typ that come from source. Used to
+   --  create a new compatible record type. Loc is the source location assigned
+   --  to the created nodes.
+
    function Current_Entity (N : Node_Id) return Entity_Id;
    pragma Inline (Current_Entity);
    --  Find the currently visible definition for a given identifier, that is to

Reply via email to