X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4fe5383d6c6463e16e2d5b6b5fefe311b33e128f..399b60a0ad232265cd74ce8bf6a53a1f2cc57ff2:/src/common/object.cpp diff --git a/src/common/object.cpp b/src/common/object.cpp index de51bf7c62..ab59919f01 100644 --- a/src/common/object.cpp +++ b/src/common/object.cpp @@ -44,11 +44,9 @@ #include "wx/ioswrap.h" #endif -#if !USE_SHARED_LIBRARY wxClassInfo wxObject::sm_classwxObject((wxChar *) wxT("wxObject"), (wxChar *) NULL, (wxChar *) NULL, (int ) sizeof(wxObject), (wxObjectConstructorFn) NULL); wxClassInfo* wxClassInfo::sm_first = (wxClassInfo *) NULL; wxHashTable* wxClassInfo::sm_classTable = (wxHashTable*) NULL; -#endif /* * wxWindows root object. @@ -225,6 +223,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 +241,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; } @@ -275,14 +292,12 @@ wxObject *wxCreateDynamicObject(const wxChar *name) } return (wxObject*) NULL; } - return (wxObject*) NULL; } #if wxUSE_SERIAL #include "wx/serbase.h" #include "wx/dynlib.h" -#include "wx/msgdlg.h" wxObject* wxCreateStoredObject( wxInputStream &stream ) { @@ -361,7 +376,6 @@ void wxObject::UnRef() if ( !--m_refData->m_count ) delete m_refData; - m_refData = (wxObjectRefData *) NULL; } }