From b9db890ebc8a5c900439c23cf7bdaa44721a35c3 Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 11 Sep 2002 09:54:03 -0400 Subject: ENH: Pointer-to-function to pointer-to-data casts are not even allowed in strict C. Re-implemented this conversion in pure C++ using a casting trick with an extra level of indirection. --- Source/cmDynamicLoader.cxx | 70 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 56 insertions(+), 14 deletions(-) (limited to 'Source/cmDynamicLoader.cxx') diff --git a/Source/cmDynamicLoader.cxx b/Source/cmDynamicLoader.cxx index 891f4c2928..05431767a8 100644 --- a/Source/cmDynamicLoader.cxx +++ b/Source/cmDynamicLoader.cxx @@ -16,20 +16,7 @@ =========================================================================*/ #include "cmDynamicLoader.h" -extern "C" -{ -cmDynamicLoaderFunction cmDynamicLoaderGetSymbolAddress(cmLibHandle, - const char*); -} - -// Dispatch to C implementation. -cmDynamicLoaderFunction cmDynamicLoader::GetSymbolAddress(cmLibHandle lib, - const char* sym) -{ - return cmDynamicLoaderGetSymbolAddress(lib, sym); -} - -// This file is actually 4 different implementations. +// This file is actually several different implementations. // 1. HP machines which uses shl_load // 2. Apple OSX which uses NSLinkModule // 3. Windows which uses LoadLibrary @@ -53,6 +40,19 @@ int cmDynamicLoader::CloseLibrary(cmLibHandle lib) return 0; } +cmDynamicLoaderFunction +cmDynamicLoader::GetSymbolAddress(cmLibHandle lib, const char* sym) +{ + void* addr; + int status; + + status = shl_findsym (&lib, sym, TYPE_PROCEDURE, &addr); + void* result = (status < 0) ? (void*)0 : addr; + + // Hack to cast pointer-to-data to pointer-to-function. + return *reinterpret_cast(&result); +} + const char* cmDynamicLoader::LibPrefix() { return "lib"; @@ -92,6 +92,22 @@ int cmDynamicLoader::CloseLibrary(cmLibHandle lib) return 0; } +cmDynamicLoaderFunction +cmDynamicLoader::GetSymbolAddress(cmLibHandle lib, const char* sym) +{ + void *result=0; + if(NSIsSymbolNameDefined(sym)) + { + NSSymbol symbol= NSLookupAndBindSymbol(sym); + if(symbol) + { + result = NSAddressOfSymbol(symbol); + } + } + // Hack to cast pointer-to-data to pointer-to-function. + return *reinterpret_cast(&result); +} + const char* cmDynamicLoader::LibPrefix() { return ""; @@ -136,6 +152,23 @@ int cmDynamicLoader::CloseLibrary(cmLibHandle lib) return (int)FreeLibrary(lib); } +cmDynamicLoaderFunction +cmDynamicLoader::GetSymbolAddress(cmLibHandle lib, const char* sym) +{ + void* result = 0; +#ifdef UNICODE + wchar_t *wsym = new wchar_t [mbstowcs(NULL, sym, 32000)]; + mbstowcs(wsym, sym, 32000); + void *ret = GetProcAddress(lib, wsym); + delete [] wsym; + result = ret; +#else + result = GetProcAddress(lib, sym); +#endif + // Hack to cast pointer-to-data to pointer-to-function. + return *reinterpret_cast(&result); +} + const char* cmDynamicLoader::LibPrefix() { return ""; @@ -188,6 +221,15 @@ int cmDynamicLoader::CloseLibrary(cmLibHandle lib) return (int)dlclose(lib); } +cmDynamicLoaderFunction +cmDynamicLoader::GetSymbolAddress(cmLibHandle lib, const char* sym) +{ + void* result = dlsym(lib, sym); + + // Hack to cast pointer-to-data to pointer-to-function. + return *reinterpret_cast(&result); +} + const char* cmDynamicLoader::LibPrefix() { return "lib"; -- cgit v1.2.1