+2018-05-22 Olivier Hainque <hainque@adacore.com>
+
+ * libgnat/a-except.adb (Exception_Propagation.Propagate_Exception):
+ Expect an Exception_Occurence object, not an Access.
+ (Complete_And_Propagate_Occurrence): Adjust accordingly.
+ (Raise_From_Signal_Handler): Likewise.
+ (Reraise_Occurrence_No_Defer): If we have a Machine_Occurrence
+ available in the provided occurrence object, just re-propagate the
+ latter as a bare "raise;" would do.
+ * libgnat/a-exexpr.adb (Propagate_Exception): Adjust to spec change.
+ * libgnat/a-exstat.adb (String_To_EO): Initialize X.Machine_Occurrence
+ to null, to mark that the occurrence we're crafting from the stream
+ contents is not being propagated (yet).
+
2018-05-22 Hristian Kirtchev <kirtchev@adacore.com>
* exp_aggr.adb (Initialize_Ctrl_Record_Component): Insert the generated
function Allocate_Occurrence return EOA;
-- Allocate an exception occurrence (as well as the machine occurrence)
- procedure Propagate_Exception (Excep : EOA);
+ procedure Propagate_Exception (Excep : Exception_Occurrence);
pragma No_Return (Propagate_Exception);
-- This procedure propagates the exception represented by Excep
procedure Complete_And_Propagate_Occurrence (X : EOA) is
begin
Complete_Occurrence (X);
- Exception_Propagation.Propagate_Exception (X);
+ Exception_Propagation.Propagate_Exception (X.all);
end Complete_And_Propagate_Occurrence;
---------------------
is
begin
Exception_Propagation.Propagate_Exception
- (Create_Occurrence_From_Signal_Handler (E, M));
+ (Create_Occurrence_From_Signal_Handler (E, M).all);
end Raise_From_Signal_Handler;
-------------------------
---------------------------------
procedure Reraise_Occurrence_No_Defer (X : Exception_Occurrence) is
- Excep : constant EOA := Exception_Propagation.Allocate_Occurrence;
- Saved_MO : constant System.Address := Excep.Machine_Occurrence;
begin
- Save_Occurrence (Excep.all, X);
- Excep.Machine_Occurrence := Saved_MO;
- Complete_And_Propagate_Occurrence (Excep);
+ -- If we have a Machine_Occurrence at hand already, e.g. when we are
+ -- reraising a foreign exception, just repropagate. Otherwise, e.g.
+ -- when reraising a GNAT exception or an occurrence read back from a
+ -- stream, set up a new occurrence with its own Machine block first.
+
+ if X.Machine_Occurrence /= System.Null_Address then
+ Exception_Propagation.Propagate_Exception (X);
+ else
+ declare
+ Excep : constant EOA
+ := Exception_Propagation.Allocate_Occurrence;
+ Saved_MO : constant System.Address := Excep.Machine_Occurrence;
+ begin
+ Save_Occurrence (Excep.all, X);
+ Excep.Machine_Occurrence := Saved_MO;
+ Complete_And_Propagate_Occurrence (Excep);
+ end;
+ end if;
end Reraise_Occurrence_No_Defer;
---------------------