Annotation of mstools/mfc/src/except.cpp, revision 1.1.1.1

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: /////////////////////////////////////////////////////////////////////////////

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.