X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0c32066b58849e52e4d76e30982414d9f4daae6a..520e470fdd0daef09c77938db642e4583933c90d:/src/common/dynlib.cpp diff --git a/src/common/dynlib.cpp b/src/common/dynlib.cpp index 2fd32ddd58..91f3c16577 100644 --- a/src/common/dynlib.cpp +++ b/src/common/dynlib.cpp @@ -31,7 +31,7 @@ // System dependent include // --------------------------------------------------------------------------- -#ifdef __UNIX__ +#if defined(__UNIX__) #include #endif @@ -55,7 +55,7 @@ wxLibraries wxTheLibraries; wxLibrary::wxLibrary(void *handle) { - typedef wxClassInfo **(*t_get_first)(void); + typedef wxClassInfo *(*t_get_first)(void); t_get_first get_first; m_handle = handle; @@ -71,7 +71,7 @@ wxLibrary::wxLibrary(void *handle) wxLibrary::~wxLibrary() { if (m_handle && m_destroy) { -#ifdef __UNIX__ +#if defined(__UNIX__) dlclose(m_handle); #endif #ifdef __WINDOWS__ @@ -90,19 +90,19 @@ wxObject *wxLibrary::CreateObject(const wxString& name) return info->CreateObject(); } -void wxLibrary::PrepareClasses(wxClassInfo **first) +void wxLibrary::PrepareClasses(wxClassInfo *first) { // Index all class infos by their class name - wxClassInfo *info = *first; + wxClassInfo *info = first; while (info) { if (info->m_className) classTable.Put(info->m_className, (wxObject *)info); - info = info->m_next; + info = info->GetNext(); } // Set base pointers for each wxClassInfo - info = *first; + info = first; while (info) { if (info->GetBaseClassName1()) @@ -111,12 +111,11 @@ void wxLibrary::PrepareClasses(wxClassInfo **first) info->m_baseInfo2 = (wxClassInfo *)classTable.Get(info->GetBaseClassName2()); info = info->m_next; } - *first = NULL; } void *wxLibrary::GetSymbol(const wxString& symbname) { -#ifdef __UNIX__ +#if defined(__UNIX__) return dlsym(m_handle, WXSTRINGCAST symbname); #endif #ifdef __WINDOWS__ @@ -150,10 +149,15 @@ wxLibrary *wxLibraries::LoadLibrary(const wxString& name) wxString lib_name = name; wxNode *node; wxLibrary *lib; + wxClassInfo *old_sm_first; if ( (node = m_loaded.Find(name.GetData())) ) return ((wxLibrary *)node->Data()); + // If DLL shares data, this is necessary. + old_sm_first = wxClassInfo::sm_first; + wxClassInfo::sm_first = NULL; + #if defined(__UNIX__) lib_name.Prepend("./lib"); lib_name += ".so"; @@ -162,6 +166,8 @@ wxLibrary *wxLibraries::LoadLibrary(const wxString& name) void *handle = dlopen(WXSTRINGCAST lib_name, RTLD_LAZY); + printf("error = %s\n", dlerror()); + if (!handle) return NULL; #elif defined(__WINDOWS__) @@ -180,6 +186,8 @@ wxLibrary *wxLibraries::LoadLibrary(const wxString& name) lib = new wxLibrary((void *)handle); + wxClassInfo::sm_first = old_sm_first; + m_loaded.Append(name.GetData(), lib); return lib; } @@ -191,7 +199,7 @@ wxObject *wxLibraries::CreateObject(const wxString& path) while (node) { obj = ((wxLibrary *)node->Data())->CreateObject(path); - if (obj) + if (obj) return obj; node = node->Next();