Age | Commit message (Collapse) | Author |
|
Avoid ambiguity with LLFloater::destroy().
|
|
|
|
|
|
Lua scripts floater
|
|
|
|
|
|
- Put lubLuau.Ast.a at the right most side as GCC/LD is peculiar about link order.
|
|
the filename)
|
|
|
|
Our std::strings are UTF-8 encoded, so conversion from std::string to
std::filesystem::path must use UTF-8 decoding. The native Windows
std::filesystem::path constructor and assignment operator accepting
std::string use "native narrow encoding," which mangles path strings
containing UTF-8 encoded non-ASCII characters.
fsyspath's std::string constructor and assignment operator explicitly engage
std::filesystem::u8path() to handle encoding. u8path() is deprecated in C++20,
but once we adapt fsyspath's conversion to C++20 conventions, consuming code
need not be modified.
|
|
Among other things, this empowers ll_convert() and ll_convert_to() to accept a
string literal (which might contain non-ASCII characters, e.g. __FILE__).
Without this, even though we have ll_convert_impl specializations accepting
const char*, passing a string literal fails because the compiler can't find a
specialization specifically accepting const char[length].
|
|
|
|
On Windows, std::filesystem::path::value_type is wchar_t, not char -- so
path::string_type is std::wstring, not std::string. So while Posix path
instances implicitly convert to string, Windows path instances do not. Add
explicit u8string() calls.
Also add LL.abspath() Lua entry point to further facilitate finding a resource
file relative to the calling Lua script. Use abspath() for both
test_luafloater_demo.lua and test_luafloater_gesture_list.lua.
|
|
This lets a calling script verify that it's running at the right point in the
viewer's life cycle. A script that wants to interact with the SL agent
wouldn't work if run from the viewer's command line -- unless it calls
startup.wait("STATE_STARTED"), which pauses until login is complete.
Modify test_luafloater_demo.lua and test_luafloater_gesture_list.lua to find
their respective floater XUI files in the same directory as themselves.
Make them both capture the reqid returned by the "showLuaFloater" operation,
and filter for events bearing the same reqid. This paves the way for a given
script to display more than one floater concurrently.
Make test_luafloater_demo.lua (which does not require in-world resources) wait
until 'STATE_LOGIN_WAIT', the point at which the viewer has presented the
login screen.
Make test_luafloater_gesture_list.lua (which interacts with the agent) wait
until 'STATE_STARTED', the point at which the viewer is fully in world.
Either or both can now be launched from the viewer's command line.
|
|
Make LLRequireResolver capture std::filesystem::path instances, instead of
std::strings, for the path to resolve and the source directory. Store the
running script's containing directory instead of calling parent_path() over
and over.
Demote Lua LL.post_on() logging to DEBUG level instead of INFO.
|
|
When enumerating C++ coroutines, it can be useful to know that a particular
Lua coroutine is simply waiting for further events.
|
|
This helps a Lua script log its own identity, or find associated files
relative to its location in the filesystem.
Add more comprehensive logging around the start and end of a given Lua script,
or its "p.s." fiber.run() call.
|
|
If specified as true, "tweak" means to tweak the specified "listener" name for
uniqueness. This avoids LLEventPump::listen()'s DupListenerName exception,
which causes the "listen" operation to return "status" as false.
|
|
Earlier we had blithely designated the 'pending' list (which stores
WaitForReqid objects for pending request() and generate() calls) as a weak
table. But the caller of request() or generate() does not hold a reference to
the WaitForReqid object. Make pending hold "strong" references.
Private collections (pending, waitfors) and private scalars that are never
reassigned (reply, command) need not be entries in the leap table.
|
|
|
|
|
|
|
|
Run each script file with new LuaState
|
|
|
|
|
|
|
|
|
|
|
|
Make LuaListener listen for "LLApp" viewer shutdown events. On receiving such,
it closes its queue. Then the C++ coroutine calling getNext() wakes up with an
LLThreadSafeQueue exception, and calls LLCoros::checkStop() to throw one of
the exceptions recognized by LLCoros::toplevel().
Add an llluamanager_test.cpp test to verify this behavior.
|
|
|
|
|
|
|
|
|
|
|
|
Don't use "debug" as the name of a function to conditionally write debug
messages: "debug" is a Luau built-in library, and assigning that name locally
would shadow the builtin. Use "dbg" instead.
Recast fiber.print_all() as fiber.format_all() that returns a string; then
print_all() is simply print(format_all()). This refactoring allows us to use
dbg(format_all()) as well.
Add a couple new dbg() messages at fiber state changes.
|
|
|
|
The problem with running a `require()` module on a Lua coroutine is that it
prohibits calling `leap.request()` at module load time. When a coroutine calls
`leap.request()`, it must yield back to Lua's main thread -- but a `require()`
module is forbidden from yielding.
Running on Lua's main thread means that (after potentially giving time slices
to other ready coroutines) `fiber.lua` will request the response event from
the viewer, and continue processing the loaded module without having to yield.
|
|
|
|
# Conflicts:
# .github/workflows/build.yaml
|
|
following promotion of secondlife/viewer #650
|
|
|
|
from below
|
|
|
|
Also streamline util.contains(), given table.find().
|
|
fiber.lua's scheduler() is greedy, in the sense that it wants to run every
ready Lua fiber before retrieving the next incoming event from the viewer (and
possibly blocking for some real time before it becomes available). But check
for viewer shutdown before resuming any suspended-but-ready Lua fiber.
|
|
|
|
|
|
|
|
|
|
|