• src/syncterm/scripts/syncterm.wren src/syncterm/wren_bind.c wren_host.

    From Deuc¨@VERT to Git commit to main/sbbs/master on Mon Apr 27 16:09:28 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/378af3b080bb6209bc6a3649
    Modified Files:
    src/syncterm/scripts/syncterm.wren src/syncterm/wren_bind.c wren_host.c wren_host_internal.h
    Log Message:
    SyncTERM: lazy-cache foreign class handles, move Cache into Wren

    Cleanup after rev to per-module entry scripts:

    * The four foreign-class handles (Cell, Cells, KeyEvent, MouseEvent)
    were captured eagerly in wren_host_init, which forced an
    `import "syncterm"` bootstrap to run first so the wrenGetVariable
    lookups had a loaded module to read from. None of that was
    necessary Ä the handles are pure caches around symbol-table
    lookups, and by the time any allocation site runs, the calling
    script has already imported syncterm. New load_class_into_slot
    helper does the fetch-and-cache lazily; six allocation sites
    (push/resume key & mouse, fn_Screen_readRect, cells_make_view)
    call it at the slot they were already filling. The `if (... ||
    st->X_class == NULL)` bailouts on those sites were guarding a
    case the lazy fill makes impossible.

    * `Cache` (the singleton Directory pointing at the script-cache
    directory) was injected into the syncterm module from C via
    wren_bind_define_cache, reaching into vm->modules and calling
    wrenDefineVariable. Replaced with a Wren-side `var Cache = ...`
    in syncterm.wren backed by a new foreign static
    Host.cacheDirectory. Cache is now an ordinary module variable
    instead of a C-injected ghost. A user override of syncterm.wren
    has to include the same boilerplate (one line) to keep Cache
    available Ä that's the trade-off, and matches the rest of the
    module's "the override is responsible for the contract" model.

    * The entry-script iteration's special-case skip for "syncterm"
    is gone; both loops now use wrenHasModule to skip any module
    another entry script's import already loaded. Same effect for
    syncterm, plus handles any future library-also-embedded module
    generically.

    wren_host_init shrinks to: make VM  wire callbacks  cache
    call/call(_) handles  set ownership  glob  run embeds  run
    user scripts. No bootstrap, no eager class capture, no Cache
    injection, no name-specific skip.

    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net