Subversion Repositories Kolibri OS

Rev

Rev 5963 | 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
  {
6528 serge 46
 
5134 serge 47
    static bool terminating;
48
    if (terminating)
49
      {
50
	fputs("terminate called recursively\n", stderr);
5963 serge 51
	abort ();
5134 serge 52
      }
53
    terminating = true;
54
 
55
    // Make sure there was an exception; terminate is also called for an
56
    // attempt to rethrow when there is no suitable exception.
57
    type_info *t = __cxa_current_exception_type();
58
    if (t)
59
      {
60
	// Note that "name" is the mangled name.
61
	char const *name = t->name();
62
	{
63
	  int status = -1;
64
	  char *dem = 0;
6528 serge 65
 
5963 serge 66
	  dem = __cxa_demangle(name, 0, 0, &status);
5134 serge 67
 
68
	  fputs("terminate called after throwing an instance of '", stderr);
69
	  if (status == 0)
70
	    fputs(dem, stderr);
71
	  else
72
	    fputs(name, stderr);
73
	  fputs("'\n", stderr);
74
 
75
	  if (status == 0)
76
	    free(dem);
77
	}
78
 
79
	// If the exception is derived from std::exception, we can
80
	// give more information.
81
	__try { __throw_exception_again; }
82
#ifdef __EXCEPTIONS
83
	__catch(const exception& exc)
84
	  {
85
	    char const *w = exc.what();
86
	    fputs("  what():  ", stderr);
87
	    fputs(w, stderr);
88
	    fputs("\n", stderr);
89
          }
90
#endif
91
	__catch(...) { }
92
      }
93
    else
94
      fputs("terminate called without an active exception\n", stderr);
6528 serge 95
 
5134 serge 96
    abort();
97
  }
98
 
99
_GLIBCXX_END_NAMESPACE_VERSION
100
} // namespace
101
 
102
#endif