[latex3-commits] [git/LaTeX3-latex3-latex3] main: Use `try_require` instead of `pcall(require, ...)` (11d25e3c6)

Max Chernoff 49086429+gucci-on-fleek at users.noreply.github.com.org
Wed May 18 01:59:44 CEST 2022


Repository : https://github.com/latex3/latex3
On branch  : main
Link       : https://github.com/latex3/latex3/commit/11d25e3c66eed7685066ea4926e6d8a7be32416f

>---------------------------------------------------------------

commit 11d25e3c66eed7685066ea4926e6d8a7be32416f
Author: Max Chernoff <49086429+gucci-on-fleek at users.noreply.github.com>
Date:   Tue May 17 17:59:44 2022 -0600

    Use `try_require` instead of `pcall(require,...)`


>---------------------------------------------------------------

11d25e3c66eed7685066ea4926e6d8a7be32416f
 l3kernel/l3luatex.dtx | 32 +++++++++++++++++++++++++++++++-
 1 file changed, 31 insertions(+), 1 deletion(-)

diff --git a/l3kernel/l3luatex.dtx b/l3kernel/l3luatex.dtx
index 0b84997c3..d449dfaaa 100644
--- a/l3kernel/l3luatex.dtx
+++ b/l3kernel/l3luatex.dtx
@@ -361,6 +361,9 @@ local cprint     = tex.cprint
 local write      = tex.write
 local write_nl   = texio.write_nl
 local utf8_char  = utf8.char
+local package_loaded    = package.loaded
+local package_searchers = package.searchers
+local table_concat      = table.concat
 
 local scan_int     = token.scan_int or token.scan_integer
 local scan_string  = token.scan_string
@@ -605,6 +608,33 @@ end
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}[int]{try_require}
+%   Loads a Lua module. This function loads the module similarly to the standard
+%   Lua global function |require|, with a few differences. On success,
+%   |try_require| returns |true, module|. If the module cannot be found, it
+%   returns |false, err_msg|. If the module is found, but something goes wrong
+%   when loading it, the function throws an error.
+%    \begin{macrocode}
+local function try_require(name)
+  if package_loaded[name] then
+    return true, package_loaded[name]
+  end
+
+  local failure_details = {}
+  for _, searcher in ipairs(package_searchers) do
+    local loader, data = searcher(name)
+    if type(loader) == 'function' then
+      package_loaded[name] = loader(name, data) or true
+      return true, package_loaded[name]
+    elseif type(loader) == 'string' then
+      failure_details[#failure_details + 1] = loader
+    end
+  end
+
+  return false, table_concat(failure_details, '\n')
+end
+%    \end{macrocode}
+% \end{macro}
 %
 % \begin{macro}{\@@_load_module_p:n}
 %   Check to see if we can load a module using |require|. If we
@@ -617,7 +647,7 @@ local c_false_bool = token_create(0, char_given)
 local c_str_cctab  = token_create('c_str_cctab').mode
 
 luacmd('@@_load_module_p:n', function()
-  local success, result = pcall(require, scan_string())
+  local success, result = try_require(scan_string())
   if success then
     set_macro(c_str_cctab, 'l_@@_err_msg_str', '')
     put_next(c_true_bool)





More information about the latex3-commits mailing list.