diff --git a/src/TLuaEngine.cpp b/src/TLuaEngine.cpp index ecb75ae..924db0f 100644 --- a/src/TLuaEngine.cpp +++ b/src/TLuaEngine.cpp @@ -30,7 +30,9 @@ #include #include #include +#include #include +#include #include #include @@ -787,12 +789,6 @@ sol::table TLuaEngine::StateThreadData::Lua_JsonDecode(const std::string& str) { return table; } -static std::string traceback(lua_State *L) { - auto globals = sol::state_view(L).globals(); - auto test = globals.get("debug").get("traceback"); - return test(); -} - TLuaEngine::StateThreadData::StateThreadData(const std::string& Name, TLuaStateId StateId, TLuaEngine& Engine) : mName(Name) , mStateId(StateId) @@ -1123,13 +1119,8 @@ void TLuaEngine::StateThreadData::operator()() { // TODO: Use TheQueuedFunction.EventName for errors, warnings, etc Result->StateId = mStateId; sol::state_view StateView(mState); - StateView.script(R"( - function beammp_internal_error_handler(message) - return "Error: " .. message .. ", Stacktrace: " .. debug.traceback() - end - )"); - sol::protected_function Fn(StateView[FnName], StateView["beammp_internal_error_handler"]); - if (Fn.valid() && Fn.get_type() == sol::type::function) { + auto RawFn = StateView[FnName]; + if (RawFn.valid() && RawFn.get_type() == sol::type::function) { std::vector LuaArgs; for (const auto& Arg : Args) { if (Arg.valueless_by_exception()) { @@ -1164,8 +1155,19 @@ void TLuaEngine::StateThreadData::operator()() { break; } } - // StateView.set_panic( sol::c_call ); - // Fn.set_error_handler([](const std::string& error, sol::this_state state) -> std::string { return traceback(state.lua_state()); }); + StateView["INTERNAL_ERROR_HANDLER"] = [](lua_State* L) { + auto Error = sol::stack::get>(L); + std::string ErrorString = ""; + if (Error.has_value()) { + ErrorString = Error.value(); + } + auto DebugTracebackFn = sol::state_view(L).globals() + .get("debug") + .get("traceback"); + std::string Traceback = DebugTracebackFn(ErrorString, 2); // refusing to elaborate. questions? rtfm. + return sol::stack::push(L, Traceback); + }; + sol::protected_function Fn(RawFn, StateView["INTERNAL_ERROR_HANDLER"]); auto Res = Fn(sol::as_args(LuaArgs)); if (Res.valid()) { Result->Error = false; @@ -1175,7 +1177,6 @@ void TLuaEngine::StateThreadData::operator()() { Result->Error = true; sol::error Err = Res; Result->ErrorMessage = Err.what(); - // beammp_lua_error(traceback(StateView.lua_state())); } Result->MarkAsReady(); } else {