aboutsummaryrefslogtreecommitdiff
path: root/src/lj_clib.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_clib.c')
-rw-r--r--src/lj_clib.c41
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. */
158enum { 159enum {
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
181static int clib_needext(const char *s) 192static int clib_needext(const char *s)
@@ -190,7 +201,7 @@ static int clib_needext(const char *s)
190static const char *clib_extname(lua_State *L, const char *name) 201static 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)
199static void *clib_loadlib(lua_State *L, const char *name, int global) 210static 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)
209static void clib_unloadlib(CLibrary *cl) 220static 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
239EXTERN_C IMAGE_DOS_HEADER __ImageBase;
240#endif
241
225static void *clib_getsym(CLibrary *cl, const char *name) 242static 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)
263LJ_NORET LJ_NOINLINE static void clib_error(lua_State *L, const char *fmt, 284LJ_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
269static void *clib_loadlib(lua_State *L, const char *name, int global) 290static 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--;