Skip to content

QLISP v2.7.6 — lifetime loop store = граница формы

Choose a tag to compare

@FQingLars FQingLars released this 02 Oct 06:03
· 4 commits to main since this release

QLISP 2.7.6 — Release Notes

Тег: v2.7.6 · Платформы: Linux x86_64, Windows x86_64
Бинарники — сборка CI, коммит 405632a ветки main компиляторного репозитория (CI run 36746210696, зелёный). Состав: qlisp, qlisp-lsp, qvalent.

Файл Платформа Состав
qlisp-linux-x86_64 Linux x86_64 REPL/интерпретатор + JIT
qlisp-lsp-linux-x86_64 Linux x86_64 Language Server
qvalent-linux-x86_64 Linux x86_64 пакетный менеджер
qlisp-windows-x86_64.zip Windows x86_64 qlisp.exe, qlisp-lsp.exe, qvalent.exe

SHA256SUMS — контрольные суммы всех файлов.

Что нового — lifetime loop store = граница формы (FIXED)

Тестер (churn tensor classifier, рекурсивный лес): RSS-пик рос как O((деревья × глубина)²) — 4 дерева d=6 → +2.9 ГБ. Виновник — промоут выживших while-биндингов в бессмертный root при каждом выходе, даже когда биндинг никому не нужен.

  • Контракт владения вместо новой сущности: loop store и res-скоупы while — heap Scope с track_dtor в scratch-арене (эпоха = момент регистрации); умирают на первом restore, пересекающем эпоху (итерация объемлющего цикла или граница формы). Промоут в root при выходе удалён — побег обслуживают существующие мосты.
  • finish_loop_bindings удалён: записи живут в LoopStoreDrop своего store, teardown освобождает выжившие цепочки сразу перед смертью store.
  • Rehome по стеку store'ов (внутренний → внешний); append/suffix продлевают цепочку в домашнем store — цепочка никогда не тянется через два store (класс SIGSEGV из v2.7.4 закрыт структурно).
  • Zero-copy adoption: биндинг, чья пара переживает убийствующий restore, адоптируется в самый внешний store, умирающий вместе с парой — переезд wholesale, ноль копий. Scope::adopt сливает dying store в enclosing.
  • Новый сьют tests/loop_lifetime.qlsp (12 deftests: семантика чтения после while, вложенный общий аккумулятор, re-entrant, suffix, throw-recovery, тензор-ребайнд).

Production-check (RSS): выбрасывающий build ×20: 745 МБ → 4 КБ (плоско). Лес 10 деревьев: 34.5 МБ ≈ линейно (было умножение копий по уровням). 10 discard make-big(20000): 13248 КБ → 484 КБ. ASan: UAF/overflow нет.