diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2015-01-05 11:51:39 -0200 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2015-01-05 11:51:39 -0200 |
| commit | 0adfa773b96d815cab3f17afd7bcafd3eeee7c49 (patch) | |
| tree | 05c3d1313b5b9eaeabff42a92c58366941ccb1b0 /loadlib.c | |
| parent | 3317f5c6d9f3c8370430bb8b412b7f7a65b797b2 (diff) | |
| download | lua-0adfa773b96d815cab3f17afd7bcafd3eeee7c49.tar.gz lua-0adfa773b96d815cab3f17afd7bcafd3eeee7c49.tar.bz2 lua-0adfa773b96d815cab3f17afd7bcafd3eeee7c49.zip | |
new macro 'cast_func' adds '__extension__' (in gnu compilers) when
converting void* to function, to avoid warnings
Diffstat (limited to 'loadlib.c')
| -rw-r--r-- | loadlib.c | 16 |
1 files changed, 14 insertions, 2 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: loadlib.c,v 1.122 2014/11/10 14:28:31 roberto Exp roberto $ | 2 | ** $Id: loadlib.c,v 1.123 2014/11/12 13:31:51 roberto Exp roberto $ |
| 3 | ** Dynamic library loader for Lua | 3 | ** Dynamic library loader for Lua |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | ** | 5 | ** |
| @@ -135,6 +135,18 @@ static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym); | |||
| 135 | 135 | ||
| 136 | #include <dlfcn.h> | 136 | #include <dlfcn.h> |
| 137 | 137 | ||
| 138 | /* | ||
| 139 | ** Macro to covert pointer to void* to pointer to function. This cast | ||
| 140 | ** is undefined according to ISO C, but POSIX assumes that it must work. | ||
| 141 | ** (The '__extension__' in gnu compilers is only to avoid warnings.) | ||
| 142 | */ | ||
| 143 | #if defined(__GNUC__) | ||
| 144 | #define cast_func(p) (__extension__ (lua_CFunction)(p)) | ||
| 145 | #else | ||
| 146 | #define cast_func(p) ((lua_CFunction)(p)) | ||
| 147 | #endif | ||
| 148 | |||
| 149 | |||
| 138 | static void lsys_unloadlib (void *lib) { | 150 | static void lsys_unloadlib (void *lib) { |
| 139 | dlclose(lib); | 151 | dlclose(lib); |
| 140 | } | 152 | } |
| @@ -148,7 +160,7 @@ static void *lsys_load (lua_State *L, const char *path, int seeglb) { | |||
| 148 | 160 | ||
| 149 | 161 | ||
| 150 | static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) { | 162 | static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) { |
| 151 | lua_CFunction f = (lua_CFunction)dlsym(lib, sym); | 163 | lua_CFunction f = cast_func(dlsym(lib, sym)); |
| 152 | if (f == NULL) lua_pushstring(L, dlerror()); | 164 | if (f == NULL) lua_pushstring(L, dlerror()); |
| 153 | return f; | 165 | return f; |
| 154 | } | 166 | } |
