From fb63748b35cab30199db2a2bf138b3b92c8b5383 Mon Sep 17 00:00:00 2001 From: Robert Patterson Date: Mon, 18 Mar 2024 10:03:08 -0500 Subject: [PATCH 1/3] added test to show call-with-handler-failure. --- Tests/Source/LuaRefTests.cpp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/Tests/Source/LuaRefTests.cpp b/Tests/Source/LuaRefTests.cpp index df4cd448..0f0322e6 100644 --- a/Tests/Source/LuaRefTests.cpp +++ b/Tests/Source/LuaRefTests.cpp @@ -621,6 +621,33 @@ TEST_F(LuaRefTests, CallableWithNullCFunction) #endif } +TEST_F(LuaRefTests, CallableWithIntToBoolValuedFunction) +{ + runLua("function f(x) return x <= 1 end"); + auto f = luabridge::getGlobal(L, "f"); + EXPECT_TRUE(f.isCallable()); + + bool calledHandler = false; + std::string errorMessage; + auto handler = [&](lua_State*) -> int + { + calledHandler = true; + + if (auto msg = lua_tostring(L, 1)) + errorMessage = msg; + + return 0; + }; + + auto result = f.callWithHandler(handler, 2); + EXPECT_TRUE(result); + EXPECT_FALSE(calledHandler); + EXPECT_EQ(result.size(), 1); + EXPECT_TRUE(result[0].isValid()); + EXPECT_TRUE(result[0].isBool()); + EXPECT_TRUE(result[0]); +} + TEST_F(LuaRefTests, Pop) { lua_pushstring(L, "hello"); From ba06fba1948c8d15ba6659c6f14769d366e2d90a Mon Sep 17 00:00:00 2001 From: Robert Patterson Date: Mon, 18 Mar 2024 10:08:51 -0500 Subject: [PATCH 2/3] expected return from function is false --- Tests/Source/LuaRefTests.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Source/LuaRefTests.cpp b/Tests/Source/LuaRefTests.cpp index 0f0322e6..da410e77 100644 --- a/Tests/Source/LuaRefTests.cpp +++ b/Tests/Source/LuaRefTests.cpp @@ -645,7 +645,7 @@ TEST_F(LuaRefTests, CallableWithIntToBoolValuedFunction) EXPECT_EQ(result.size(), 1); EXPECT_TRUE(result[0].isValid()); EXPECT_TRUE(result[0].isBool()); - EXPECT_TRUE(result[0]); + EXPECT_FALSE(result[0]); } TEST_F(LuaRefTests, Pop) From 6ce4599ce98ea20e9a7fc5fcaf755494f5d5476c Mon Sep 17 00:00:00 2001 From: Robert Patterson Date: Tue, 19 Mar 2024 07:30:26 -0500 Subject: [PATCH 3/3] added proposed fix --- Source/LuaBridge/detail/Invoke.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Source/LuaBridge/detail/Invoke.h b/Source/LuaBridge/detail/Invoke.h index 6a4415e5..3a2cfef1 100644 --- a/Source/LuaBridge/detail/Invoke.h +++ b/Source/LuaBridge/detail/Invoke.h @@ -216,7 +216,8 @@ LuaResult callWithHandler(const LuaRef& object, F&& errorHandler, Args&&... args } } - const int code = lua_pcall(L, sizeof...(Args), LUA_MULTRET, isValidHandler ? (-static_cast(sizeof...(Args)) - 2) : 0); + const int errorFunctionIndex = isValidHandler ? (-static_cast(sizeof...(Args)) - 2) : 0; + const int code = lua_pcall(L, sizeof...(Args), LUA_MULTRET, errorFunctionIndex); if (code != LUABRIDGE_LUA_OK) { auto ec = makeErrorCode(ErrorCode::LuaFunctionCallFailed); @@ -231,6 +232,9 @@ LuaResult callWithHandler(const LuaRef& object, F&& errorHandler, Args&&... args return LuaResult::errorFromStack(L, ec); } + + if constexpr (isValidHandler) + if (errorFunctionIndex) lua_remove(L, errorFunctionIndex); return LuaResult::valuesFromStack(L, stackTop); }