소스 검색

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

sfan5 1 년 전
부모
커밋
fc3460470a

+ 15 - 1
builtin/async/game.lua

@@ -25,11 +25,13 @@ do
 	local all = assert(core.transferred_globals)
 	core.transferred_globals = nil
 
-	-- reassemble other tables
 	all.registered_nodes = {}
 	all.registered_craftitems = {}
 	all.registered_tools = {}
 	for k, v in pairs(all.registered_items) do
+		-- Disable further modification
+		setmetatable(v, {__newindex = {}})
+		-- Reassemble the other tables
 		if v.type == "node" then
 			all.registered_nodes[k] = v
 		elseif v.type == "craftitem" then
@@ -43,3 +45,15 @@ do
 		core[k] = v
 	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)

+ 1 - 1
builtin/game/register.lua

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

+ 5 - 5
games/devtest/mods/unittests/async_env.lua

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

+ 1 - 0
games/devtest/mods/unittests/init.lua

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

+ 12 - 2
games/devtest/mods/unittests/inside_async_env.lua

@@ -2,7 +2,7 @@ unittests = {}
 
 core.log("info", "Hello World")
 
-function unittests.async_test()
+local function do_tests()
 	assert(core == minetest)
 	-- stuff that should not be here
 	assert(not core.get_player_by_name)
@@ -11,5 +11,15 @@ function unittests.async_test()
 	-- stuff that should be here
 	assert(ItemStack)
 	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

+ 1 - 1
games/devtest/mods/unittests/misc.lua

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