From d8017ff99553039e6d0114a033eb9c352076eaee Mon Sep 17 00:00:00 2001 From: ostermine Date: Sat, 10 Oct 2026 00:52:23 +0300 Subject: [PATCH] fix reload_module ignoring pack environment reload_module loaded the new module code with the global environment, while require runs modules in their pack environment. After reload, PACK_ID and other pack globals were nil in the module. --- dev/tests/reload_module.lua | 33 +++++++++++++++++++++++++++++++++ res/scripts/stdmin.lua | 16 ++++++++++------ 2 files changed, 43 insertions(+), 6 deletions(-) create mode 100644 dev/tests/reload_module.lua diff --git a/dev/tests/reload_module.lua b/dev/tests/reload_module.lua new file mode 100644 index 000000000..8ee5ab232 --- /dev/null +++ b/dev/tests/reload_module.lua @@ -0,0 +1,33 @@ +-- reload_module must run the module in its pack environment, as require does +local util = require "core:tests_util" +util.create_demo_world() + +-- a pack with a module that uses pack environment (PACK_ID) +local PACK = "world:content/reload_test" +file.mkdirs(PACK .. "/modules") +file.write(PACK .. "/package.json", json.tostring({id="reload_test", title="reload_test"})) + +local function write_module(version) + file.write(PACK .. "/modules/mod.lua", string.format([[ +local this = {} +function this.info() return PACK_ID, %d end +return this +]], version)) +end + +write_module(1) +app.reconfig_packs({"reload_test"}, {}) +app.tick() + +local mod = require "reload_test:mod" +local packid, version = mod.info() +assert(packid == "reload_test" and version == 1) + +write_module(2) +reload_module("reload_test:mod") +packid, version = mod.info() +assert(version == 2, "module is not reloaded") +assert(packid == "reload_test", "reloaded module has no pack environment") + +app.close_world(true) +app.delete_world("demo") diff --git a/res/scripts/stdmin.lua b/res/scripts/stdmin.lua index e1b735478..9fe297aab 100644 --- a/res/scripts/stdmin.lua +++ b/res/scripts/stdmin.lua @@ -183,6 +183,12 @@ function on_deprecated_call(name, alternatives) end end +local __pack_envs = __vc__pack_envs +function __vc_internals.get_pack_env(packid) + return __pack_envs[packid] +end +__vc__pack_envs = nil + function reload_module(name) local prefix, name = parse_path(name) local path = prefix..":modules/"..name..".lua" @@ -196,6 +202,10 @@ function reload_module(name) if script == nil then error(err) end + local env = __pack_envs[prefix] + if env then + script = setfenv(script, env) + end local result = script() if not result then return @@ -270,12 +280,6 @@ function __vc_lock_internal_modules() __internal_locked = true end -local __pack_envs = __vc__pack_envs -function __vc_internals.get_pack_env(packid) - return __pack_envs[packid] -end -__vc__pack_envs = nil - function require(path) if not string.find(path, ':') then local prefix, _ = parse_path(_debug_getinfo(2).source)