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
This commit is contained in:
parent
f6b7723929
commit
309689b214
@ -225,6 +225,17 @@ return TRUE;
|
|||||||
// Set pointers to base class(es) to speed up IsKindOf
|
// Set pointers to base class(es) to speed up IsKindOf
|
||||||
void wxClassInfo::InitializeClasses()
|
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);
|
wxClassInfo::sm_classTable = new wxHashTable(wxKEY_STRING);
|
||||||
|
|
||||||
// Index all class infos by their class name
|
// Index all class infos by their class name
|
||||||
@ -232,7 +243,15 @@ void wxClassInfo::InitializeClasses()
|
|||||||
while (info)
|
while (info)
|
||||||
{
|
{
|
||||||
if (info->m_className)
|
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);
|
sm_classTable->Put(info->m_className, (wxObject *)info);
|
||||||
|
}
|
||||||
|
|
||||||
info = info->m_next;
|
info = info->m_next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user