home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / gnat-2.06-src.tgz / tar.out / fsf / gnat / ada / exp_ch7.ads < prev    next >
Text File  |  1996-09-28  |  9KB  |  173 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT COMPILER COMPONENTS                         --
  4. --                                                                          --
  5. --                              E X P _ C H 7                               --
  6. --                                                                          --
  7. --                                 S p e c                                  --
  8. --                                                                          --
  9. --                            $Revision: 1.26 $                             --
  10. --                                                                          --
  11. --           Copyright (c) 1992,1993,1994 NYU, All Rights Reserved          --
  12. --                                                                          --
  13. -- GNAT is free software;  you can  redistribute it  and/or modify it under --
  14. -- terms of the  GNU General Public License as published  by the Free Soft- --
  15. -- ware  Foundation;  either version 2,  or (at your option) any later ver- --
  16. -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
  17. -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
  18. -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
  19. -- for  more details.  You should have  received  a copy of the GNU General --
  20. -- Public License  distributed with GNAT;  see file COPYING.  If not, write --
  21. -- to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. --
  22. --                                                                          --
  23. ------------------------------------------------------------------------------
  24.  
  25. with Types; use Types;
  26.  
  27. package Exp_Ch7 is
  28.  
  29.    procedure Expand_N_Package_Body        (N : Node_Id);
  30.    procedure Expand_N_Package_Declaration (N : Node_Id);
  31.  
  32.    ------------------------------
  33.    --  Finalization Management --
  34.    ------------------------------
  35.  
  36.    function In_Finalization_Implementation (E : Entity_Id) return Boolean;
  37.    --  True if current scope is in package System.Finalization_Implementation
  38.    --  use to avoid certain expansions that would involve circularity in the
  39.    --  Rtsfind mechanism.
  40.  
  41.    procedure Build_Controlling_Procs (Typ : Entity_Id);
  42.    --  Typ is a record, and array type having controlled components.
  43.    --  Create the procedures Deep_Initialize, Deep_Adjust and Deep_Finalize
  44.    --  that take care of finalization management at run-time.
  45.  
  46.    function Controller_Component (Typ : Entity_Id) return Entity_Id;
  47.    --  Returns the entity of the component whose name is 'Name_uController'
  48.  
  49.    function Controlled_Type (T : Entity_Id) return Boolean;
  50.    --  True if T potentially needs finalization actions
  51.  
  52.    function Find_Final_List
  53.      (E    : Entity_Id;
  54.       Ref  : Node_Id := Empty)
  55.       return Node_Id;
  56.       --  E is an entity representing a controlled object or type. If Ref
  57.       --  is not empty, it is a reference to a controlled component of a
  58.       --  record, the closest Final list is in the controller component of
  59.       --  the record containing Ref otherwise this function returns a
  60.       --  reference to the final list attached to the first "controllable"
  61.       --  scope Entity (E_Block, E_Function, E_Procedure, E_Task_Type,
  62.       --  E_Entry), creating this final list if necessary.
  63.  
  64.    function Make_Attach_Call (Obj_Ref, Flist_Ref : Node_Id) return Node_Id;
  65.    --  Attach the referenced object to the referenced Final Chain.
  66.  
  67.    function Make_Init_Call
  68.      (Ref       : Node_Id;
  69.       Typ       : Entity_Id;
  70.       Flist_Ref : Node_Id)
  71.       return      List_Id;
  72.    --  Ref is an expression (with no-side effect) that reference the object
  73.    --  to be initialized. Typ is a controlled type (Is_Controlled) or a
  74.    --  type with controlled components (Has_Controlled). Scop is the scope
  75.    --  controlling the finalization (usually the current scope, except for
  76.    --  dynamically allocated object where this is the scope of the access
  77.    --  type and for record components where it is the enclosing record type
  78.    --  itself). This function will generate the appropriate calls to make
  79.    --  sure that the objects referenced by Ref are initialized. The
  80.    --  generate code is quite different depending on the fact the type
  81.    --  IS_Controlled or HAS_Controlled but this is not the problem of the
  82.    --  caller, the details are in the body.
  83.  
  84.    function Make_Adjust_Call
  85.      (Ref         : Node_Id;
  86.       Typ         : Entity_Id;
  87.       Flist_Ref   : Node_Id;
  88.       With_Attach : Node_Id)
  89.       return        List_Id;
  90.    --  Ref is an expression (with no-side effect) that references the object
  91.    --  to be adjusted. Typ is a controlled type (Is_Controlled) or a type
  92.    --  with controlled components (Has_Controlled).  Scop is the scope
  93.    --  controlling the finalization (usually the current scope, except for
  94.    --  dynamically allocated object where this is the scope of the access
  95.    --  type and for record components where it is the enclosing record type
  96.    --  itself). This function will generate the appropriate calls to make
  97.    --  sure that the objects referenced by Ref are adjusted. The generated
  98.    --  code is quite different depending on the fact the type IS_Controlled
  99.    --  or HAS_Controlled but this is not the problem of the caller, the
  100.    --  details are in the body. If the parameter With_Attach is set to
  101.    --  True, the finalizable objects involved are attached to the proper
  102.    --  finalization chain. The objects must be attached when the adjust
  103.    --  takes place after an initialization expression but not when it takes
  104.    --  place after a regular assignment.
  105.  
  106.    function Make_Final_Call
  107.      (Ref         : Node_Id;
  108.       Typ         : Entity_Id;
  109.       Flist_Ref   : Node_Id;
  110.       With_Detach : Node_Id)
  111.       return        List_Id;
  112.    --  Ref is an expression (with no-side effect) that references the object
  113.    --  to be Finlized. Typ is a controlled type (Is_Controlled) or a type
  114.    --  with controlled components (Has_Controlled) Scop is the scope
  115.    --  controlling the finalization (usually the current scope, except for
  116.    --  dynamically allocated object where this is the scope of the access
  117.    --  type and for record components where it is the enclosing record type
  118.    --  itself). This function will generate the appropriate calls to make
  119.    --  sure that the objects referenced by Ref are finalized. The generated
  120.    --  code is quite different depending on the fact the type IS_Controlled
  121.    --  or HAS_Controlled but this is not the problem of the caller, the
  122.    --  details are in the body. If the parameter With_Detach is set to
  123.    --  True, the finalizable objects involved are detached from the proper
  124.    --  finalization chain. The objects must be detached when finalizing an
  125.    --  unchecked deallocated object but not when finalizing the target of
  126.    --  an assignment, it is not necessary either on scope exit.
  127.  
  128.    procedure Expand_Ctrl_Function_Call (N : Node_Id);
  129.    --  Expand a call to a function returning a controlled value
  130.  
  131.    function Make_Detach_Call (Obj_Ref, Flist_Ref : Node_Id) return Node_Id;
  132.    --  Detach the referenced object from the referenced Final Chain.
  133.  
  134.    --------------------------------
  135.    -- Transient Scope Management --
  136.    --------------------------------
  137.  
  138.    function Requires_Transient_Scope (T : Entity_Id) return Boolean;
  139.    --  T is the type of an expression. Returns True if the type T implies that
  140.    --  the expression must be wraped in a transient scope.
  141.  
  142.    procedure Expand_Cleanup_Actions (N : Node_Id);
  143.    --  Expand the necessary stuff into a scope to enable finalization of local
  144.    --  objects and deallocation of transient data when exiting the scope. N is
  145.    --  a "scope node" that is to say one of the following: N_Block_Statement,
  146.    --  N_Subprogram_Body, N_Task_Body, N_Entry_Body.
  147.  
  148.    procedure Establish_Transient_Scope (N : Node_Id);
  149.    --  Push a new transient scope on the scope stack. N is the node responsible
  150.    --  for the need of a transient scope.
  151.  
  152.    function Node_To_Be_Wrapped return Node_Id;
  153.    --  return the node to be wrapped if the current scope is transient.
  154.  
  155.    function Scope_Is_Transient  return Boolean;
  156.    --  True if the current scope is transient.
  157.  
  158.    procedure Store_Actions_In_Scope (L : List_Id);
  159.    --  Append the list L of actions to the end of the Actions store in the
  160.    --  scope stack
  161.  
  162.    procedure Wrap_Transient_Declaration (N : Node_Id);
  163.    --  N is an object declaration. Expand the finalization calls after the
  164.    --  declaration and make the outer scope beeing the transient one.
  165.  
  166.    procedure Wrap_Transient_Expression (N : Node_Id);
  167.    --  N is a sub-expression. Expand a transient block around an expression
  168.  
  169.    procedure Wrap_Transient_Statement (N : Node_Id);
  170.    --  N is a statement. Expand a transient block around an instruction
  171.  
  172. end Exp_Ch7;
  173.