mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-02-24 16:25:56 +08:00
exp_ch4.adb (Expand_Allocator_Expression): Pass Allocator => True to Make_Adjust_Call done for a newly-allocated object.
2006-02-13 Thomas Quinot <quinot@adacore.com> Ed Schonberg <schonberg@adacore.com> * exp_ch4.adb (Expand_Allocator_Expression): Pass Allocator => True to Make_Adjust_Call done for a newly-allocated object. * exp_ch7.ads, exp_ch7.adb (Expand_Cleanup_Actions): If the statements in a subprogram are wrapped in a cleanup block, indicate that the subprogram contains an inner block with an exception handler. (Make_Adjust_Call): New Boolean formal Allocator indicating whether the Adjust call is for a newly-allocated object. In that case we must not assume that the finalization list chain pointers are correct (since they come from a bit-for-bit copy of the original object's pointers) so if the attach level would otherwise be zero (no change), we set it to 4 instead to cause the pointers to be reset to null. * s-finimp.adb (Attach_To_Final_List): New attach level: 4, meaning reset chain pointers to null. From-SVN: r111060
This commit is contained in:
parent
a05e99a269
commit
dfd99a80f0
@ -494,8 +494,8 @@ package body Exp_Ch4 is
|
||||
|
||||
if Java_VM then
|
||||
|
||||
-- Suppress the tag assignment when Java_VM because JVM tags
|
||||
-- are represented implicitly in objects.
|
||||
-- Suppress the tag assignment when Java_VM because JVM tags are
|
||||
-- represented implicitly in objects.
|
||||
|
||||
null;
|
||||
|
||||
@ -507,10 +507,10 @@ package body Exp_Ch4 is
|
||||
and then Is_Tagged_Type (Underlying_Type (T))
|
||||
then
|
||||
TagT := Underlying_Type (T);
|
||||
TagR := Unchecked_Convert_To (Underlying_Type (T),
|
||||
Make_Explicit_Dereference (Loc,
|
||||
New_Reference_To (Temp, Loc)));
|
||||
|
||||
TagR :=
|
||||
Unchecked_Convert_To (Underlying_Type (T),
|
||||
Make_Explicit_Dereference (Loc,
|
||||
Prefix => New_Reference_To (Temp, Loc)));
|
||||
end if;
|
||||
|
||||
if Present (TagT) then
|
||||
@ -593,11 +593,12 @@ package body Exp_Ch4 is
|
||||
|
||||
Unchecked_Convert_To (T,
|
||||
Make_Explicit_Dereference (Loc,
|
||||
New_Reference_To (Temp, Loc))),
|
||||
Prefix => New_Reference_To (Temp, Loc))),
|
||||
|
||||
Typ => T,
|
||||
Flist_Ref => Flist,
|
||||
With_Attach => Attach));
|
||||
With_Attach => Attach,
|
||||
Allocator => True));
|
||||
end if;
|
||||
end;
|
||||
end if;
|
||||
@ -3040,8 +3041,7 @@ package body Exp_Ch4 is
|
||||
|
||||
procedure Expand_N_Explicit_Dereference (N : Node_Id) is
|
||||
begin
|
||||
-- The only processing required is an insertion of an explicit
|
||||
-- dereference call for the checked storage pool case.
|
||||
-- Insert explicit dereference call for the checked storage pool case
|
||||
|
||||
Insert_Dereference_Action (Prefix (N));
|
||||
end Expand_N_Explicit_Dereference;
|
||||
@ -4798,11 +4798,11 @@ package body Exp_Ch4 is
|
||||
-- Signed integer cases, done using either Integer or Long_Long_Integer.
|
||||
-- It is not worth having routines for Short_[Short_]Integer, since for
|
||||
-- most machines it would not help, and it would generate more code that
|
||||
-- might need certification in the HI-E case.
|
||||
-- might need certification when a certified run time is required.
|
||||
|
||||
-- In the integer cases, we have two routines, one for when overflow
|
||||
-- checks are required, and one when they are not required, since
|
||||
-- there is a real gain in ommitting checks on many machines.
|
||||
-- checks are required, and one when they are not required, since there
|
||||
-- is a real gain in omitting checks on many machines.
|
||||
|
||||
elsif Rtyp = Base_Type (Standard_Long_Long_Integer)
|
||||
or else (Rtyp = Base_Type (Standard_Long_Integer)
|
||||
@ -8226,6 +8226,14 @@ package body Exp_Ch4 is
|
||||
|
||||
or else Is_Interface (Left_Type)
|
||||
then
|
||||
-- Issue error if IW_Membership operation not available in a
|
||||
-- configurable run time setting.
|
||||
|
||||
if not RTE_Available (RE_IW_Membership) then
|
||||
Error_Msg_CRT ("abstract interface types", N);
|
||||
return Empty;
|
||||
end if;
|
||||
|
||||
return
|
||||
Make_Function_Call (Loc,
|
||||
Name => New_Occurrence_Of (RTE (RE_IW_Membership), Loc),
|
||||
|
@ -6,7 +6,7 @@
|
||||
-- --
|
||||
-- B o d y --
|
||||
-- --
|
||||
-- Copyright (C) 1992-2005, Free Software Foundation, Inc. --
|
||||
-- Copyright (C) 1992-2006, Free Software Foundation, Inc. --
|
||||
-- --
|
||||
-- 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- --
|
||||
@ -1248,6 +1248,12 @@ package body Exp_Ch7 is
|
||||
Set_End_Label (Handled_Statement_Sequence (N), End_Lab);
|
||||
Wrapped := True;
|
||||
|
||||
-- Comment needed here, see RH for 1.306 ???
|
||||
|
||||
if Nkind (N) = N_Subprogram_Body then
|
||||
Set_Has_Nested_Block_With_Handler (Current_Scope);
|
||||
end if;
|
||||
|
||||
-- Otherwise we do not wrap
|
||||
|
||||
else
|
||||
@ -1957,10 +1963,11 @@ package body Exp_Ch7 is
|
||||
-----------------------
|
||||
|
||||
function Make_Adjust_Call
|
||||
(Ref : Node_Id;
|
||||
Typ : Entity_Id;
|
||||
Flist_Ref : Node_Id;
|
||||
With_Attach : Node_Id) return List_Id
|
||||
(Ref : Node_Id;
|
||||
Typ : Entity_Id;
|
||||
Flist_Ref : Node_Id;
|
||||
With_Attach : Node_Id;
|
||||
Allocator : Boolean := False) return List_Id
|
||||
is
|
||||
Loc : constant Source_Ptr := Sloc (Ref);
|
||||
Res : constant List_Id := New_List;
|
||||
@ -2018,8 +2025,19 @@ package body Exp_Ch7 is
|
||||
Attach := Make_Integer_Literal (Loc, 0);
|
||||
end if;
|
||||
|
||||
-- Special case for allocators: need initialization of the chain
|
||||
-- pointers. For the 0 case, reset them to null.
|
||||
|
||||
if Allocator then
|
||||
pragma Assert (Nkind (Attach) = N_Integer_Literal);
|
||||
|
||||
if Intval (Attach) = 0 then
|
||||
Set_Intval (Attach, Uint_4);
|
||||
end if;
|
||||
end if;
|
||||
|
||||
-- Generate:
|
||||
-- Deep_Adjust (Flist_Ref, Ref, With_Attach);
|
||||
-- Deep_Adjust (Flist_Ref, Ref, Attach);
|
||||
|
||||
if Has_Controlled_Component (Utyp)
|
||||
or else Is_Class_Wide_Type (Typ)
|
||||
@ -2158,7 +2176,7 @@ package body Exp_Ch7 is
|
||||
Pid := Corresponding_Concurrent_Type (Param_Type);
|
||||
end if;
|
||||
|
||||
exit when not Present (Param) or else Present (Pid);
|
||||
exit when No (Param) or else Present (Pid);
|
||||
Next (Param);
|
||||
end loop;
|
||||
|
||||
|
@ -108,7 +108,8 @@ package Exp_Ch7 is
|
||||
(Ref : Node_Id;
|
||||
Typ : Entity_Id;
|
||||
Flist_Ref : Node_Id;
|
||||
With_Attach : Node_Id) return List_Id;
|
||||
With_Attach : Node_Id;
|
||||
Allocator : Boolean := False) return List_Id;
|
||||
-- Ref is an expression (with no-side effect and is not required to
|
||||
-- have been previously analyzed) that references the object to be
|
||||
-- adjusted. Typ is the expected type of Ref, which is a controlled
|
||||
@ -126,6 +127,12 @@ package Exp_Ch7 is
|
||||
-- details are in the body. The objects must be attached when the adjust
|
||||
-- takes place after an initialization expression but not when it takes
|
||||
-- place after a regular assignment.
|
||||
--
|
||||
-- If Allocator is True, we are adjusting a newly-created object. The
|
||||
-- existing chaining pointers should not be left unchanged, because they
|
||||
-- may come from a bit-for-bit copy of those from an initializing object.
|
||||
-- So, when this flag is True, if the chaining pointers should otherwise
|
||||
-- be left unset, instead they are reset to null.
|
||||
|
||||
function Make_Final_Call
|
||||
(Ref : Node_Id;
|
||||
|
@ -6,7 +6,7 @@
|
||||
-- --
|
||||
-- B o d y --
|
||||
-- --
|
||||
-- Copyright (C) 1992-2005 Free Software Foundation, Inc. --
|
||||
-- Copyright (C) 1992-2006, Free Software Foundation, Inc. --
|
||||
-- --
|
||||
-- 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- --
|
||||
@ -60,8 +60,8 @@ package body System.Finalization_Implementation is
|
||||
new Unchecked_Conversion (Address, RC_Ptr);
|
||||
|
||||
procedure Raise_Exception_No_Defer
|
||||
(E : in Exception_Id;
|
||||
Message : in String := "");
|
||||
(E : Exception_Id;
|
||||
Message : String := "");
|
||||
pragma Import (Ada, Raise_Exception_No_Defer,
|
||||
"ada__exceptions__raise_exception_no_defer");
|
||||
pragma No_Return (Raise_Exception_No_Defer);
|
||||
@ -214,6 +214,13 @@ package body System.Finalization_Implementation is
|
||||
P.Next := L;
|
||||
L := Obj'Unchecked_Access;
|
||||
end;
|
||||
|
||||
-- Make the object completely unattached (case of a library-level,
|
||||
-- Finalize_Storage_Only object).
|
||||
|
||||
elsif Nb_Link = 4 then
|
||||
Obj.Prev := null;
|
||||
Obj.Next := null;
|
||||
end if;
|
||||
end Attach_To_Final_List;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user