source: trunk/src/gcc/libstdc++-v3/libsupc++/eh_catch.cc@ 1216

Last change on this file since 1216 was 2, checked in by bird, 23 years ago

Initial revision

  • Property cvs2svn:cvs-rev set to 1.1
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 3.2 KB
Line 
1// -*- C++ -*- Exception handling routines for catching.
2// Copyright (C) 2001 Free Software Foundation, Inc.
3//
4// This file is part of GNU CC.
5//
6// GNU CC is free software; you can redistribute it and/or modify
7// it under the terms of the GNU General Public License as published by
8// the Free Software Foundation; either version 2, or (at your option)
9// any later version.
10//
11// GNU CC is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14// GNU General Public License for more details.
15//
16// You should have received a copy of the GNU General Public License
17// along with GNU CC; see the file COPYING. If not, write to
18// the Free Software Foundation, 59 Temple Place - Suite 330,
19// Boston, MA 02111-1307, USA.
20
21// As a special exception, you may use this file as part of a free software
22// library without restriction. Specifically, if other files instantiate
23// templates or use macros or inline functions from this file, or you compile
24// this file and link it with other files to produce an executable, this
25// file does not by itself cause the resulting executable to be covered by
26// the GNU General Public License. This exception does not however
27// invalidate any other reasons why the executable file might be covered by
28// the GNU General Public License.
29
30
31#include <cstdlib>
32#include "unwind-cxx.h"
33
34using namespace __cxxabiv1;
35
36
37extern "C" void *
38__cxa_begin_catch (void *exc_obj_in)
39{
40 _Unwind_Exception *exceptionObject
41 = reinterpret_cast <_Unwind_Exception *>(exc_obj_in);
42
43 // ??? Foreign exceptions can't be stacked here, and there doesn't
44 // appear to be any place to store for __cxa_end_catch to destroy.
45
46 __cxa_exception *header = __get_exception_header_from_ue (exceptionObject);
47 __cxa_eh_globals *globals = __cxa_get_globals ();
48 __cxa_exception *prev = globals->caughtExceptions;
49 int count = header->handlerCount;
50
51 if (count < 0)
52 // This exception was rethrown from an immediately enclosing region.
53 count = -count + 1;
54 else
55 count += 1;
56 header->handlerCount = count;
57
58 globals->uncaughtExceptions -= 1;
59 if (header != prev)
60 {
61 header->nextException = prev;
62 globals->caughtExceptions = header;
63 }
64
65 return header->adjustedPtr;
66}
67
68
69extern "C" void
70__cxa_end_catch ()
71{
72 __cxa_eh_globals *globals = __cxa_get_globals_fast ();
73 __cxa_exception *header = globals->caughtExceptions;
74 int count = header->handlerCount;
75
76 if (count < 0)
77 {
78 // This exception was rethrown. Decrement the (inverted) catch
79 // count and remove it from the chain when it reaches zero.
80 if (++count == 0)
81 {
82 globals->uncaughtExceptions += 1;
83 globals->caughtExceptions = header->nextException;
84 }
85 }
86 else if (--count == 0)
87 {
88 // Handling for this exception is complete. Destroy the object.
89 globals->caughtExceptions = header->nextException;
90 _Unwind_DeleteException (&header->unwindHeader);
91 return;
92 }
93 else if (count < 0)
94 // A bug in the exception handling library or compiler.
95 std::abort ();
96
97 header->handlerCount = count;
98}
99
100
101bool
102std::uncaught_exception() throw()
103{
104 __cxa_eh_globals *globals = __cxa_get_globals ();
105 return globals->uncaughtExceptions != 0;
106}
Note: See TracBrowser for help on using the repository browser.