From 871a63dddaa063fccfbe0b2117b681f348da28a6 Mon Sep 17 00:00:00 2001 From: kunitoki Date: Fri, 24 Apr 2026 22:48:36 +0200 Subject: [PATCH] Fix luaref --- Source/LuaBridge/detail/Invoke.h | 12 +++++------- Tests/Source/LuaRefTests.cpp | 11 +++++++++++ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/Source/LuaBridge/detail/Invoke.h b/Source/LuaBridge/detail/Invoke.h index fa52ee79..8638f343 100644 --- a/Source/LuaBridge/detail/Invoke.h +++ b/Source/LuaBridge/detail/Invoke.h @@ -34,22 +34,20 @@ bool is_handler_valid(const F& f) noexcept template TypeResult decode_tuple_result(lua_State* L, int first_result_index, std::index_sequence) { - Tuple value; + auto results = std::make_tuple( + Stack>::get(L, first_result_index + static_cast(Indices))...); + std::error_code ec; const bool ok = (([&]() { - using ElementType = std::tuple_element_t; - - auto element = Stack::get(L, first_result_index + static_cast(Indices)); + const auto& element = std::get(results); if (! element) { ec = element.error(); return false; } - - std::get(value) = std::move(*element); return true; }()) && ...); @@ -57,7 +55,7 @@ TypeResult decode_tuple_result(lua_State* L, int first_result_index, std: if (! ok) return ec; - return value; + return Tuple{ std::move(*std::get(results))... }; } template diff --git a/Tests/Source/LuaRefTests.cpp b/Tests/Source/LuaRefTests.cpp index 96a532df..e230ebc8 100644 --- a/Tests/Source/LuaRefTests.cpp +++ b/Tests/Source/LuaRefTests.cpp @@ -1187,6 +1187,17 @@ TEST_F(LuaRefTests, CallReturningTupleSuccess) EXPECT_EQ("hello", std::get<1>(*r)); } +TEST_F(LuaRefTests, CallReturningTupleWithLuaRef) +{ + runLua("result = function() return 1, {2, 'three'} end"); + auto r = result().call>(); + ASSERT_TRUE(r); + EXPECT_EQ(1, std::get<0>(*r)); + ASSERT_TRUE(std::get<1>(*r).isTable()); + EXPECT_EQ(2, *std::get<1>(*r)[1].cast()); + EXPECT_EQ("three", *std::get<1>(*r)[2].cast()); +} + TEST_F(LuaRefTests, CallReturningTupleWrongType) { // Exercises the error path of decodeTupleResult (Invoke.h:58-59):