diff options
Diffstat (limited to 'src/lib_package.c')
-rw-r--r-- | src/lib_package.c | 67 |
1 files changed, 44 insertions, 23 deletions
diff --git a/src/lib_package.c b/src/lib_package.c index a8bdcf17..5d8eb25d 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) | |||
76 | BOOL WINAPI GetModuleHandleExA(DWORD, LPCSTR, HMODULE*); | 76 | BOOL WINAPI GetModuleHandleExA(DWORD, LPCSTR, HMODULE*); |
77 | #endif | 77 | #endif |
78 | 78 | ||
79 | #if LJ_TARGET_UWP | ||
80 | void *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 | ||
81 | static void setprogdir(lua_State *L) | 95 | static void setprogdir(lua_State *L) |
@@ -96,9 +110,17 @@ static void setprogdir(lua_State *L) | |||
96 | static void pusherror(lua_State *L) | 110 | static 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 | ||
112 | static void *ll_load(lua_State *L, const char *path, int gl) | 134 | static 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 | ||
150 | EXTERN_C IMAGE_DOS_HEADER __ImageBase; | ||
151 | #endif | ||
152 | |||
127 | static const char *ll_bcsym(void *lib, const char *sym) | 153 | static 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 | ||
394 | static const int sentinel_ = 0; | 423 | #define sentinel ((void *)0x4004) |
395 | #define sentinel ((void *)&sentinel_) | ||
396 | 424 | ||
397 | static int lj_cf_package_require(lua_State *L) | 425 | static int lj_cf_package_require(lua_State *L) |
398 | { | 426 | { |
@@ -482,29 +510,19 @@ static void modinit(lua_State *L, const char *modname) | |||
482 | static int lj_cf_package_module(lua_State *L) | 510 | static 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 | ||
510 | static int lj_cf_package_seeall(lua_State *L) | 528 | static 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); |