diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2024-02-15 11:17:39 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2024-02-15 11:17:39 -0300 |
commit | 165389b27bc54e7c5214276db177e3ef75226f18 (patch) | |
tree | f6ce6e7bff04ff6cbe735ee68d64290cc04c04bf /linit.c | |
parent | c8121ce34b39c6fd31899f4da91e26063c8af54f (diff) | |
download | lua-165389b27bc54e7c5214276db177e3ef75226f18.tar.gz lua-165389b27bc54e7c5214276db177e3ef75226f18.tar.bz2 lua-165389b27bc54e7c5214276db177e3ef75226f18.zip |
New interface to function 'luaL_openselectedlibs'
Instead of preloading all non-loaded libraries, there is another
mask to select which libraries to preload.
Diffstat (limited to 'linit.c')
-rw-r--r-- | linit.c | 22 |
1 files changed, 10 insertions, 12 deletions
@@ -21,12 +21,12 @@ | |||
21 | 21 | ||
22 | 22 | ||
23 | /* | 23 | /* |
24 | ** Standard Libraries | 24 | ** Standard Libraries. (Must be listed in the same ORDER of their |
25 | ** respective constants LUA_<libname>K.) | ||
25 | */ | 26 | */ |
26 | static const luaL_Reg stdlibs[] = { | 27 | static const luaL_Reg stdlibs[] = { |
27 | {LUA_GNAME, luaopen_base}, | 28 | {LUA_GNAME, luaopen_base}, |
28 | {LUA_LOADLIBNAME, luaopen_package}, | 29 | {LUA_LOADLIBNAME, luaopen_package}, |
29 | |||
30 | {LUA_COLIBNAME, luaopen_coroutine}, | 30 | {LUA_COLIBNAME, luaopen_coroutine}, |
31 | {LUA_DBLIBNAME, luaopen_debug}, | 31 | {LUA_DBLIBNAME, luaopen_debug}, |
32 | {LUA_IOLIBNAME, luaopen_io}, | 32 | {LUA_IOLIBNAME, luaopen_io}, |
@@ -35,30 +35,28 @@ static const luaL_Reg stdlibs[] = { | |||
35 | {LUA_STRLIBNAME, luaopen_string}, | 35 | {LUA_STRLIBNAME, luaopen_string}, |
36 | {LUA_TABLIBNAME, luaopen_table}, | 36 | {LUA_TABLIBNAME, luaopen_table}, |
37 | {LUA_UTF8LIBNAME, luaopen_utf8}, | 37 | {LUA_UTF8LIBNAME, luaopen_utf8}, |
38 | |||
39 | {NULL, NULL} | 38 | {NULL, NULL} |
40 | }; | 39 | }; |
41 | 40 | ||
42 | 41 | ||
43 | /* | 42 | /* |
44 | ** require selected standard libraries and add the others to the | 43 | ** require and preload selected standard libraries |
45 | ** preload table. | ||
46 | */ | 44 | */ |
47 | LUALIB_API void luaL_openselectedlibs (lua_State *L, int what) { | 45 | LUALIB_API void luaL_openselectedlibs (lua_State *L, int load, int preload) { |
48 | int mask = 1; | 46 | int mask; |
49 | const luaL_Reg *lib; | 47 | const luaL_Reg *lib; |
50 | luaL_getsubtable(L, LUA_REGISTRYINDEX, LUA_PRELOAD_TABLE); | 48 | luaL_getsubtable(L, LUA_REGISTRYINDEX, LUA_PRELOAD_TABLE); |
51 | for (lib = stdlibs; lib->func; (lib++, mask <<= 1)) { | 49 | for (lib = stdlibs, mask = 1; lib->name != NULL; lib++, mask <<= 1) { |
52 | if (what & mask) { /* selected? */ | 50 | if (load & mask) { /* selected? */ |
53 | luaL_requiref(L, lib->name, lib->func, 1); /* require library */ | 51 | luaL_requiref(L, lib->name, lib->func, 1); /* require library */ |
54 | lua_pop(L, 1); /* remove result from the stack */ | 52 | lua_pop(L, 1); /* remove result from the stack */ |
55 | } | 53 | } |
56 | else { /* add library to PRELOAD table */ | 54 | else if (preload & mask) { /* selected? */ |
57 | lua_pushcfunction(L, lib->func); | 55 | lua_pushcfunction(L, lib->func); |
58 | lua_setfield(L, -2, lib->name); | 56 | lua_setfield(L, -2, lib->name); /* add library to PRELOAD table */ |
59 | } | 57 | } |
60 | } | 58 | } |
61 | lua_assert((mask >> 1) == LUA_UTF8LIBK); | 59 | lua_assert((mask >> 1) == LUA_UTF8LIBK); |
62 | lua_pop(L, 1); // remove PRELOAD table | 60 | lua_pop(L, 1); /* remove PRELOAD table */ |
63 | } | 61 | } |
64 | 62 | ||