From: Václav Slavík Date: Wed, 6 Aug 2003 12:10:30 +0000 (+0000) Subject: deprecated Initialize/CleanUpClasses X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/cafc76a4bbbcb59f1c48d9c8f592c671238ffb51?ds=inline deprecated Initialize/CleanUpClasses git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@22629 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/object.h b/include/wx/object.h index bdb127321b..23f2359656 100644 --- a/include/wx/object.h +++ b/include/wx/object.h @@ -105,11 +105,13 @@ public: ( m_baseInfo2 && m_baseInfo2->IsKindOf(info) ) ); } +#ifdef WXWIN_COMPATIBILITY_2_4 // Initializes parent pointers and hash table for fast searching. - static void InitializeClasses(); - + wxDEPRECATED( static void InitializeClasses() ); // Cleans up hash table used for fast searching. - static void CleanUpClasses(); + wxDEPRECATED( static void CleanUpClasses() ); +#endif + static void CleanUp(); public: const wxChar *m_className; @@ -145,6 +147,11 @@ protected: WXDLLIMPEXP_BASE wxObject *wxCreateDynamicObject(const wxChar *name); +#ifdef WXWIN_COMPATIBILITY_2_4 +inline void wxClassInfo::InitializeClasses() {} +inline void wxClassInfo::CleanUpClasses() {} +#endif + // ---------------------------------------------------------------------------- // Dynamic class macros // ---------------------------------------------------------------------------- diff --git a/src/common/init.cpp b/src/common/init.cpp index 0000d789a4..2fd5771f04 100644 --- a/src/common/init.cpp +++ b/src/common/init.cpp @@ -206,8 +206,6 @@ static void FreeConvertedArgs() // initialization which is always done (not customizable) before wxApp creation static bool DoCommonPreInit() { - wxClassInfo::InitializeClasses(); - return true; } @@ -331,7 +329,7 @@ static void DoCommonPreCleanup() // cleanup done after destroying wxTheApp static void DoCommonPostCleanup() { - wxClassInfo::CleanUpClasses(); + wxClassInfo::CleanUp(); // we can't do this in wxApp itself because it doesn't know if argv had // been allocated diff --git a/src/common/object.cpp b/src/common/object.cpp index 212f195a28..9f6fccef06 100644 --- a/src/common/object.cpp +++ b/src/common/object.cpp @@ -215,52 +215,31 @@ wxClassInfo *wxClassInfo::FindClass(const wxChar *className) } } -// Set pointers to base class(es) to speed up IsKindOf -void wxClassInfo::InitializeClasses() +void wxClassInfo::CleanUp() { - // 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 - -#ifdef __WXDEBUG__ - static const size_t nMaxClasses = 10000; // more than we'll ever have - size_t nClass = 0; -#endif - - // Do this initialization only once, because classes are added - // automatically if - if ( sm_classTable == NULL ) + if ( sm_classTable ) { - 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) - { - if (info->m_className) - { - 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; } } -void wxClassInfo::CleanUpClasses() -{ - delete wxClassInfo::sm_classTable; - wxClassInfo::sm_classTable = NULL; -} - void wxClassInfo::Register() { - if ( sm_classTable ) + if ( !sm_classTable ) { - sm_classTable->Put(m_className, (wxObject *)this); + 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); } void wxClassInfo::Unregister() @@ -268,6 +247,11 @@ void wxClassInfo::Unregister() if ( sm_classTable ) { sm_classTable->Delete(m_className); + if ( sm_classTable->GetCount() == 0 ) + { + delete sm_classTable; + sm_classTable = NULL; + } } }