From c01dbf9fe8a02731432b02f048e0146e17afc0cc Mon Sep 17 00:00:00 2001 From: Hisham Muhammad Date: Tue, 5 Sep 2023 11:41:37 -0300 Subject: [PATCH] adjust code to more closely match documented semantics Instead of hardcoding the arguments within the loader, pass them through the searcher, as specified by the documented behavior: https://github.com/teal-language/tl/issues/689#issuecomment-1705914900 > quoted from https://www.lua.org/manual/5.4/manual.html#pdf-require > >> Once a loader is found, require calls the loader with two arguments: >> modname and an extra value, a loader data, also returned by the >> searcher. The loader data can be any value useful to the module; >> for the default searchers, it indicates where the loader was found. >> (For instance, if the loader came from a file, this extra value is >> the file path.) Thanks @fperrad for the research! --- tl.lua | 10 +++++----- tl.tl | 12 ++++++------ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/tl.lua b/tl.lua index 0620159d..3db88c27 100644 --- a/tl.lua +++ b/tl.lua @@ -5487,14 +5487,14 @@ local function init_globals(lax) }), ["loaders"] = a_type({ typename = "array", - elements = a_type({ typename = "function", args = TUPLE({ STRING }), rets = TUPLE({ ANY }) }), + elements = a_type({ typename = "function", args = TUPLE({ STRING }), rets = TUPLE({ ANY, ANY }) }), }), ["loadlib"] = a_type({ typename = "function", args = TUPLE({ STRING, STRING }), rets = TUPLE({ FUNCTION }) }), ["path"] = STRING, ["preload"] = TABLE, ["searchers"] = a_type({ typename = "array", - elements = a_type({ typename = "function", args = TUPLE({ STRING }), rets = TUPLE({ ANY }) }), + elements = a_type({ typename = "function", args = TUPLE({ STRING }), rets = TUPLE({ ANY, ANY }) }), }), ["searchpath"] = a_type({ typename = "function", args = TUPLE({ STRING, STRING, OPT(STRING), OPT(STRING) }), rets = TUPLE({ STRING, STRING }) }), }, @@ -10824,11 +10824,11 @@ local function tl_package_loader(module_name) local code = assert(tl.pretty_print_ast(program, env.gen_target, true)) local chunk, err = load(code, "@" .. found_filename, "t") if chunk then - return function() - local ret = chunk(module_name, found_filename) + return function(modname, loader_data) + local ret = chunk(modname, loader_data) package.loaded[module_name] = ret return ret - end + end, found_filename else error("Internal Compiler Error: Teal generator produced invalid Lua. Please report a bug at https://github.com/teal-language/tl\n\n" .. err) end diff --git a/tl.tl b/tl.tl index 954457cc..6068f3b5 100644 --- a/tl.tl +++ b/tl.tl @@ -5487,14 +5487,14 @@ local function init_globals(lax: boolean): {string:Variable}, {string:Type} }, ["loaders"] = a_type { typename = "array", - elements = a_type { typename = "function", args = TUPLE { STRING }, rets = TUPLE { ANY } } + elements = a_type { typename = "function", args = TUPLE { STRING }, rets = TUPLE { ANY, ANY } } }, ["loadlib"] = a_type { typename = "function", args = TUPLE { STRING, STRING }, rets = TUPLE { FUNCTION } }, ["path"] = STRING, ["preload"] = TABLE, ["searchers"] = a_type { typename = "array", - elements = a_type { typename = "function", args = TUPLE { STRING }, rets = TUPLE { ANY } } + elements = a_type { typename = "function", args = TUPLE { STRING }, rets = TUPLE { ANY, ANY } } }, ["searchpath"] = a_type { typename = "function", args = TUPLE { STRING, STRING, OPT(STRING), OPT(STRING) }, rets = TUPLE { STRING, STRING } }, }, @@ -10791,7 +10791,7 @@ tl.gen = function(input: string, env: Env): string, Result return code, result end -local function tl_package_loader(module_name: string): any +local function tl_package_loader(module_name: string): any, any local found_filename, fd, tried = tl.search_module(module_name, false) if found_filename then local input = read_full_file(fd) @@ -10824,11 +10824,11 @@ local function tl_package_loader(module_name: string): any local code = assert(tl.pretty_print_ast(program, env.gen_target, true)) local chunk, err = load(code, "@" .. found_filename, "t") if chunk then - return function(): any - local ret = chunk(module_name, found_filename) + return function(modname: string, loader_data: string): any + local ret = chunk(modname, loader_data) package.loaded[module_name] = ret return ret - end + end, found_filename else error("Internal Compiler Error: Teal generator produced invalid Lua. Please report a bug at https://github.com/teal-language/tl\n\n" .. err) end