mirror of
https://github.com/logos-co/logos-plugin-qt.git
synced 2026-08-27 08:51:07 +00:00
Everything under this has merged — the protocol resolves the caller and opens a scope (#70), both backends define logos_module_set_call_caller (cpp-sdk #147, rust-sdk #47) — and nothing connected the two, so currentCaller() returned Unknown everywhere. This is the wire. Per dispatch, all on the dispatch thread: pull the caller document back out of the HOST image, push it into the module image, dispatch, pop. WHY THE PULL IS AN invokeMethod AND NOT A CALL The host binary and the module plugin EACH define LogosAPI — meta-object included — with their own statics at distinct addresses and no undefined reference to the other's. Mach-O is TWOLEVEL, PE has no interposition. A direct logosAPI()->currentCallerJson() binds to the PLUGIN copy and reads the PLUGIN thread-local: empty, forever, silently, on macOS and Windows. invokeMethod resolves through metaObject()/qt_metacall, which are virtual and whose vptr the HOST constructor wrote, so it lands in host code on the calling thread. Same channel initLogos and aboutToUnload already use. IN MULTI THE PULL IS BEFORE THE CAPTURE callMethod is entered on the dispatch thread and captures by value into QThread::create, so the pull happens there and the JSON rides along; the push/pop triple moves verbatim into the worker. Pulling inside the worker also compiles, and every multi call would read Unknown because that thread never had a scope. A test asserts the source ORDER, and it was driven red by making exactly that mistake. The invokable's name was not chosen here: logos-protocol master already names currentCallerJson in three places, including a CMakeLists comment saying the header ships so this file can answer it. Two checks beyond the wire, because the by-name test alone left gaps: * test-glue-compiles — NOTHING in this repo compiled the emitted glue. test-qt-host-generator.cpp documents a bug that escaped through exactly that hole. Both branches now build as a real Qt plugin with the C ABI stubbed and -Wl,--no-undefined, so a missing symbol fails at link rather than at a user's dlopen. * test-caller-invokable — six runtime assertions, including that a scope open on one thread is INVISIBLE on another, which is the actual justification for the multi placement. The contract test strips comments before its negative assertions (both files legitimately NAME the forbidden calls in prose) and guards that with a positive control, so the negatives cannot pass vacuously. Guard is MAJOR-aware expanded arithmetic. Dropping only the MAJOR > 0 arm still passes a grep, so the test resolves at 1.0 and asserts the call survives; that mutation was driven red too. 11 checks green on x86_64-linux, the three new ones green on aarch64-darwin, and the Windows mingw cross builds. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>