aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenoit Germain <benoit.germain@ubisoft.com>2025-10-30 10:02:27 +0100
committerBenoit Germain <benoit.germain@ubisoft.com>2025-10-30 10:02:27 +0100
commitdfb4a035c2d80a6be689e14ca495b8ba032f58c4 (patch)
tree2686a6f2e8ecefc912e44089e22167d2a7428c28
parent9c768185696879c6642c1f26c86884eaf727fe27 (diff)
downloadlanes-dfb4a035c2d80a6be689e14ca495b8ba032f58c4.tar.gz
lanes-dfb4a035c2d80a6be689e14ca495b8ba032f58c4.tar.bz2
lanes-dfb4a035c2d80a6be689e14ca495b8ba032f58c4.zip
Test full userdata keys with verbose_errors
-rw-r--r--src/intercopycontext.cpp6
-rw-r--r--unit_tests/scripts/misc/verbose_errors.lua9
2 files changed, 12 insertions, 3 deletions
diff --git a/src/intercopycontext.cpp b/src/intercopycontext.cpp
index 0ccd619..4be1883 100644
--- a/src/intercopycontext.cpp
+++ b/src/intercopycontext.cpp
@@ -494,8 +494,12 @@ void InterCopyContext::interCopyKeyValuePair() const
494 *std::format_to(_valPath, "{}[U:{}]", name, _key) = 0; 494 *std::format_to(_valPath, "{}[U:{}]", name, _key) = 0;
495 } else if (luaW_type(L1, _key_i) == LuaType::BOOLEAN) { 495 } else if (luaW_type(L1, _key_i) == LuaType::BOOLEAN) {
496 int const _key{ lua_toboolean(L1, _key_i) }; 496 int const _key{ lua_toboolean(L1, _key_i) };
497 _valPath = static_cast<char*>(alloca(name.size() + 8)); // +8 for [], 'false' and terminating 0 497 _valPath = static_cast<char*>(alloca(name.size() + 8)); // +8 for [false] and terminating 0
498 *std::format_to(_valPath, "{}[{}]", name, _key ? "true" : "false") = 0; 498 *std::format_to(_valPath, "{}[{}]", name, _key ? "true" : "false") = 0;
499 } else if (luaW_type(L1, _key_i) == LuaType::USERDATA) {
500 // I don't want to invoke tostring on the userdata to get its name
501 _valPath = static_cast<char*>(alloca(name.size() + 11)); // +11 for [U:<FULL>] and terminating 0
502 *std::format_to(_valPath, "{}[U:<FULL>]", name) = 0;
499 } 503 }
500 } 504 }
501 505
diff --git a/unit_tests/scripts/misc/verbose_errors.lua b/unit_tests/scripts/misc/verbose_errors.lua
index b38bf4c..8127980 100644
--- a/unit_tests/scripts/misc/verbose_errors.lua
+++ b/unit_tests/scripts/misc/verbose_errors.lua
@@ -21,9 +21,13 @@ local do_test = function(key_)
21 local x, y = string.find(e, "arg#2.subtable[" .. key_ .. "].ud", 1, true) 21 local x, y = string.find(e, "arg#2.subtable[" .. key_ .. "].ud", 1, true)
22 assert(x and y, "got " .. e) 22 assert(x and y, "got " .. e)
23 elseif t_key == "userdata" then 23 elseif t_key == "userdata" then
24 local t_name 24 -- light userdata results in "userdata: <some uppercase hex value>"
25 local stringified_key = tostring(key_)
26 local hex = string.match(stringified_key, "userdata: (%x+)")
27 -- full userdata results in something else
28 local t_name = hex and ("0x" .. string.lower(hex)) or "<FULL>"
25 -- light userdata is formatted by std::format, where the pointer is written as a lowercase hex literal 29 -- light userdata is formatted by std::format, where the pointer is written as a lowercase hex literal
26 local expected = "arg#2.subtable[U:0x" .. string.lower(string.match(tostring(key_), "userdata: (%x+)")) .. "].ud" 30 local expected = "arg#2.subtable[U:" .. t_name .. "].ud"
27 -- expecting an error about arg#2.subtable[U:0x<some hex value>].ud 31 -- expecting an error about arg#2.subtable[U:0x<some hex value>].ud
28 local x, y = string.find(e, expected, 1, true) 32 local x, y = string.find(e, expected, 1, true)
29 assert(x and y, "expecting " .. expected .. " got " .. e) 33 assert(x and y, "expecting " .. expected .. " got " .. e)
@@ -36,3 +40,4 @@ do_test(false)
36do_test(42) 40do_test(42)
37do_test(42.44) 41do_test(42.44)
38do_test(lanes.null) 42do_test(lanes.null)
43do_test(l)