-  wxHashTable table(wxKEY_STRING);
-
-  // Index all class infos by their class name
-  wxClassInfo *info = first;
-  while (info)
-  {
-    if (info->className)
-      table.Put(info->className, (wxObject *)info);
-    info = info->next;
-  }
-
-  // Set base pointers for each wxClassInfo
-  info = first;
-  while (info)
-  {
-    if (info->GetBaseClassName1())
-      info->baseInfo1 = (wxClassInfo *)table.Get(info->GetBaseClassName1());
-    if (info->GetBaseClassName2())
-      info->baseInfo2 = (wxClassInfo *)table.Get(info->GetBaseClassName2());
-    info = info->next;
-  }
+    // 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
+
+    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);
+        }
+    }
+
+        // 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());
+    }