-    // 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)?") );
+    // Using IMPLEMENT_DYNAMIC_CLASS() macro twice (which may happen if you
+    // link any object module twice mistakenly, or link twice against wx shared
+    // library) 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( classTable->Get(m_className) == NULL,
+        wxString::Format
+        (
+            wxT("Class \"%s\" already in RTTI table - have you used IMPLEMENT_DYNAMIC_CLASS() multiple times or linked some object file twice)?"),
+            m_className
+        )
+    );
+
+    classTable->Put(m_className, (wxObject *)this);
+
+    // if we're using a local hash we need to try to make it global
+    if ( sm_classTable != classTable )
+    {
+        if ( !sm_classTable )
+        {
+            // make the hash global
+            sm_classTable = classTable;
+        }
+        else
+        {
+            // the gobal hash has already been created by a reentrant call,
+            // so delete the local hash and try again
+            delete classTable;
+            Register();
+        }
+    }