diff options
author | Nat Goodspeed <nat@lindenlab.com> | 2024-06-14 20:43:09 -0400 |
---|---|---|
committer | Nat Goodspeed <nat@lindenlab.com> | 2024-06-14 20:43:09 -0400 |
commit | ab9cb6fcd96c1c29650d844b5fd76e2ebbf5f2df (patch) | |
tree | d03d7e8f69be2f938608440177fced681b935635 /indra/newview/llviewermenu.cpp | |
parent | f7137765438f149cbae6f3b18da45dce75a25336 (diff) |
Introduce LL.atexit(), internal lua_emplace<T>(), lua_toclass<T>().
Publish new LL.atexit() function that accepts a Lua function (or C++ closure)
and saves it (in Registry["atexit"] table) to call later.
Make ~LuaState() walk the Registry["atexit"] table, if it exists, calling each
function appended to that table.
(Consider using that mechanism to clean up a LuaListener, if one was
instantiated. Possibly also use for p.s. leap.run()? But that's run after
every expr() call, instead of only at ~LuaState() time. Pragmatically, though,
the distinction only matters for a LUA Debug Console LUA string with "clean
lua_State" unchecked.)
For use by future lua_function() entry points, lua_emplace<T>(ctor args...)
pushes a Lua userdata object containing a newly-constructed T instance --
actually a std::optional<T> to avoid double destruction. lua_emplace<T>() is
specifically intended to be usable even for T with a nontrivial destructor: it
gives the userdata a metatable with a __gc function that destroys the
contained T instance when the userdata is garbage collected. But since garbage
collection doesn't guarantee to clean up global variables with __gc methods,
lua_emplace<T>() also uses LL.atexit() to ensure that ~T() will run when the
LuaState is destroyed.
The companion to lua_emplace<T>() is lua_toclass<T>(), which returns a
non-nullptr T* if the referenced index is in fact a userdata created by
lua_emplace<T>() for the same T, that has not yet been destroyed. This lets
C++ code access a T previously embedded in Lua userdata.
Diffstat (limited to 'indra/newview/llviewermenu.cpp')
0 files changed, 0 insertions, 0 deletions