summaryrefslogtreecommitdiff
path: root/indra/llcommon/lua_function.cpp
diff options
context:
space:
mode:
authorNat Goodspeed <nat@lindenlab.com>2024-07-10 15:14:13 -0400
committerNat Goodspeed <nat@lindenlab.com>2024-07-10 15:14:13 -0400
commit8c94ff566a4f9076607d1b988f3eb7ad7e200bd9 (patch)
treeb6db9185f0eeb864da72502d57ec02833820009b /indra/llcommon/lua_function.cpp
parent89e7ca66cbadd9b5a3b31e6d12e310b1c7a3c5c1 (diff)
Remove ability to reuse a LuaState between LLLUAmanager functions.
Remove LLLUAmanager::mumbleScriptLine() LuaState& parameters. Make startScriptLine(), waitScriptLine() and runScriptLine() exactly parallel to startScriptFile(), waitScriptFile() and runScriptFile(). That means that runScriptLine()'s C++ coroutine instantiates and destroys its own LuaState, which means that LL.atexit() functions will run on the Lua-specific C++ coroutine rather than (say) the viewer's main coroutine. Introduce LLLUAmanager::script_result typedef for std::pair<int, LLSD> and use in method returns. Remove LuaState::initLuaState(); move its logic back into the constructor. Remove initLuaState() calls in the expr() error cases: they're moot now that we won't get subsequent expr() calls on the same LuaState instance. Remove LLFloaterLUADebug "Use clean lua_State" checkbox and the cleanLuaState() method. Remove mState member. Remove explicit LuaState declarations from LLLUAmanager tests. Adapt one test for implicit LuaState: it was directly calling LuaState::obtainListener() to discover the LuaListener's reply-pump name. But since that test also captures two leap.request() calls from the Lua script, it can just look at the "reply" key in either of those requests.
Diffstat (limited to 'indra/llcommon/lua_function.cpp')
-rw-r--r--indra/llcommon/lua_function.cpp18
1 files changed, 4 insertions, 14 deletions
diff --git a/indra/llcommon/lua_function.cpp b/indra/llcommon/lua_function.cpp
index 2d08de68c5..4acb09d564 100644
--- a/indra/llcommon/lua_function.cpp
+++ b/indra/llcommon/lua_function.cpp
@@ -478,19 +478,11 @@ void lua_pushllsd(lua_State* L, const LLSD& data)
*****************************************************************************/
LuaState::LuaState(script_finished_fn cb):
mCallback(cb),
- mState(nullptr)
+ mState(luaL_newstate())
{
- initLuaState();
-}
-
-void LuaState::initLuaState()
-{
- if (mState)
- {
- lua_close(mState);
- }
- mState = luaL_newstate();
luaL_openlibs(mState);
+ // publish to this new lua_State all the LL entry points we defined using
+ // the lua_function() macro
LuaFunction::init(mState);
// Try to make print() write to our log.
lua_register(mState, "print", LuaFunction::get("print_info"));
@@ -607,8 +599,7 @@ std::pair<int, LLSD> LuaState::expr(const std::string& desc, const std::string&
// we instead of the Lua runtime catch it, our lua_State retains
// its internal error status. Any subsequent lua_pcall() calls
// with this lua_State will report error regardless of whether the
- // chunk runs successfully. Get a new lua_State().
- initLuaState();
+ // chunk runs successfully.
return { -1, stringize(LLError::Log::classname(error), ": ", error.what()) };
}
}
@@ -628,7 +619,6 @@ std::pair<int, LLSD> LuaState::expr(const std::string& desc, const std::string&
LL_WARNS("Lua") << desc << " error converting result " << index << ": "
<< error.what() << LL_ENDL;
// see above comments regarding lua_State's error status
- initLuaState();
return { -1, stringize(LLError::Log::classname(error), ": ", error.what()) };
}
}