aboutsummaryrefslogtreecommitdiff
path: root/base/plugins.cpp
diff options
context:
space:
mode:
authorMax Horn2006-09-20 11:54:15 +0000
committerMax Horn2006-09-20 11:54:15 +0000
commit16ace099aa10712c93887925a236645f103a54cd (patch)
tree4a440d1c319c9d90a9cb6f6f2d308f502865c984 /base/plugins.cpp
parente63717a2eb4df76fb97736daebb40b72c2f888fa (diff)
downloadscummvm-rg350-16ace099aa10712c93887925a236645f103a54cd.tar.gz
scummvm-rg350-16ace099aa10712c93887925a236645f103a54cd.tar.bz2
scummvm-rg350-16ace099aa10712c93887925a236645f103a54cd.zip
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
Diffstat (limited to 'base/plugins.cpp')
-rw-r--r--base/plugins.cpp20
1 files changed, 15 insertions, 5 deletions
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. <http://www.trilithium.com/johan/2004/12/problem-with-dlsym/>.
+ assert(sizeof(VoidFunc) == sizeof(func));
+ VoidFunc tmp;
+ memcpy(&tmp, &func, sizeof(VoidFunc));
+ return tmp;
}
bool DynamicPlugin::loadPlugin() {