|
|
1.1 ! root 1: // This is a part of the Microsoft Foundation Classes C++ library. ! 2: // Copyright (C) 1992 Microsoft Corporation ! 3: // All rights reserved. ! 4: // ! 5: // This source code is only intended as a supplement to the ! 6: // Microsoft Foundation Classes Reference and Microsoft ! 7: // QuickHelp documentation provided with the library. ! 8: // See these sources for detailed information regarding the ! 9: // Microsoft Foundation Classes product. ! 10: ! 11: #include "afx.h" ! 12: #pragma hdrstop ! 13: ! 14: #ifdef AFX_CORE_SEG ! 15: #pragma code_seg(AFX_CORE_SEG) ! 16: #endif ! 17: ! 18: #ifdef _DEBUG ! 19: #undef THIS_FILE ! 20: static char BASED_CODE THIS_FILE[] = __FILE__; ! 21: #endif ! 22: ! 23: ///////////////////////////////////////////////////////////////////////////// ! 24: ! 25: #if defined(_WINDOWS) && defined(_DOSWIN) ! 26: extern "C" void far pascal Throw(const int FAR*, int); ! 27: #define longjmp ::Throw ! 28: #else ! 29: extern "C" void __cdecl longjmp(jmp_buf, int); ! 30: #endif ! 31: ! 32: ///////////////////////////////////////////////////////////////////////////// ! 33: // single threaded, assume 1 global exception context ! 34: ! 35: CExceptionContext NEAR afxExceptionContext; ! 36: ! 37: IMPLEMENT_DYNAMIC(CException, CObject) // abstract class ! 38: ! 39: ///////////////////////////////////////////////////////////////////////////// ! 40: // class CExceptionContext (thread global state) ! 41: ! 42: void ! 43: CExceptionContext::Throw(CException* pNewException) ! 44: { ! 45: // default to not shared ! 46: Throw(pNewException, FALSE); ! 47: } ! 48: ! 49: void ! 50: CExceptionContext::ThrowLast() ! 51: { ! 52: // default to not shared, use the old one ! 53: ASSERT(m_pCurrent != NULL); ! 54: ! 55: Throw(m_pCurrent, FALSE); ! 56: } ! 57: ! 58: ! 59: void ! 60: CExceptionContext::Throw(CException* pNewException, BOOL bShared) ! 61: { ! 62: ASSERT(pNewException != NULL); ! 63: TRACE("Warning: Throwing an Exception of type %s\n", ! 64: pNewException->GetRuntimeClass()->m_pszClassName); ! 65: ! 66: if (m_pCurrent != pNewException) ! 67: { ! 68: // throwing a new exception (otherwise keep old shared state) ! 69: if (m_pCurrent != NULL && m_bDeleteWhenDone) ! 70: delete m_pCurrent; ! 71: m_pCurrent = pNewException; ! 72: m_bDeleteWhenDone = !bShared; ! 73: } ! 74: ! 75: // walk the handlers ! 76: if (m_pLinkTop == NULL) ! 77: { ! 78: // uncaught exception, terminate ! 79: TRACE("Error: Un-caught Exception (%s)\n", ! 80: pNewException->GetRuntimeClass()->m_pszClassName); ! 81: AfxTerminate(); ! 82: } ! 83: ! 84: CExceptionLink* pReceiver = m_pLinkTop; ! 85: m_pLinkTop = m_pLinkTop->m_pLinkPrev; ! 86: pReceiver->m_pLinkPrev = NULL; ! 87: longjmp(pReceiver->m_jumpBuf, 1); ! 88: } ! 89: ! 90: void ! 91: CExceptionContext::Cleanup() ! 92: { ! 93: if (m_bDeleteWhenDone) ! 94: delete m_pCurrent; ! 95: m_pCurrent = NULL; ! 96: } ! 97: ! 98: ! 99: CExceptionLink::~CExceptionLink() ! 100: { ! 101: if (afxExceptionContext.m_pLinkTop == this) ! 102: afxExceptionContext.m_pLinkTop = m_pLinkPrev; ! 103: else if (m_pLinkPrev != NULL) ! 104: AfxTerminate(); ! 105: } ! 106: ! 107: ///////////////////////////////////////////////////////////////////////////// ! 108: // Support for new exception APIs ! 109: ! 110: static AFX_TERM_PROC pfnTerminate = AfxAbort; ! 111: ! 112: void CDECL AfxTerminate() ! 113: { ! 114: TRACE("AfxTerminate called\n"); ! 115: (*pfnTerminate)(); ! 116: } ! 117: ! 118: AFX_TERM_PROC AfxSetTerminate(AFX_TERM_PROC pfnNew) ! 119: { ! 120: AFX_TERM_PROC pfnOld = pfnTerminate; ! 121: pfnTerminate = pfnNew; ! 122: return pfnOld; ! 123: } ! 124: ! 125: ///////////////////////////////////////////////////////////////////////////// ! 126: // Standard exceptions ! 127: ! 128: IMPLEMENT_DYNAMIC(CMemoryException, CException) ! 129: static CMemoryException NEAR simpleMemoryException; ! 130: void PASCAL AfxThrowMemoryException() ! 131: { afxExceptionContext.Throw(&simpleMemoryException, TRUE); } ! 132: ! 133: IMPLEMENT_DYNAMIC(CNotSupportedException, CException) ! 134: static CNotSupportedException NEAR simpleNotSupportedException; ! 135: void PASCAL AfxThrowNotSupportedException() ! 136: { afxExceptionContext.Throw(&simpleNotSupportedException, TRUE); } ! 137: ! 138: /////////////////////////////////////////////////////////////////////////////
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.