[Dev-luatex] require "lfs" doesn't work on LuajitTeX

ARATA Mizuki minorinoki at gmail.com
Wed Dec 26 12:01:00 CET 2018


Hi,

Even though LuajitTeX has lfs as a built-in library, trying to load it via `require` doesn't work.
(LuaTeX with Lua 5.2/5.3 doesn't have this problem)

This is because the field package.loaded["lfs"] is not set during initialization.

To fix this, change Luas_open to set the module (returned by the module loader) to the package.loaded table, which is available as _LOADED on the registry table.

Also, zlib suffers from a similar problem, both on LuaTeX and LuajitTeX.

Here is a proposed patch to fix these problems:

diff --git a/source/texk/web2c/luatexdir/lua/luastuff.c b/source/texk/web2c/luatexdir/lua/luastuff.c
index 0d9342223..a0590c400 100644
--- a/source/texk/web2c/luatexdir/lua/luastuff.c
+++ b/source/texk/web2c/luatexdir/lua/luastuff.c
@@ -36,9 +36,14 @@ int lua_active = 0;
 #define Luas_load(Luas,getS,ls,lua_id) \
     lua_load(Luas,getS,ls,lua_id);
 #define Luas_open(name,luaopen_lib) \
+    luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 1); \
     lua_pushcfunction(L, luaopen_lib); \
     lua_pushstring(L, name); \
-    lua_call(L, 1, 0);
+    lua_call(L, 1, 1); \
+    lua_pushvalue(L, -1); /* copy of module */ \
+    lua_setfield(L, -3, name); /* _LOADED[name] = module */ \
+    lua_setglobal(L, name); /* _G[name] = module */ \
+    lua_pop(L, 1); /* pop _LOADED table */
 #else
 #define Luas_load(Luas,getS,ls,lua_id) \
     lua_load(Luas,getS,ls,lua_id,NULL);
@@ -347,8 +352,7 @@ void luainterpreter(void)
         luatex_socketlua_open(L);
     }
     /*tex |zlib|'s slightly odd calling convention */
-    luaopen_zlib(L);
-    lua_setglobal(L, "zlib");
+    Luas_open("zlib", luaopen_zlib);
     luaopen_gzip(L);
     /*tex our own libraries register themselves */
     luaopen_fio(L);

-- 
Mizuki



More information about the dev-luatex mailing list