aboutsummaryrefslogtreecommitdiff
path: root/src/lj_clib.c
diff options
context:
space:
mode:
authorMike Pall <mike>2018-06-05 17:03:08 +0200
committerMike Pall <mike>2018-06-05 17:03:08 +0200
commitc3c54ce1aef782823936808a75460e6b53aada2c (patch)
tree999dc989e25281bfc36ed8861d6f14b5d4e89786 /src/lj_clib.c
parenta5a89ab586a3b5bb4f266949bbf3dc2b140e2374 (diff)
downloadluajit-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.c20
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. */
159enum { 159enum {
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)
208static void *clib_loadlib(lua_State *L, const char *name, int global) 210static 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)
218static void clib_unloadlib(CLibrary *cl) 220static 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
239EXTERN_C IMAGE_DOS_HEADER __ImageBase;
240#endif
241
234static void *clib_getsym(CLibrary *cl, const char *name) 242static 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);