Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. // -*- C++ -*- std::terminate, std::unexpected and friends.
  2. // Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2009,
  3. // 2011
  4. // Free Software Foundation
  5. //
  6. // This file is part of GCC.
  7. //
  8. // GCC is free software; you can redistribute it and/or modify
  9. // it under the terms of the GNU General Public License as published by
  10. // the Free Software Foundation; either version 3, or (at your option)
  11. // any later version.
  12. //
  13. // GCC is distributed in the hope that it will be useful,
  14. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16. // GNU General Public License for more details.
  17. //
  18. // Under Section 7 of GPL version 3, you are granted additional
  19. // permissions described in the GCC Runtime Library Exception, version
  20. // 3.1, as published by the Free Software Foundation.
  21.  
  22. // You should have received a copy of the GNU General Public License and
  23. // a copy of the GCC Runtime Library Exception along with this program;
  24. // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
  25. // <http://www.gnu.org/licenses/>.
  26.  
  27. #include "typeinfo"
  28. #include "exception"
  29. #include <cstdlib>
  30. #include "unwind-cxx.h"
  31. #include <bits/exception_defines.h>
  32.  
  33. using namespace __cxxabiv1;
  34.  
  35. void
  36. __cxxabiv1::__terminate (std::terminate_handler handler) throw ()
  37. {
  38.   __try
  39.     {
  40.       handler ();
  41.       std::abort ();
  42.     }
  43.   __catch(...)
  44.     { std::abort (); }
  45. }
  46.  
  47. void
  48. std::terminate () throw()
  49. {
  50.   __terminate (__terminate_handler);
  51. }
  52.  
  53. void
  54. __cxxabiv1::__unexpected (std::unexpected_handler handler)
  55. {
  56.   handler();
  57.   std::terminate ();
  58. }
  59.  
  60. void
  61. std::unexpected ()
  62. {
  63.   __unexpected (__unexpected_handler);
  64. }
  65.  
  66. std::terminate_handler
  67. std::set_terminate (std::terminate_handler func) throw()
  68. {
  69.   std::terminate_handler old = __terminate_handler;
  70.   __terminate_handler = func;
  71.   return old;
  72. }
  73.  
  74. std::unexpected_handler
  75. std::set_unexpected (std::unexpected_handler func) throw()
  76. {
  77.   std::unexpected_handler old = __unexpected_handler;
  78.   __unexpected_handler = func;
  79.   return old;
  80. }
  81.