Subversion Repositories Kolibri OS

Rev

Rev 5134 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5134 serge 1
// Verbose terminate_handler -*- C++ -*-
2
 
3
// Copyright (C) 2001-2013 Free Software Foundation, Inc.
4
//
5
// This file is part of the GNU ISO C++ Library.  This library is free
6
// software; you can redistribute it and/or modify it under the
7
// terms of the GNU General Public License as published by the
8
// Free Software Foundation; either version 3, or (at your option)
9
// any later version.
10
 
11
// This library 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
// Under Section 7 of GPL version 3, you are granted additional
17
// permissions described in the GCC Runtime Library Exception, version
18
// 3.1, as published by the Free Software Foundation.
19
 
20
// You should have received a copy of the GNU General Public License and
21
// a copy of the GCC Runtime Library Exception along with this program;
22
// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23
// .
24
 
25
#include 
26
 
27
#if _GLIBCXX_HOSTED
28
#include 
29
#include 
30
#include 
31
#include 
32
# include 
33
 
34
using namespace std;
35
using namespace abi;
36
 
37
namespace __gnu_cxx
38
{
39
_GLIBCXX_BEGIN_NAMESPACE_VERSION
40
 
41
  // A replacement for the standard terminate_handler which prints
42
  // more information about the terminating exception (if any) on
43
  // stderr.
44
  void __verbose_terminate_handler()
45
  {
46
    static bool terminating;
47
    if (terminating)
48
      {
49
	fputs("terminate called recursively\n", stderr);
5963 serge 50
	abort ();
5134 serge 51
      }
52
    terminating = true;
53
 
54
    // Make sure there was an exception; terminate is also called for an
55
    // attempt to rethrow when there is no suitable exception.
56
    type_info *t = __cxa_current_exception_type();
57
    if (t)
58
      {
59
	// Note that "name" is the mangled name.
60
	char const *name = t->name();
61
	{
62
	  int status = -1;
63
	  char *dem = 0;
5963 serge 64
 
65
	  dem = __cxa_demangle(name, 0, 0, &status);
5134 serge 66
 
67
	  fputs("terminate called after throwing an instance of '", stderr);
68
	  if (status == 0)
69
	    fputs(dem, stderr);
70
	  else
71
	    fputs(name, stderr);
72
	  fputs("'\n", stderr);
73
 
74
	  if (status == 0)
75
	    free(dem);
76
	}
77
 
78
	// If the exception is derived from std::exception, we can
79
	// give more information.
80
	__try { __throw_exception_again; }
81
#ifdef __EXCEPTIONS
82
	__catch(const exception& exc)
83
	  {
84
	    char const *w = exc.what();
85
	    fputs("  what():  ", stderr);
86
	    fputs(w, stderr);
87
	    fputs("\n", stderr);
88
          }
89
#endif
90
	__catch(...) { }
91
      }
92
    else
93
      fputs("terminate called without an active exception\n", stderr);
5963 serge 94
 
5134 serge 95
    abort();
96
  }
97
 
98
_GLIBCXX_END_NAMESPACE_VERSION
99
} // namespace
100
 
101
#endif