diff options
Diffstat (limited to 'src/lj_clib.c')
-rw-r--r-- | src/lj_clib.c | 41 |
1 files changed, 31 insertions, 10 deletions
diff --git a/src/lj_clib.c b/src/lj_clib.c index 41a8738e..a7df719a 100644 --- a/src/lj_clib.c +++ b/src/lj_clib.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include "lj_cconv.h" | 16 | #include "lj_cconv.h" |
17 | #include "lj_cdata.h" | 17 | #include "lj_cdata.h" |
18 | #include "lj_clib.h" | 18 | #include "lj_clib.h" |
19 | #include "lj_strfmt.h" | ||
19 | 20 | ||
20 | /* -- OS-specific functions ----------------------------------------------- */ | 21 | /* -- OS-specific functions ----------------------------------------------- */ |
21 | 22 | ||
@@ -61,7 +62,7 @@ static const char *clib_extname(lua_State *L, const char *name) | |||
61 | #endif | 62 | #endif |
62 | ) { | 63 | ) { |
63 | if (!strchr(name, '.')) { | 64 | if (!strchr(name, '.')) { |
64 | name = lj_str_pushf(L, CLIB_SOEXT, name); | 65 | name = lj_strfmt_pushf(L, CLIB_SOEXT, name); |
65 | L->top--; | 66 | L->top--; |
66 | #if LJ_TARGET_CYGWIN | 67 | #if LJ_TARGET_CYGWIN |
67 | } else { | 68 | } else { |
@@ -70,7 +71,7 @@ static const char *clib_extname(lua_State *L, const char *name) | |||
70 | } | 71 | } |
71 | if (!(name[0] == CLIB_SOPREFIX[0] && name[1] == CLIB_SOPREFIX[1] && | 72 | if (!(name[0] == CLIB_SOPREFIX[0] && name[1] == CLIB_SOPREFIX[1] && |
72 | name[2] == CLIB_SOPREFIX[2])) { | 73 | name[2] == CLIB_SOPREFIX[2])) { |
73 | name = lj_str_pushf(L, CLIB_SOPREFIX "%s", name); | 74 | name = lj_strfmt_pushf(L, CLIB_SOPREFIX "%s", name); |
74 | L->top--; | 75 | L->top--; |
75 | } | 76 | } |
76 | } | 77 | } |
@@ -158,11 +159,13 @@ BOOL WINAPI GetModuleHandleExA(DWORD, LPCSTR, HMODULE*); | |||
158 | /* Default libraries. */ | 159 | /* Default libraries. */ |
159 | enum { | 160 | enum { |
160 | CLIB_HANDLE_EXE, | 161 | CLIB_HANDLE_EXE, |
162 | #if !LJ_TARGET_UWP | ||
161 | CLIB_HANDLE_DLL, | 163 | CLIB_HANDLE_DLL, |
162 | CLIB_HANDLE_CRT, | 164 | CLIB_HANDLE_CRT, |
163 | CLIB_HANDLE_KERNEL32, | 165 | CLIB_HANDLE_KERNEL32, |
164 | CLIB_HANDLE_USER32, | 166 | CLIB_HANDLE_USER32, |
165 | CLIB_HANDLE_GDI32, | 167 | CLIB_HANDLE_GDI32, |
168 | #endif | ||
166 | CLIB_HANDLE_MAX | 169 | CLIB_HANDLE_MAX |
167 | }; | 170 | }; |
168 | 171 | ||
@@ -172,11 +175,19 @@ LJ_NORET LJ_NOINLINE static void clib_error(lua_State *L, const char *fmt, | |||
172 | const char *name) | 175 | const char *name) |
173 | { | 176 | { |
174 | DWORD err = GetLastError(); | 177 | DWORD err = GetLastError(); |
178 | #if LJ_TARGET_XBOXONE | ||
179 | wchar_t wbuf[128]; | ||
180 | char buf[128*2]; | ||
181 | if (!FormatMessageW(FORMAT_MESSAGE_IGNORE_INSERTS|FORMAT_MESSAGE_FROM_SYSTEM, | ||
182 | NULL, err, 0, wbuf, sizeof(wbuf)/sizeof(wchar_t), NULL) || | ||
183 | !WideCharToMultiByte(CP_ACP, 0, wbuf, 128, buf, 128*2, NULL, NULL)) | ||
184 | #else | ||
175 | char buf[128]; | 185 | char buf[128]; |
176 | if (!FormatMessageA(FORMAT_MESSAGE_IGNORE_INSERTS|FORMAT_MESSAGE_FROM_SYSTEM, | 186 | if (!FormatMessageA(FORMAT_MESSAGE_IGNORE_INSERTS|FORMAT_MESSAGE_FROM_SYSTEM, |
177 | NULL, err, 0, buf, sizeof(buf), NULL)) | 187 | NULL, err, 0, buf, sizeof(buf), NULL)) |
188 | #endif | ||
178 | buf[0] = '\0'; | 189 | buf[0] = '\0'; |
179 | lj_err_callermsg(L, lj_str_pushf(L, fmt, name, buf)); | 190 | lj_err_callermsg(L, lj_strfmt_pushf(L, fmt, name, buf)); |
180 | } | 191 | } |
181 | 192 | ||
182 | static int clib_needext(const char *s) | 193 | static int clib_needext(const char *s) |
@@ -191,7 +202,7 @@ static int clib_needext(const char *s) | |||
191 | static const char *clib_extname(lua_State *L, const char *name) | 202 | static const char *clib_extname(lua_State *L, const char *name) |
192 | { | 203 | { |
193 | if (clib_needext(name)) { | 204 | if (clib_needext(name)) { |
194 | name = lj_str_pushf(L, "%s.dll", name); | 205 | name = lj_strfmt_pushf(L, "%s.dll", name); |
195 | L->top--; | 206 | L->top--; |
196 | } | 207 | } |
197 | return name; | 208 | return name; |
@@ -200,7 +211,7 @@ static const char *clib_extname(lua_State *L, const char *name) | |||
200 | static void *clib_loadlib(lua_State *L, const char *name, int global) | 211 | static void *clib_loadlib(lua_State *L, const char *name, int global) |
201 | { | 212 | { |
202 | DWORD oldwerr = GetLastError(); | 213 | DWORD oldwerr = GetLastError(); |
203 | void *h = (void *)LoadLibraryA(clib_extname(L, name)); | 214 | void *h = LJ_WIN_LOADLIBA(clib_extname(L, name)); |
204 | if (!h) clib_error(L, "cannot load module " LUA_QS ": %s", name); | 215 | if (!h) clib_error(L, "cannot load module " LUA_QS ": %s", name); |
205 | SetLastError(oldwerr); | 216 | SetLastError(oldwerr); |
206 | UNUSED(global); | 217 | UNUSED(global); |
@@ -210,6 +221,7 @@ static void *clib_loadlib(lua_State *L, const char *name, int global) | |||
210 | static void clib_unloadlib(CLibrary *cl) | 221 | static void clib_unloadlib(CLibrary *cl) |
211 | { | 222 | { |
212 | if (cl->handle == CLIB_DEFHANDLE) { | 223 | if (cl->handle == CLIB_DEFHANDLE) { |
224 | #if !LJ_TARGET_UWP | ||
213 | MSize i; | 225 | MSize i; |
214 | for (i = CLIB_HANDLE_KERNEL32; i < CLIB_HANDLE_MAX; i++) { | 226 | for (i = CLIB_HANDLE_KERNEL32; i < CLIB_HANDLE_MAX; i++) { |
215 | void *h = clib_def_handle[i]; | 227 | void *h = clib_def_handle[i]; |
@@ -218,11 +230,16 @@ static void clib_unloadlib(CLibrary *cl) | |||
218 | FreeLibrary((HINSTANCE)h); | 230 | FreeLibrary((HINSTANCE)h); |
219 | } | 231 | } |
220 | } | 232 | } |
233 | #endif | ||
221 | } else if (cl->handle) { | 234 | } else if (cl->handle) { |
222 | FreeLibrary((HINSTANCE)cl->handle); | 235 | FreeLibrary((HINSTANCE)cl->handle); |
223 | } | 236 | } |
224 | } | 237 | } |
225 | 238 | ||
239 | #if LJ_TARGET_UWP | ||
240 | EXTERN_C IMAGE_DOS_HEADER __ImageBase; | ||
241 | #endif | ||
242 | |||
226 | static void *clib_getsym(CLibrary *cl, const char *name) | 243 | static void *clib_getsym(CLibrary *cl, const char *name) |
227 | { | 244 | { |
228 | void *p = NULL; | 245 | void *p = NULL; |
@@ -231,6 +248,9 @@ static void *clib_getsym(CLibrary *cl, const char *name) | |||
231 | for (i = 0; i < CLIB_HANDLE_MAX; i++) { | 248 | for (i = 0; i < CLIB_HANDLE_MAX; i++) { |
232 | HINSTANCE h = (HINSTANCE)clib_def_handle[i]; | 249 | HINSTANCE h = (HINSTANCE)clib_def_handle[i]; |
233 | if (!(void *)h) { /* Resolve default library handles (once). */ | 250 | if (!(void *)h) { /* Resolve default library handles (once). */ |
251 | #if LJ_TARGET_UWP | ||
252 | h = (HINSTANCE)&__ImageBase; | ||
253 | #else | ||
234 | switch (i) { | 254 | switch (i) { |
235 | case CLIB_HANDLE_EXE: GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, NULL, &h); break; | 255 | case CLIB_HANDLE_EXE: GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, NULL, &h); break; |
236 | case CLIB_HANDLE_DLL: | 256 | case CLIB_HANDLE_DLL: |
@@ -241,11 +261,12 @@ static void *clib_getsym(CLibrary *cl, const char *name) | |||
241 | GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS|GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, | 261 | GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS|GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, |
242 | (const char *)&_fmode, &h); | 262 | (const char *)&_fmode, &h); |
243 | break; | 263 | break; |
244 | case CLIB_HANDLE_KERNEL32: h = LoadLibraryA("kernel32.dll"); break; | 264 | case CLIB_HANDLE_KERNEL32: h = LJ_WIN_LOADLIBA("kernel32.dll"); break; |
245 | case CLIB_HANDLE_USER32: h = LoadLibraryA("user32.dll"); break; | 265 | case CLIB_HANDLE_USER32: h = LJ_WIN_LOADLIBA("user32.dll"); break; |
246 | case CLIB_HANDLE_GDI32: h = LoadLibraryA("gdi32.dll"); break; | 266 | case CLIB_HANDLE_GDI32: h = LJ_WIN_LOADLIBA("gdi32.dll"); break; |
247 | } | 267 | } |
248 | if (!h) continue; | 268 | if (!h) continue; |
269 | #endif | ||
249 | clib_def_handle[i] = (void *)h; | 270 | clib_def_handle[i] = (void *)h; |
250 | } | 271 | } |
251 | p = (void *)GetProcAddress(h, name); | 272 | p = (void *)GetProcAddress(h, name); |
@@ -264,7 +285,7 @@ static void *clib_getsym(CLibrary *cl, const char *name) | |||
264 | LJ_NORET LJ_NOINLINE static void clib_error(lua_State *L, const char *fmt, | 285 | LJ_NORET LJ_NOINLINE static void clib_error(lua_State *L, const char *fmt, |
265 | const char *name) | 286 | const char *name) |
266 | { | 287 | { |
267 | lj_err_callermsg(L, lj_str_pushf(L, fmt, name, "no support for this OS")); | 288 | lj_err_callermsg(L, lj_strfmt_pushf(L, fmt, name, "no support for this OS")); |
268 | } | 289 | } |
269 | 290 | ||
270 | static void *clib_loadlib(lua_State *L, const char *name, int global) | 291 | static void *clib_loadlib(lua_State *L, const char *name, int global) |
@@ -348,7 +369,7 @@ TValue *lj_clib_index(lua_State *L, CLibrary *cl, GCstr *name) | |||
348 | CTInfo cconv = ctype_cconv(ct->info); | 369 | CTInfo cconv = ctype_cconv(ct->info); |
349 | if (cconv == CTCC_FASTCALL || cconv == CTCC_STDCALL) { | 370 | if (cconv == CTCC_FASTCALL || cconv == CTCC_STDCALL) { |
350 | CTSize sz = clib_func_argsize(cts, ct); | 371 | CTSize sz = clib_func_argsize(cts, ct); |
351 | const char *symd = lj_str_pushf(L, | 372 | const char *symd = lj_strfmt_pushf(L, |
352 | cconv == CTCC_FASTCALL ? "@%s@%d" : "_%s@%d", | 373 | cconv == CTCC_FASTCALL ? "@%s@%d" : "_%s@%d", |
353 | sym, sz); | 374 | sym, sz); |
354 | L->top--; | 375 | L->top--; |