aboutsummaryrefslogtreecommitdiff
path: root/src/lib_package.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib_package.c')
-rw-r--r--src/lib_package.c67
1 files changed, 44 insertions, 23 deletions
diff --git a/src/lib_package.c b/src/lib_package.c
index 01b63d63..71201ecc 100644
--- a/src/lib_package.c
+++ b/src/lib_package.c
@@ -76,6 +76,20 @@ static const char *ll_bcsym(void *lib, const char *sym)
76BOOL WINAPI GetModuleHandleExA(DWORD, LPCSTR, HMODULE*); 76BOOL WINAPI GetModuleHandleExA(DWORD, LPCSTR, HMODULE*);
77#endif 77#endif
78 78
79#if LJ_TARGET_UWP
80void *LJ_WIN_LOADLIBA(const char *path)
81{
82 DWORD err = GetLastError();
83 wchar_t wpath[256];
84 HANDLE lib = NULL;
85 if (MultiByteToWideChar(CP_ACP, 0, path, -1, wpath, 256) > 0) {
86 lib = LoadPackagedLibrary(wpath, 0);
87 }
88 SetLastError(err);
89 return lib;
90}
91#endif
92
79#undef setprogdir 93#undef setprogdir
80 94
81static void setprogdir(lua_State *L) 95static void setprogdir(lua_State *L)
@@ -96,9 +110,17 @@ static void setprogdir(lua_State *L)
96static void pusherror(lua_State *L) 110static void pusherror(lua_State *L)
97{ 111{
98 DWORD error = GetLastError(); 112 DWORD error = GetLastError();
113#if LJ_TARGET_XBOXONE
114 wchar_t wbuffer[128];
115 char buffer[128*2];
116 if (FormatMessageW(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM,
117 NULL, error, 0, wbuffer, sizeof(wbuffer)/sizeof(wchar_t), NULL) &&
118 WideCharToMultiByte(CP_ACP, 0, wbuffer, 128, buffer, 128*2, NULL, NULL))
119#else
99 char buffer[128]; 120 char buffer[128];
100 if (FormatMessageA(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM, 121 if (FormatMessageA(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM,
101 NULL, error, 0, buffer, sizeof(buffer), NULL)) 122 NULL, error, 0, buffer, sizeof(buffer), NULL))
123#endif
102 lua_pushstring(L, buffer); 124 lua_pushstring(L, buffer);
103 else 125 else
104 lua_pushfstring(L, "system error %d\n", error); 126 lua_pushfstring(L, "system error %d\n", error);
@@ -111,7 +133,7 @@ static void ll_unloadlib(void *lib)
111 133
112static void *ll_load(lua_State *L, const char *path, int gl) 134static void *ll_load(lua_State *L, const char *path, int gl)
113{ 135{
114 HINSTANCE lib = LoadLibraryA(path); 136 HINSTANCE lib = LJ_WIN_LOADLIBA(path);
115 if (lib == NULL) pusherror(L); 137 if (lib == NULL) pusherror(L);
116 UNUSED(gl); 138 UNUSED(gl);
117 return lib; 139 return lib;
@@ -124,17 +146,25 @@ static lua_CFunction ll_sym(lua_State *L, void *lib, const char *sym)
124 return f; 146 return f;
125} 147}
126 148
149#if LJ_TARGET_UWP
150EXTERN_C IMAGE_DOS_HEADER __ImageBase;
151#endif
152
127static const char *ll_bcsym(void *lib, const char *sym) 153static const char *ll_bcsym(void *lib, const char *sym)
128{ 154{
129 if (lib) { 155 if (lib) {
130 return (const char *)GetProcAddress((HINSTANCE)lib, sym); 156 return (const char *)GetProcAddress((HINSTANCE)lib, sym);
131 } else { 157 } else {
158#if LJ_TARGET_UWP
159 return (const char *)GetProcAddress((HINSTANCE)&__ImageBase, sym);
160#else
132 HINSTANCE h = GetModuleHandleA(NULL); 161 HINSTANCE h = GetModuleHandleA(NULL);
133 const char *p = (const char *)GetProcAddress(h, sym); 162 const char *p = (const char *)GetProcAddress(h, sym);
134 if (p == NULL && GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS|GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, 163 if (p == NULL && GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS|GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
135 (const char *)ll_bcsym, &h)) 164 (const char *)ll_bcsym, &h))
136 p = (const char *)GetProcAddress(h, sym); 165 p = (const char *)GetProcAddress(h, sym);
137 return p; 166 return p;
167#endif
138 } 168 }
139} 169}
140 170
@@ -185,8 +215,7 @@ static void **ll_register(lua_State *L, const char *path)
185 lua_pop(L, 1); 215 lua_pop(L, 1);
186 plib = (void **)lua_newuserdata(L, sizeof(void *)); 216 plib = (void **)lua_newuserdata(L, sizeof(void *));
187 *plib = NULL; 217 *plib = NULL;
188 luaL_getmetatable(L, "_LOADLIB"); 218 luaL_setmetatable(L, "_LOADLIB");
189 lua_setmetatable(L, -2);
190 lua_pushfstring(L, "LOADLIB: %s", path); 219 lua_pushfstring(L, "LOADLIB: %s", path);
191 lua_pushvalue(L, -2); 220 lua_pushvalue(L, -2);
192 lua_settable(L, LUA_REGISTRYINDEX); 221 lua_settable(L, LUA_REGISTRYINDEX);
@@ -391,8 +420,7 @@ static int lj_cf_package_loader_preload(lua_State *L)
391 420
392/* ------------------------------------------------------------------------ */ 421/* ------------------------------------------------------------------------ */
393 422
394static const int sentinel_ = 0; 423#define sentinel ((void *)0x4004)
395#define sentinel ((void *)&sentinel_)
396 424
397static int lj_cf_package_require(lua_State *L) 425static int lj_cf_package_require(lua_State *L)
398{ 426{
@@ -482,29 +510,19 @@ static void modinit(lua_State *L, const char *modname)
482static int lj_cf_package_module(lua_State *L) 510static int lj_cf_package_module(lua_State *L)
483{ 511{
484 const char *modname = luaL_checkstring(L, 1); 512 const char *modname = luaL_checkstring(L, 1);
485 int loaded = lua_gettop(L) + 1; /* index of _LOADED table */ 513 int lastarg = (int)(L->top - L->base);
486 lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED"); 514 luaL_pushmodule(L, modname, 1);
487 lua_getfield(L, loaded, modname); /* get _LOADED[modname] */
488 if (!lua_istable(L, -1)) { /* not found? */
489 lua_pop(L, 1); /* remove previous result */
490 /* try global variable (and create one if it does not exist) */
491 if (luaL_findtable(L, LUA_GLOBALSINDEX, modname, 1) != NULL)
492 lj_err_callerv(L, LJ_ERR_BADMODN, modname);
493 lua_pushvalue(L, -1);
494 lua_setfield(L, loaded, modname); /* _LOADED[modname] = new table */
495 }
496 /* check whether table already has a _NAME field */
497 lua_getfield(L, -1, "_NAME"); 515 lua_getfield(L, -1, "_NAME");
498 if (!lua_isnil(L, -1)) { /* is table an initialized module? */ 516 if (!lua_isnil(L, -1)) { /* Module already initialized? */
499 lua_pop(L, 1); 517 lua_pop(L, 1);
500 } else { /* no; initialize it */ 518 } else {
501 lua_pop(L, 1); 519 lua_pop(L, 1);
502 modinit(L, modname); 520 modinit(L, modname);
503 } 521 }
504 lua_pushvalue(L, -1); 522 lua_pushvalue(L, -1);
505 setfenv(L); 523 setfenv(L);
506 dooptions(L, loaded - 1); 524 dooptions(L, lastarg);
507 return 0; 525 return LJ_52;
508} 526}
509 527
510static int lj_cf_package_seeall(lua_State *L) 528static int lj_cf_package_seeall(lua_State *L)
@@ -575,13 +593,16 @@ LUALIB_API int luaopen_package(lua_State *L)
575 lj_lib_pushcf(L, lj_cf_package_unloadlib, 1); 593 lj_lib_pushcf(L, lj_cf_package_unloadlib, 1);
576 lua_setfield(L, -2, "__gc"); 594 lua_setfield(L, -2, "__gc");
577 luaL_register(L, LUA_LOADLIBNAME, package_lib); 595 luaL_register(L, LUA_LOADLIBNAME, package_lib);
578 lua_pushvalue(L, -1); 596 lua_copy(L, -1, LUA_ENVIRONINDEX);
579 lua_replace(L, LUA_ENVIRONINDEX);
580 lua_createtable(L, sizeof(package_loaders)/sizeof(package_loaders[0])-1, 0); 597 lua_createtable(L, sizeof(package_loaders)/sizeof(package_loaders[0])-1, 0);
581 for (i = 0; package_loaders[i] != NULL; i++) { 598 for (i = 0; package_loaders[i] != NULL; i++) {
582 lj_lib_pushcf(L, package_loaders[i], 1); 599 lj_lib_pushcf(L, package_loaders[i], 1);
583 lua_rawseti(L, -2, i+1); 600 lua_rawseti(L, -2, i+1);
584 } 601 }
602#if LJ_52
603 lua_pushvalue(L, -1);
604 lua_setfield(L, -3, "searchers");
605#endif
585 lua_setfield(L, -2, "loaders"); 606 lua_setfield(L, -2, "loaders");
586 lua_getfield(L, LUA_REGISTRYINDEX, "LUA_NOENV"); 607 lua_getfield(L, LUA_REGISTRYINDEX, "LUA_NOENV");
587 noenv = lua_toboolean(L, -1); 608 noenv = lua_toboolean(L, -1);