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 8dc3c10e..f016b06b 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 | } |
@@ -157,11 +158,13 @@ BOOL WINAPI GetModuleHandleExA(DWORD, LPCSTR, HMODULE*); | |||
157 | /* Default libraries. */ | 158 | /* Default libraries. */ |
158 | enum { | 159 | enum { |
159 | CLIB_HANDLE_EXE, | 160 | CLIB_HANDLE_EXE, |
161 | #if !LJ_TARGET_UWP | ||
160 | CLIB_HANDLE_DLL, | 162 | CLIB_HANDLE_DLL, |
161 | CLIB_HANDLE_CRT, | 163 | CLIB_HANDLE_CRT, |
162 | CLIB_HANDLE_KERNEL32, | 164 | CLIB_HANDLE_KERNEL32, |
163 | CLIB_HANDLE_USER32, | 165 | CLIB_HANDLE_USER32, |
164 | CLIB_HANDLE_GDI32, | 166 | CLIB_HANDLE_GDI32, |
167 | #endif | ||
165 | CLIB_HANDLE_MAX | 168 | CLIB_HANDLE_MAX |
166 | }; | 169 | }; |
167 | 170 | ||
@@ -171,11 +174,19 @@ LJ_NORET LJ_NOINLINE static void clib_error(lua_State *L, const char *fmt, | |||
171 | const char *name) | 174 | const char *name) |
172 | { | 175 | { |
173 | DWORD err = GetLastError(); | 176 | DWORD err = GetLastError(); |
177 | #if LJ_TARGET_XBOXONE | ||
178 | wchar_t wbuf[128]; | ||
179 | char buf[128*2]; | ||
180 | if (!FormatMessageW(FORMAT_MESSAGE_IGNORE_INSERTS|FORMAT_MESSAGE_FROM_SYSTEM, | ||
181 | NULL, err, 0, wbuf, sizeof(wbuf)/sizeof(wchar_t), NULL) || | ||
182 | !WideCharToMultiByte(CP_ACP, 0, wbuf, 128, buf, 128*2, NULL, NULL)) | ||
183 | #else | ||
174 | char buf[128]; | 184 | char buf[128]; |
175 | if (!FormatMessageA(FORMAT_MESSAGE_IGNORE_INSERTS|FORMAT_MESSAGE_FROM_SYSTEM, | 185 | if (!FormatMessageA(FORMAT_MESSAGE_IGNORE_INSERTS|FORMAT_MESSAGE_FROM_SYSTEM, |
176 | NULL, err, 0, buf, sizeof(buf), NULL)) | 186 | NULL, err, 0, buf, sizeof(buf), NULL)) |
187 | #endif | ||
177 | buf[0] = '\0'; | 188 | buf[0] = '\0'; |
178 | lj_err_callermsg(L, lj_str_pushf(L, fmt, name, buf)); | 189 | lj_err_callermsg(L, lj_strfmt_pushf(L, fmt, name, buf)); |
179 | } | 190 | } |
180 | 191 | ||
181 | static int clib_needext(const char *s) | 192 | static int clib_needext(const char *s) |
@@ -190,7 +201,7 @@ static int clib_needext(const char *s) | |||
190 | static const char *clib_extname(lua_State *L, const char *name) | 201 | static const char *clib_extname(lua_State *L, const char *name) |
191 | { | 202 | { |
192 | if (clib_needext(name)) { | 203 | if (clib_needext(name)) { |
193 | name = lj_str_pushf(L, "%s.dll", name); | 204 | name = lj_strfmt_pushf(L, "%s.dll", name); |
194 | L->top--; | 205 | L->top--; |
195 | } | 206 | } |
196 | return name; | 207 | return name; |
@@ -199,7 +210,7 @@ static const char *clib_extname(lua_State *L, const char *name) | |||
199 | 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) |
200 | { | 211 | { |
201 | DWORD oldwerr = GetLastError(); | 212 | DWORD oldwerr = GetLastError(); |
202 | void *h = (void *)LoadLibraryA(clib_extname(L, name)); | 213 | void *h = LJ_WIN_LOADLIBA(clib_extname(L, name)); |
203 | 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); |
204 | SetLastError(oldwerr); | 215 | SetLastError(oldwerr); |
205 | UNUSED(global); | 216 | UNUSED(global); |
@@ -209,6 +220,7 @@ static void *clib_loadlib(lua_State *L, const char *name, int global) | |||
209 | static void clib_unloadlib(CLibrary *cl) | 220 | static void clib_unloadlib(CLibrary *cl) |
210 | { | 221 | { |
211 | if (cl->handle == CLIB_DEFHANDLE) { | 222 | if (cl->handle == CLIB_DEFHANDLE) { |
223 | #if !LJ_TARGET_UWP | ||
212 | MSize i; | 224 | MSize i; |
213 | for (i = CLIB_HANDLE_KERNEL32; i < CLIB_HANDLE_MAX; i++) { | 225 | for (i = CLIB_HANDLE_KERNEL32; i < CLIB_HANDLE_MAX; i++) { |
214 | void *h = clib_def_handle[i]; | 226 | void *h = clib_def_handle[i]; |
@@ -217,11 +229,16 @@ static void clib_unloadlib(CLibrary *cl) | |||
217 | FreeLibrary((HINSTANCE)h); | 229 | FreeLibrary((HINSTANCE)h); |
218 | } | 230 | } |
219 | } | 231 | } |
232 | #endif | ||
220 | } else if (cl->handle) { | 233 | } else if (cl->handle) { |
221 | FreeLibrary((HINSTANCE)cl->handle); | 234 | FreeLibrary((HINSTANCE)cl->handle); |
222 | } | 235 | } |
223 | } | 236 | } |
224 | 237 | ||
238 | #if LJ_TARGET_UWP | ||
239 | EXTERN_C IMAGE_DOS_HEADER __ImageBase; | ||
240 | #endif | ||
241 | |||
225 | static void *clib_getsym(CLibrary *cl, const char *name) | 242 | static void *clib_getsym(CLibrary *cl, const char *name) |
226 | { | 243 | { |
227 | void *p = NULL; | 244 | void *p = NULL; |
@@ -230,6 +247,9 @@ static void *clib_getsym(CLibrary *cl, const char *name) | |||
230 | for (i = 0; i < CLIB_HANDLE_MAX; i++) { | 247 | for (i = 0; i < CLIB_HANDLE_MAX; i++) { |
231 | HINSTANCE h = (HINSTANCE)clib_def_handle[i]; | 248 | HINSTANCE h = (HINSTANCE)clib_def_handle[i]; |
232 | 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 | ||
233 | switch (i) { | 253 | switch (i) { |
234 | 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; |
235 | case CLIB_HANDLE_DLL: | 255 | case CLIB_HANDLE_DLL: |
@@ -240,11 +260,12 @@ static void *clib_getsym(CLibrary *cl, const char *name) | |||
240 | 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, |
241 | (const char *)&_fmode, &h); | 261 | (const char *)&_fmode, &h); |
242 | break; | 262 | break; |
243 | case CLIB_HANDLE_KERNEL32: h = LoadLibraryA("kernel32.dll"); break; | 263 | case CLIB_HANDLE_KERNEL32: h = LJ_WIN_LOADLIBA("kernel32.dll"); break; |
244 | case CLIB_HANDLE_USER32: h = LoadLibraryA("user32.dll"); break; | 264 | case CLIB_HANDLE_USER32: h = LJ_WIN_LOADLIBA("user32.dll"); break; |
245 | case CLIB_HANDLE_GDI32: h = LoadLibraryA("gdi32.dll"); break; | 265 | case CLIB_HANDLE_GDI32: h = LJ_WIN_LOADLIBA("gdi32.dll"); break; |
246 | } | 266 | } |
247 | if (!h) continue; | 267 | if (!h) continue; |
268 | #endif | ||
248 | clib_def_handle[i] = (void *)h; | 269 | clib_def_handle[i] = (void *)h; |
249 | } | 270 | } |
250 | p = (void *)GetProcAddress(h, name); | 271 | p = (void *)GetProcAddress(h, name); |
@@ -263,7 +284,7 @@ static void *clib_getsym(CLibrary *cl, const char *name) | |||
263 | LJ_NORET LJ_NOINLINE static void clib_error(lua_State *L, const char *fmt, | 284 | LJ_NORET LJ_NOINLINE static void clib_error(lua_State *L, const char *fmt, |
264 | const char *name) | 285 | const char *name) |
265 | { | 286 | { |
266 | lj_err_callermsg(L, lj_str_pushf(L, fmt, name, "no support for this OS")); | 287 | lj_err_callermsg(L, lj_strfmt_pushf(L, fmt, name, "no support for this OS")); |
267 | } | 288 | } |
268 | 289 | ||
269 | static void *clib_loadlib(lua_State *L, const char *name, int global) | 290 | static void *clib_loadlib(lua_State *L, const char *name, int global) |
@@ -347,7 +368,7 @@ TValue *lj_clib_index(lua_State *L, CLibrary *cl, GCstr *name) | |||
347 | CTInfo cconv = ctype_cconv(ct->info); | 368 | CTInfo cconv = ctype_cconv(ct->info); |
348 | if (cconv == CTCC_FASTCALL || cconv == CTCC_STDCALL) { | 369 | if (cconv == CTCC_FASTCALL || cconv == CTCC_STDCALL) { |
349 | CTSize sz = clib_func_argsize(cts, ct); | 370 | CTSize sz = clib_func_argsize(cts, ct); |
350 | const char *symd = lj_str_pushf(L, | 371 | const char *symd = lj_strfmt_pushf(L, |
351 | cconv == CTCC_FASTCALL ? "@%s@%d" : "_%s@%d", | 372 | cconv == CTCC_FASTCALL ? "@%s@%d" : "_%s@%d", |
352 | sym, sz); | 373 | sym, sz); |
353 | L->top--; | 374 | L->top--; |