Add missing item alias metatables to async environment (#12458)

master
sfan5 2022-07-04 01:06:42 +02:00 committed by GitHub
parent 34f15259fa
commit fc3460470a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 35 additions and 10 deletions

View File

@ -25,11 +25,13 @@ do
local all = assert(core.transferred_globals) local all = assert(core.transferred_globals)
core.transferred_globals = nil core.transferred_globals = nil
-- reassemble other tables
all.registered_nodes = {} all.registered_nodes = {}
all.registered_craftitems = {} all.registered_craftitems = {}
all.registered_tools = {} all.registered_tools = {}
for k, v in pairs(all.registered_items) do for k, v in pairs(all.registered_items) do
-- Disable further modification
setmetatable(v, {__newindex = {}})
-- Reassemble the other tables
if v.type == "node" then if v.type == "node" then
all.registered_nodes[k] = v all.registered_nodes[k] = v
elseif v.type == "craftitem" then elseif v.type == "craftitem" then
@ -43,3 +45,15 @@ do
core[k] = v core[k] = v
end end
end end
-- For tables that are indexed by item name:
-- If table[X] does not exist, default to table[core.registered_aliases[X]]
local alias_metatable = {
__index = function(t, name)
return rawget(t, core.registered_aliases[name])
end
}
setmetatable(core.registered_items, alias_metatable)
setmetatable(core.registered_nodes, alias_metatable)
setmetatable(core.registered_craftitems, alias_metatable)
setmetatable(core.registered_tools, alias_metatable)

View File

@ -1,4 +1,4 @@
-- Minetest: builtin/misc_register.lua -- Minetest: builtin/register.lua
local S = core.get_translator("__builtin") local S = core.get_translator("__builtin")

View File

@ -123,10 +123,10 @@ local function test_handle_async(cb)
core.handle_async(func, function(...) core.handle_async(func, function(...)
if not deepequal(expect, {...}) then if not deepequal(expect, {...}) then
cb("Values did not equal") return cb("Values did not equal")
end end
if core.get_last_run_mod() ~= expect[1] then if core.get_last_run_mod() ~= expect[1] then
cb("Mod name not tracked correctly") return cb("Mod name not tracked correctly")
end end
-- Test passing of nil arguments and return values -- Test passing of nil arguments and return values
@ -134,7 +134,7 @@ local function test_handle_async(cb)
return a, b return a, b
end, function(a, b) end, function(a, b)
if b ~= 123 then if b ~= 123 then
cb("Argument went missing") return cb("Argument went missing")
end end
cb() cb()
end, nil, 123) end, nil, 123)
@ -151,7 +151,7 @@ local function test_userdata_passing2(cb, _, pos)
return vm_:get_node_at(pos_) return vm_:get_node_at(pos_)
end, function(ret) end, function(ret)
if not deepequal(expect, ret) then if not deepequal(expect, ret) then
cb("Node data mismatch (one-way)") return cb("Node data mismatch (one-way)")
end end
-- VManip: test a roundtrip -- VManip: test a roundtrip
@ -159,7 +159,7 @@ local function test_userdata_passing2(cb, _, pos)
return vm_ return vm_
end, function(vm2) end, function(vm2)
if not deepequal(expect, vm2:get_node_at(pos)) then if not deepequal(expect, vm2:get_node_at(pos)) then
cb("Node data mismatch (roundtrip)") return cb("Node data mismatch (roundtrip)")
end end
cb() cb()
end, vm) end, vm)

View File

@ -36,6 +36,7 @@ local function await(invoke)
called_early = {...} called_early = {...}
else else
coroutine.resume(co, ...) coroutine.resume(co, ...)
co = nil
end end
end) end)
if called_early ~= true then if called_early ~= true then

View File

@ -2,7 +2,7 @@ unittests = {}
core.log("info", "Hello World") core.log("info", "Hello World")
function unittests.async_test() local function do_tests()
assert(core == minetest) assert(core == minetest)
-- stuff that should not be here -- stuff that should not be here
assert(not core.get_player_by_name) assert(not core.get_player_by_name)
@ -11,5 +11,15 @@ function unittests.async_test()
-- stuff that should be here -- stuff that should be here
assert(ItemStack) assert(ItemStack)
assert(core.registered_items[""]) assert(core.registered_items[""])
return true -- alias handling
assert(core.registered_items["unittests:steel_ingot_alias"].name ==
"unittests:steel_ingot")
end
function unittests.async_test()
local ok, err = pcall(do_tests)
if not ok then
core.log("error", err)
end
return ok
end end

View File

@ -24,7 +24,7 @@ local function test_dynamic_media(cb, player)
to_player = player:get_player_name(), to_player = player:get_player_name(),
}, function(name) }, function(name)
if not call_ok then if not call_ok then
cb("impossible condition") return cb("impossible condition")
end end
cb() cb()
end) end)