diff options
| -rw-r--r-- | loadlib.c | 33 |
1 files changed, 20 insertions, 13 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: loadlib.c,v 1.60 2008/08/05 19:25:42 roberto Exp roberto $ | 2 | ** $Id: loadlib.c,v 1.61 2008/08/06 13:38:32 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 | ** |
| @@ -43,7 +43,7 @@ | |||
| 43 | 43 | ||
| 44 | 44 | ||
| 45 | static void ll_unloadlib (void *lib); | 45 | static void ll_unloadlib (void *lib); |
| 46 | static void *ll_load (lua_State *L, const char *path); | 46 | static void *ll_load (lua_State *L, const char *path, int seeglb); |
| 47 | static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym); | 47 | static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym); |
| 48 | 48 | ||
| 49 | 49 | ||
| @@ -65,8 +65,8 @@ static void ll_unloadlib (void *lib) { | |||
| 65 | } | 65 | } |
| 66 | 66 | ||
| 67 | 67 | ||
| 68 | static void *ll_load (lua_State *L, const char *path) { | 68 | static void *ll_load (lua_State *L, const char *path, int seeglb) { |
| 69 | void *lib = dlopen(path, RTLD_NOW); | 69 | void *lib = dlopen(path, RTLD_NOW | (seeglb ? RTLD_GLOBAL : 0)); |
| 70 | if (lib == NULL) lua_pushstring(L, dlerror()); | 70 | if (lib == NULL) lua_pushstring(L, dlerror()); |
| 71 | return lib; | 71 | return lib; |
| 72 | } | 72 | } |
| @@ -122,8 +122,9 @@ static void ll_unloadlib (void *lib) { | |||
| 122 | } | 122 | } |
| 123 | 123 | ||
| 124 | 124 | ||
| 125 | static void *ll_load (lua_State *L, const char *path) { | 125 | static void *ll_load (lua_State *L, const char *path, int seeglb) { |
| 126 | HINSTANCE lib = LoadLibrary(path); | 126 | HINSTANCE lib = LoadLibrary(path); |
| 127 | UNUSED(seeglb); /* symbols are 'global' by default? */ | ||
| 127 | if (lib == NULL) pusherror(L); | 128 | if (lib == NULL) pusherror(L); |
| 128 | return lib; | 129 | return lib; |
| 129 | } | 130 | } |
| @@ -186,7 +187,7 @@ static void ll_unloadlib (void *lib) { | |||
| 186 | } | 187 | } |
| 187 | 188 | ||
| 188 | 189 | ||
| 189 | static void *ll_load (lua_State *L, const char *path) { | 190 | static void *ll_load (lua_State *L, const char *path, int seeglb) { |
| 190 | NSObjectFileImage img; | 191 | NSObjectFileImage img; |
| 191 | NSObjectFileImageReturnCode ret; | 192 | NSObjectFileImageReturnCode ret; |
| 192 | /* this would be a rare case, but prevents crashing if it happens */ | 193 | /* this would be a rare case, but prevents crashing if it happens */ |
| @@ -196,8 +197,10 @@ static void *ll_load (lua_State *L, const char *path) { | |||
| 196 | } | 197 | } |
| 197 | ret = NSCreateObjectFileImageFromFile(path, &img); | 198 | ret = NSCreateObjectFileImageFromFile(path, &img); |
| 198 | if (ret == NSObjectFileImageSuccess) { | 199 | if (ret == NSObjectFileImageSuccess) { |
| 199 | NSModule mod = NSLinkModule(img, path, NSLINKMODULE_OPTION_PRIVATE | | 200 | NSModule mod = NSLinkModule(img, |
| 200 | NSLINKMODULE_OPTION_RETURN_ON_ERROR); | 201 | path, |
| 202 | NSLINKMODULE_OPTION_RETURN_ON_ERROR | | ||
| 203 | (seeglb ? 0 : NSLINKMODULE_OPTION_PRIVATE)); | ||
| 201 | NSDestroyObjectFileImage(img); | 204 | NSDestroyObjectFileImage(img); |
| 202 | if (mod == NULL) pusherror(L); | 205 | if (mod == NULL) pusherror(L); |
| 203 | return mod; | 206 | return mod; |
| @@ -235,19 +238,19 @@ static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) { | |||
| 235 | 238 | ||
| 236 | 239 | ||
| 237 | static void ll_unloadlib (void *lib) { | 240 | static void ll_unloadlib (void *lib) { |
| 238 | (void)lib; /* to avoid warnings */ | 241 | UNUSED(lib); /* to avoid warnings */ |
| 239 | } | 242 | } |
| 240 | 243 | ||
| 241 | 244 | ||
| 242 | static void *ll_load (lua_State *L, const char *path) { | 245 | static void *ll_load (lua_State *L, const char *path, int seeglb) { |
| 243 | (void)path; /* to avoid warnings */ | 246 | UNUSED(path); /* to avoid warnings */ |
| 244 | lua_pushliteral(L, DLMSG); | 247 | lua_pushliteral(L, DLMSG); |
| 245 | return NULL; | 248 | return NULL; |
| 246 | } | 249 | } |
| 247 | 250 | ||
| 248 | 251 | ||
| 249 | static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) { | 252 | static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) { |
| 250 | (void)lib; (void)sym; /* to avoid warnings */ | 253 | UNUSED(lib); UNUSED(sym); /* to avoid warnings */ |
| 251 | lua_pushliteral(L, DLMSG); | 254 | lua_pushliteral(L, DLMSG); |
| 252 | return NULL; | 255 | return NULL; |
| 253 | } | 256 | } |
| @@ -291,9 +294,13 @@ static int gctm (lua_State *L) { | |||
| 291 | 294 | ||
| 292 | static int ll_loadfunc (lua_State *L, const char *path, const char *sym) { | 295 | static int ll_loadfunc (lua_State *L, const char *path, const char *sym) { |
| 293 | void **reg = ll_register(L, path); | 296 | void **reg = ll_register(L, path); |
| 294 | if (*reg == NULL) *reg = ll_load(L, path); | 297 | if (*reg == NULL) *reg = ll_load(L, path, *sym == '*'); |
| 295 | if (*reg == NULL) | 298 | if (*reg == NULL) |
| 296 | return ERRLIB; /* unable to load library */ | 299 | return ERRLIB; /* unable to load library */ |
| 300 | else if (*sym == '*') { /* loading only library (no function)? */ | ||
| 301 | lua_pushboolean(L, 1); /* return 'true' */ | ||
| 302 | return 0; | ||
| 303 | } | ||
| 297 | else { | 304 | else { |
| 298 | lua_CFunction f = ll_sym(L, *reg, sym); | 305 | lua_CFunction f = ll_sym(L, *reg, sym); |
| 299 | if (f == NULL) | 306 | if (f == NULL) |
