diff options
author | Mike Pall <mike> | 2018-06-05 17:03:08 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2018-06-05 17:03:08 +0200 |
commit | c3c54ce1aef782823936808a75460e6b53aada2c (patch) | |
tree | 999dc989e25281bfc36ed8861d6f14b5d4e89786 /src/lj_clib.c | |
parent | a5a89ab586a3b5bb4f266949bbf3dc2b140e2374 (diff) | |
download | luajit-c3c54ce1aef782823936808a75460e6b53aada2c.tar.gz luajit-c3c54ce1aef782823936808a75460e6b53aada2c.tar.bz2 luajit-c3c54ce1aef782823936808a75460e6b53aada2c.zip |
Windows: Add UWP support, part 1.
Contributed by Ben Pye.
Diffstat (limited to 'src/lj_clib.c')
-rw-r--r-- | src/lj_clib.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/src/lj_clib.c b/src/lj_clib.c index 61426590..f016b06b 100644 --- a/src/lj_clib.c +++ b/src/lj_clib.c | |||
@@ -158,11 +158,13 @@ BOOL WINAPI GetModuleHandleExA(DWORD, LPCSTR, HMODULE*); | |||
158 | /* Default libraries. */ | 158 | /* Default libraries. */ |
159 | enum { | 159 | enum { |
160 | CLIB_HANDLE_EXE, | 160 | CLIB_HANDLE_EXE, |
161 | #if !LJ_TARGET_UWP | ||
161 | CLIB_HANDLE_DLL, | 162 | CLIB_HANDLE_DLL, |
162 | CLIB_HANDLE_CRT, | 163 | CLIB_HANDLE_CRT, |
163 | CLIB_HANDLE_KERNEL32, | 164 | CLIB_HANDLE_KERNEL32, |
164 | CLIB_HANDLE_USER32, | 165 | CLIB_HANDLE_USER32, |
165 | CLIB_HANDLE_GDI32, | 166 | CLIB_HANDLE_GDI32, |
167 | #endif | ||
166 | CLIB_HANDLE_MAX | 168 | CLIB_HANDLE_MAX |
167 | }; | 169 | }; |
168 | 170 | ||
@@ -208,7 +210,7 @@ static const char *clib_extname(lua_State *L, const char *name) | |||
208 | static void *clib_loadlib(lua_State *L, const char *name, int global) | 210 | static void *clib_loadlib(lua_State *L, const char *name, int global) |
209 | { | 211 | { |
210 | DWORD oldwerr = GetLastError(); | 212 | DWORD oldwerr = GetLastError(); |
211 | void *h = (void *)LoadLibraryExA(clib_extname(L, name), NULL, 0); | 213 | void *h = LJ_WIN_LOADLIBA(clib_extname(L, name)); |
212 | if (!h) clib_error(L, "cannot load module " LUA_QS ": %s", name); | 214 | if (!h) clib_error(L, "cannot load module " LUA_QS ": %s", name); |
213 | SetLastError(oldwerr); | 215 | SetLastError(oldwerr); |
214 | UNUSED(global); | 216 | UNUSED(global); |
@@ -218,6 +220,7 @@ static void *clib_loadlib(lua_State *L, const char *name, int global) | |||
218 | static void clib_unloadlib(CLibrary *cl) | 220 | static void clib_unloadlib(CLibrary *cl) |
219 | { | 221 | { |
220 | if (cl->handle == CLIB_DEFHANDLE) { | 222 | if (cl->handle == CLIB_DEFHANDLE) { |
223 | #if !LJ_TARGET_UWP | ||
221 | MSize i; | 224 | MSize i; |
222 | for (i = CLIB_HANDLE_KERNEL32; i < CLIB_HANDLE_MAX; i++) { | 225 | for (i = CLIB_HANDLE_KERNEL32; i < CLIB_HANDLE_MAX; i++) { |
223 | void *h = clib_def_handle[i]; | 226 | void *h = clib_def_handle[i]; |
@@ -226,11 +229,16 @@ static void clib_unloadlib(CLibrary *cl) | |||
226 | FreeLibrary((HINSTANCE)h); | 229 | FreeLibrary((HINSTANCE)h); |
227 | } | 230 | } |
228 | } | 231 | } |
232 | #endif | ||
229 | } else if (cl->handle) { | 233 | } else if (cl->handle) { |
230 | FreeLibrary((HINSTANCE)cl->handle); | 234 | FreeLibrary((HINSTANCE)cl->handle); |
231 | } | 235 | } |
232 | } | 236 | } |
233 | 237 | ||
238 | #if LJ_TARGET_UWP | ||
239 | EXTERN_C IMAGE_DOS_HEADER __ImageBase; | ||
240 | #endif | ||
241 | |||
234 | static void *clib_getsym(CLibrary *cl, const char *name) | 242 | static void *clib_getsym(CLibrary *cl, const char *name) |
235 | { | 243 | { |
236 | void *p = NULL; | 244 | void *p = NULL; |
@@ -239,6 +247,9 @@ static void *clib_getsym(CLibrary *cl, const char *name) | |||
239 | for (i = 0; i < CLIB_HANDLE_MAX; i++) { | 247 | for (i = 0; i < CLIB_HANDLE_MAX; i++) { |
240 | HINSTANCE h = (HINSTANCE)clib_def_handle[i]; | 248 | HINSTANCE h = (HINSTANCE)clib_def_handle[i]; |
241 | if (!(void *)h) { /* Resolve default library handles (once). */ | 249 | if (!(void *)h) { /* Resolve default library handles (once). */ |
250 | #if LJ_TARGET_UWP | ||
251 | h = (HINSTANCE)&__ImageBase; | ||
252 | #else | ||
242 | switch (i) { | 253 | switch (i) { |
243 | case CLIB_HANDLE_EXE: GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, NULL, &h); break; | 254 | case CLIB_HANDLE_EXE: GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, NULL, &h); break; |
244 | case CLIB_HANDLE_DLL: | 255 | case CLIB_HANDLE_DLL: |
@@ -249,11 +260,12 @@ static void *clib_getsym(CLibrary *cl, const char *name) | |||
249 | GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS|GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, | 260 | GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS|GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, |
250 | (const char *)&_fmode, &h); | 261 | (const char *)&_fmode, &h); |
251 | break; | 262 | break; |
252 | case CLIB_HANDLE_KERNEL32: h = LoadLibraryExA("kernel32.dll", NULL, 0); break; | 263 | case CLIB_HANDLE_KERNEL32: h = LJ_WIN_LOADLIBA("kernel32.dll"); break; |
253 | case CLIB_HANDLE_USER32: h = LoadLibraryExA("user32.dll", NULL, 0); break; | 264 | case CLIB_HANDLE_USER32: h = LJ_WIN_LOADLIBA("user32.dll"); break; |
254 | case CLIB_HANDLE_GDI32: h = LoadLibraryExA("gdi32.dll", NULL, 0); break; | 265 | case CLIB_HANDLE_GDI32: h = LJ_WIN_LOADLIBA("gdi32.dll"); break; |
255 | } | 266 | } |
256 | if (!h) continue; | 267 | if (!h) continue; |
268 | #endif | ||
257 | clib_def_handle[i] = (void *)h; | 269 | clib_def_handle[i] = (void *)h; |
258 | } | 270 | } |
259 | p = (void *)GetProcAddress(h, name); | 271 | p = (void *)GetProcAddress(h, name); |