Annotation of mstools/mfc/src/object.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: #ifdef _WINDOWS
                     12: #ifndef _WINDLL
                     13: #include "afxole.h"
                     14: #else
                     15: #include "afxwin.h"
                     16: #endif //_WINDLL
                     17: #else
                     18: #include "afx.h"
                     19: #endif
                     20: 
                     21: #include "afxcoll.h"
                     22: 
                     23: #pragma hdrstop
                     24: 
                     25: #include <new.h>        // for set_new_handler
                     26: 
                     27: #ifdef AFX_CORE_SEG
                     28: #pragma code_seg(AFX_CORE_SEG)
                     29: #endif
                     30: 
                     31: #ifdef _DEBUG
                     32: #undef THIS_FILE
                     33: static char BASED_CODE THIS_FILE[] = __FILE__;
                     34: #endif
                     35: 
                     36: /////////////////////////////////////////////////////////////////////////////
                     37: // Runtime Typing
                     38: 
                     39: // special runtime-class structure for CObject (no base class)
                     40: struct CRuntimeClass NEAR CObject::classCObject =
                     41:        { "CObject", sizeof(CObject), 0xffff, NULL, NULL };
                     42: static CClassInit _init_CObject(&CObject::classCObject);
                     43: 
                     44: CRuntimeClass* CObject::GetRuntimeClass() const
                     45: {
                     46:        return &CObject::classCObject;
                     47: }
                     48: 
                     49: BOOL CObject::IsKindOf(const CRuntimeClass* pClass) const
                     50: {
                     51:        ASSERT(this != NULL);
                     52:        // it better be in valid memory, at least for CObject size
                     53:        ASSERT(AfxIsValidAddress(this, sizeof(CObject)));
                     54: 
                     55:        // simple SI case
                     56:        register CRuntimeClass* pClassThis = GetRuntimeClass();
                     57:        ASSERT(pClass != NULL);
                     58:        ASSERT(pClassThis != NULL);
                     59:        while (pClassThis != NULL)
                     60:        {
                     61:                if (pClassThis == pClass)
                     62:                        return TRUE;
                     63:                pClassThis = pClassThis->m_pBaseClass;
                     64:        }
                     65:        return FALSE;       // walked to the top, no match
                     66: }
                     67: 
                     68: /////////////////////////////////////////////////////////////////////////////
                     69: // Diagnostic Support
                     70: 
                     71: #ifdef _DEBUG
                     72: extern "C" void PASCAL AfxAssertValidObject(const CObject* pOb)
                     73: {
                     74:        if (pOb == NULL)
                     75:        {
                     76:                TRACE("ASSERT_VALID fails with NULL pointer\n");
                     77:                ASSERT(FALSE);
                     78:                return;     // quick escape
                     79:        }
                     80:        ASSERT(::AfxIsValidAddress(pOb, sizeof(CObject)));
                     81:        pOb->AssertValid();
                     82:        ASSERT(::AfxIsValidAddress(pOb, pOb->GetRuntimeClass()->m_nObjectSize));
                     83: }
                     84: #endif
                     85: 
                     86: 
                     87: void CObject::AssertValid() const
                     88: {
                     89:        ASSERT(this != NULL);
                     90: }
                     91: 
                     92: void
                     93: CObject::Dump(CDumpContext& dc) const
                     94: {
                     95: #ifdef _DEBUG
                     96:        dc << "a " << GetRuntimeClass()->m_pszClassName << " at " 
                     97:                << (void*) this << " ";
                     98: #else
                     99:        dc;
                    100: #endif //_DEBUG
                    101: }
                    102: 
                    103: ////////////////////////////////////////////////////////////////////////////
                    104: // Allocation/Creation
                    105: 
                    106: CObject* CRuntimeClass::CreateObject()
                    107: {
                    108:        void* p = CObject::operator new(m_nObjectSize);
                    109:        if (!ConstructObject(p))
                    110:        {
                    111:                CObject::operator delete(p);
                    112:                p = NULL;
                    113:        }
                    114:        return (CObject*) p;
                    115: }
                    116: 
                    117: BOOL CRuntimeClass::ConstructObject(void* pThis)
                    118: /*
                    119:   -- dynamically construct an instance of this class in the memory
                    120:                pointed to by 'pThis'
                    121:   -- return FALSE if can't construct (only possible cause is an abstract class)
                    122: */
                    123: {
                    124:        ASSERT(AfxIsValidAddress(pThis, m_nObjectSize));
                    125: 
                    126:        if (m_pfnConstruct != NULL)
                    127:        {
                    128:                (*m_pfnConstruct)(pThis);
                    129:                return TRUE;
                    130:        }
                    131:        else
                    132:        {
                    133:                TRACE("Error: Trying to construct an instance of an abstract class.\n");
                    134:                return FALSE;
                    135:        }
                    136: }
                    137: 
                    138: 
                    139: ////////////////////////////////////////////////////////////////////////////
                    140: // Class loader & class serialization
                    141: 
                    142: BOOL 
                    143: CObject::IsSerializable() const
                    144: { 
                    145:        return (GetRuntimeClass()->m_wSchema != 0xffff);
                    146: }
                    147: 
                    148: CRuntimeClass* CRuntimeClass::pFirstClass = NULL;
                    149: 
                    150: CClassInit::CClassInit(register CRuntimeClass* pNewClass)
                    151: {
                    152:        ASSERT(pNewClass->m_pNextClass == NULL);
                    153:        pNewClass->m_pNextClass = CRuntimeClass::pFirstClass;
                    154:        CRuntimeClass::pFirstClass = pNewClass;
                    155: }
                    156: 
                    157: #ifdef _DEBUG
                    158: void PASCAL 
                    159: AfxDoForAllClasses(void (*pfn)(const CRuntimeClass*, void*),
                    160:        void* pContext)
                    161: {
                    162:        CRuntimeClass* pClass;
                    163: 
                    164:        for (pClass = CRuntimeClass::pFirstClass; pClass != NULL;
                    165:                pClass = pClass->m_pNextClass)
                    166:        {
                    167:                (*pfn)(pClass, pContext);
                    168:        }
                    169: }
                    170: #endif
                    171: 
                    172: /////////////////////////////////////////////////////////////////////////////
                    173: // Non-diagnostic memory routines
                    174: //
                    175: 
                    176: #ifndef _DEBUG
                    177:        // Debugging version replaces global ::new so this is not needed
                    178: 
                    179: int cdecl AfxNewHandler(size_t /* nSize */)
                    180: {
                    181:        //  AFX memory allocation will never return "NULL" it will always throw
                    182:        //      a memory exception instead
                    183:        AfxThrowMemoryException();
                    184:        return 0;
                    185: }
                    186: #endif //!_DEBUG
                    187: 
                    188: 
                    189: // hook in our own new_handler
                    190: static BOOL AfxInitialize()
                    191: {
                    192:        (void)_afx_version();
                    193: #ifdef _DEBUG
                    194: 
                    195:        // Force reference of the following symbols for CodeView
                    196: #ifdef _WINDOWS
                    197:        (void)afxTraceFlags;
                    198: #endif
                    199: 
                    200:        (void)afxTraceEnabled;
                    201:        (void)afxMemDF;
                    202: 
                    203:        return AfxDiagnosticInit();
                    204: #else
                    205:        _set_new_handler(AfxNewHandler);
                    206:        return TRUE;
                    207: #endif // _DEBUG
                    208: }
                    209: 
                    210: static BOOL bInitialized = AfxInitialize();
                    211:                // a way to force initialization
                    212: 
                    213: /////////////////////////////////////////////////////////////////////////////

unix.superglobalmegacorp.com

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