📄 exception.cc
字号:
// Functions for Exception Support for -*- C++ -*-// Copyright (C) 1994, 1995, 1996 Free Software Foundation// This file is part of GNU CC.// GNU CC is free software; you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation; either version 2, or (at your option)// any later version.// GNU CC is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with GNU CC; see the file COPYING. If not, write to// the Free Software Foundation, 59 Temple Place - Suite 330,// Boston, MA 02111-1307, USA. // As a special exception, if you link this library with other files,// some of which are compiled with GCC, to produce an executable,// this library does not by itself cause the resulting executable// to be covered by the GNU General Public License.// This exception does not however invalidate any other reasons why// the executable file might be covered by the GNU General Public License.#pragma implementation "exception"#include "typeinfo"#include "exception"/* Define terminate, unexpected, set_terminate, set_unexpected as well as the default terminate func and default unexpected func. */extern terminate_handler __terminate_func __attribute__((__noreturn__));voidterminate (){ __terminate_func ();}void__default_unexpected (){ terminate ();}static unexpected_handler __unexpected_func = __default_unexpected;terminate_handlerset_terminate (terminate_handler func){ terminate_handler old = __terminate_func; __terminate_func = func; return old;}unexpected_handlerset_unexpected (unexpected_handler func){ unexpected_handler old = __unexpected_func; __unexpected_func = func; return old;}voidunexpected (){ __unexpected_func ();}/* C++-specific state about the current exception. This must match init_exception_processing(). Note that handlers and caught are not redundant; when rethrown, an exception can have multiple active handlers and still be considered uncaught. */struct cp_eh_info{ void *value; void *type; void (*cleanup)(void *, int); bool caught; cp_eh_info *next; long handlers;};/* Language-specific EH info pointer, defined in libgcc2. */extern cp_eh_info *__eh_info; // actually void*/* Is P the type_info node for a pointer of some kind? */extern bool __is_pointer (void *);/* Compiler hook to return a pointer to the info for the current exception. Used by get_eh_info (). */extern "C" cp_eh_info *__cp_exception_info (void){ return __eh_info;}/* Compiler hook to push a new exception onto the stack. Used by expand_throw(). */extern "C" void__cp_push_exception (void *value, void *type, void (*cleanup)(void *, int)){ cp_eh_info *p = new cp_eh_info; p->value = value; p->type = type; p->cleanup = cleanup; p->handlers = 0; p->caught = false; p->next = __eh_info; __eh_info = p;}/* Compiler hook to pop an exception that has been finalized. Used by push_eh_cleanup(). P is the info for the exception caught by the current catch block, and HANDLER determines if we've been called from an exception handler; if so, we avoid destroying the object on rethrow. */extern "C" void__cp_pop_exception (cp_eh_info *p, bool handler){ cp_eh_info **q = &__eh_info; --p->handlers; if (p->handlers > 0 || (handler && p == *q)) return; for (; *q; q = &((*q)->next)) if (*q == p) break; if (! *q) terminate (); *q = p->next; if (p->cleanup) /* 3 is a magic value for destructors; see build_delete(). */ p->cleanup (p->value, 3); else if (__is_pointer (p->type)) /* do nothing; pointers are passed directly in p->value. */; else delete p->value; delete p;}extern "C" void__uncatch_exception (void){ cp_eh_info *p = __cp_exception_info (); if (p) p->caught = false; /* otherwise __throw will call terminate(); don't crash here. */}extern "C" void__throw_bad_cast (void){ throw bad_cast ();}extern "C" void__throw_bad_typeid (void){ throw bad_typeid ();}/* Has the current exception been caught? */booluncaught_exception (){ cp_eh_info *p = __cp_exception_info (); return p && ! p->caught;}const char * exception::what () const{ return typeid (*this).name ();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -