1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
------------------------------------------------------------------------------
-- --
-- GNAT RUN-TIME COMPONENTS --
-- --
-- G N A T . C P P . S T D . C L A S S _ E X C E P T I O N --
-- --
-- S p e c --
-- --
-- Copyright (C) 2022-2025, AdaCore --
-- --
-- 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- --
-- ware Foundation; either version 3, or (at your option) any later ver- --
-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
-- or FITNESS FOR A PARTICULAR PURPOSE. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are granted --
-- additional permissions described in the GCC Runtime Library Exception, --
-- version 3.1, as published by the Free Software Foundation. --
-- --
-- You should have received a copy of the GNU General Public License and --
-- a copy of the GCC Runtime Library Exception along with this program; --
-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
-- <http://www.gnu.org/licenses/>. --
-- --
-- GNAT was originally developed by the GNAT team at New York University. --
-- Extensive contributions were provided by Ada Core Technologies Inc. --
-- --
------------------------------------------------------------------------------
-- This package provides an interface to C++'s std::exception objects
with Interfaces.C;
with Interfaces.C.Strings; use Interfaces.C.Strings;
-- with GNAT.CPP_Exceptions; use GNAT.CPP_Exceptions;
-- ??? Should we expose, or even keep this unit? We can't run
-- constructors (they're inline), and destructors have to be declared
-- before the public methods because of their position in the virtual
-- method table, so they have to be public as well. It could be
-- unsafe to run them without running the constructors we can't get
-- at, so deriving from this type would be a challenge, though it
-- could be potentially useful for obscure cross-language exception
-- handling scenarios. Adding this unit to libgnat would require
-- libgnat.so to depend on libsupc++, if the exception declarations
-- were uncommented out.
private package GNAT.CPP.Std.Class_Exception is
type Class_Exception is abstract tagged limited record
null;
end record;
pragma Import (CPP, Class_Exception);
-- Defined inline, no out-of-line version available.
-- function New_Class_Exception return Class_Exception;
-- pragma Cpp_Constructor (New_Class_Exception);
-- pragma Machine_Attribute (New_Class_Exception, "nothrow");
pragma Warnings (Off, "CPP constructor required for type");
-- Allowing destruction is undesirable, but since these are in
-- the virtual method table, we have to declare them.
-- ??? Could we make them private somehow?
procedure Destructor (Ex : access Class_Exception);
pragma Import (CPP, Destructor, "_ZNSt9exceptionD1Ev");
pragma Machine_Attribute (Destructor, "nothrow");
procedure Delete_Destructor (Ex : access Class_Exception);
pragma Import (CPP, Delete_Destructor, "_ZNSt9exceptionD0Ev");
pragma Machine_Attribute (Delete_Destructor, "nothrow");
function What (Ex : access constant Class_Exception) return chars_ptr;
pragma Import (CPP, What, "_ZNKSt9exception4whatEv");
pragma Machine_Attribute (What, "nothrow");
-- Obtain the C string stored in the std::exception object.
function What (Ex : access constant Class_Exception'Class) return String is
(Value (What (Ex)));
-- Obtain the C string stored in the std::exception object,
-- converted to an Ada String.
-- function Get_Class_Exception_From_Occurrence is
-- new Get_Access_To_Tagged_Object (Class_Exception);
-- Obtain access to Class_Exception'Class of an
-- Exception_Occurrence handled as Class_Exception_Only or
-- Class_Exception_Or_Derived, as defined in comments below.
-- Adding this to libgnat would cause libgnat.so to depend on
-- libsupc++.
-- Class_Exception_Only : exception;
-- pragma Import (Cpp, Class_Exception_Only,
-- "_ZTISt9exception");
-- Exception to catch std::exception exact matches only.
-- Class_Exception_Or_Derived : exception;
-- pragma Import (Cpp, Class_Exception_Or_Derived,
-- "_ZTISt9exception'Class");
-- Exception to catch std::exception or derived types.
end GNAT.CPP.Std.Class_Exception;
|