X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/431346ff02c3ecbbd9160fe039da812002b0680e..19c35fa587f97cf83e2cb28afe76b8db85b36c9f:/src/common/object.cpp diff --git a/src/common/object.cpp b/src/common/object.cpp index e39d06cdbb..e29f32860c 100644 --- a/src/common/object.cpp +++ b/src/common/object.cpp @@ -10,7 +10,7 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "object.h" #endif @@ -194,9 +194,7 @@ wxClassInfo::~wxClassInfo() info = info->m_next; } } -#if wxUSE_EXTENDED_RTTI - Unregister( m_className ) ; -#endif + Unregister(); } wxClassInfo *wxClassInfo::FindClass(const wxChar *className) @@ -217,74 +215,44 @@ wxClassInfo *wxClassInfo::FindClass(const wxChar *className) } } -// a tiny InitializeClasses() helper -/* static */ -inline wxClassInfo *wxClassInfo::GetBaseByName(const wxChar *name) +void wxClassInfo::CleanUp() { - if ( !name ) - return NULL; - - wxClassInfo *classInfo = (wxClassInfo *)sm_classTable->Get(name); - -#ifdef __WXDEBUG__ - // this must be fixed, other things will work wrongly later if you get this - if ( !classInfo ) + if ( sm_classTable ) { - wxFAIL_MSG( wxString::Format - ( - _T("base class '%s' is unknown to wxWindows RTTI"), - name - ) ); + delete sm_classTable; + sm_classTable = NULL; } -#endif // __WXDEBUG__ - - return classInfo; } -// Set pointers to base class(es) to speed up IsKindOf -void wxClassInfo::InitializeClasses() +void wxClassInfo::Register() { + if ( !sm_classTable ) + { + sm_classTable = new wxHashTable(wxKEY_STRING); + } + // using IMPLEMENT_DYNAMIC_CLASS() macro twice (which may happen if you // link any object module twice mistakenly) will break this function // because it will enter an infinite loop and eventually die with "out of // memory" - as this is quite hard to detect if you're unaware of this, // try to do some checks here + wxASSERT_MSG( sm_classTable->Get(m_className) == NULL, + _T("class already in RTTI table - have you used IMPLEMENT_DYNAMIC_CLASS() twice (may be by linking some object module(s) twice)?") ); + + sm_classTable->Put(m_className, (wxObject *)this); +} -#ifdef __WXDEBUG__ - static const size_t nMaxClasses = 10000; // more than we'll ever have - size_t nClass = 0; -#endif - - sm_classTable = new wxHashTable(wxKEY_STRING); - - // Index all class infos by their class name - - wxClassInfo *info; - for(info = sm_first; info; info = info->m_next) +void wxClassInfo::Unregister() +{ + if ( sm_classTable ) { - if (info->m_className) + sm_classTable->Delete(m_className); + if ( sm_classTable->GetCount() == 0 ) { - wxASSERT_MSG( ++nClass < nMaxClasses, - _T("an infinite loop detected - have you used IMPLEMENT_DYNAMIC_CLASS() twice (may be by linking some object module(s) twice)?") ); - sm_classTable->Put(info->m_className, (wxObject *)info); + delete sm_classTable; + sm_classTable = NULL; } } - -#if wxUSE_EXTENDED_RTTI == 0 - // Set base pointers for each wxClassInfo - - for(info = sm_first; info; info = info->m_next) - { - info->m_baseInfo1 = GetBaseByName(info->GetBaseClassName1()); - info->m_baseInfo2 = GetBaseByName(info->GetBaseClassName2()); - } -#endif -} - -void wxClassInfo::CleanUpClasses() -{ - delete wxClassInfo::sm_classTable; - wxClassInfo::sm_classTable = NULL; } wxObject *wxCreateDynamicObject(const wxChar *name) @@ -396,34 +364,3 @@ wxObject::CloneRefData(const wxObjectRefData * WXUNUSED(data)) const return NULL; } - -// ---------------------------------------------------------------------------- -// misc -// ---------------------------------------------------------------------------- - -#if defined(__DARWIN__) && defined(WXMAKINGDLL) - -extern "C" { - void __initialize_Cplusplus(void); - void wxWindowsDylibInit(void); -}; - -// Dynamic shared library (dylib) initialization routine -// required to initialize static C++ objects bacause of lazy dynamic linking -// http://developer.apple.com/techpubs/macosx/Essentials/ -// SystemOverview/Frameworks/Dynamic_Shared_Libraries.html - -void wxWindowsDylibInit() -{ - // The function __initialize_Cplusplus() must be called from the shared - // library initialization routine to cause the static C++ objects in - // the library to be initialized (reference number 2441683). - - // This only seems to be necessary if the library initialization routine - // needs to use the static C++ objects - __initialize_Cplusplus(); -} - -#endif - -// vi:sts=4:sw=4:et