Repository navigation
QLISP v2.7.6 — lifetime loop store = граница формы
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 нет.