From: Vadim Zeitlin Date: Sat, 4 Dec 1999 12:14:38 +0000 (+0000) Subject: debug check for infinite loop in InitializeClasses() added X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/309689b214a464ee0a85a8a40c3042b564b6343d debug check for infinite loop in InitializeClasses() added git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4815 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/common/object.cpp b/src/common/object.cpp index d70fdbd253..41fce11f16 100644 --- a/src/common/object.cpp +++ b/src/common/object.cpp @@ -225,6 +225,17 @@ return TRUE; // Set pointers to base class(es) to speed up IsKindOf void wxClassInfo::InitializeClasses() { + // 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__ + // more classes than we'll ever have + static const size_t nMaxClasses = 10000; + size_t nClass = 0; +#endif // Debug + wxClassInfo::sm_classTable = new wxHashTable(wxKEY_STRING); // Index all class infos by their class name @@ -232,7 +243,15 @@ void wxClassInfo::InitializeClasses() while (info) { 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); + } + info = info->m_next; }