From 16ace099aa10712c93887925a236645f103a54cd Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 20 Sep 2006 11:54:15 +0000 Subject: Work around conflict between ISO C++ and POSIX, to allow ISO C++ compliant compilers like GCC 4.x to compile the plugin code again svn-id: r23945 --- base/plugins.cpp | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) (limited to 'base/plugins.cpp') diff --git a/base/plugins.cpp b/base/plugins.cpp index 25b8a7a5f8..b222fcfcc2 100644 --- a/base/plugins.cpp +++ b/base/plugins.cpp @@ -141,6 +141,9 @@ public: #ifdef DYNAMIC_MODULES class DynamicPlugin : public Plugin { +protected: + typedef void (*VoidFunc)(); + void *_dlHandle; Common::String _filename; @@ -151,7 +154,7 @@ class DynamicPlugin : public Plugin { DetectFunc _df; GameList _games; - void *findSymbol(const char *symbol); + VoidFunc findSymbol(const char *symbol); public: DynamicPlugin(const Common::String &filename) @@ -181,22 +184,29 @@ public: void unloadPlugin(); }; -void *DynamicPlugin::findSymbol(const char *symbol) { +DynamicPlugin::VoidFunc DynamicPlugin::findSymbol(const char *symbol) { #if defined(UNIX) || defined(__DC__) void *func = dlsym(_dlHandle, symbol); if (!func) warning("Failed loading symbol '%s' from plugin '%s' (%s)", symbol, _filename.c_str(), dlerror()); - return func; #else #if defined(_WIN32) - void *func = (void*)GetProcAddress((HMODULE)_dlHandle, symbol); + void *func = (void *)GetProcAddress((HMODULE)_dlHandle, symbol); if (!func) warning("Failed loading symbol '%s' from plugin '%s'", symbol, _filename.c_str()); - return func; #else #error TODO #endif #endif + + // FIXME HACK: This is a HACK to circumvent a clash between the ISO C++ + // standard and POSIX: ISO C++ disallows casting between function pointers + // and data pointers, but dlsym always returns a void pointer. For details, + // see e.g. . + assert(sizeof(VoidFunc) == sizeof(func)); + VoidFunc tmp; + memcpy(&tmp, &func, sizeof(VoidFunc)); + return tmp; } bool DynamicPlugin::loadPlugin() { -- cgit v1.2.3