Skip to content

Commit 82c4cd9

Browse files
Устранить находки аудита TYPE и сохранять ошибки исполнения в IDE
TYPE: - устойчивый итеративный обход графа типов с кешем: циклическое сравнение даёт MB2022/MB2003 вместо переполнения стека, повторяющиеся подграфы не обходятся повторно; общий помощник использует и валидатор байткода; - записи создаются инструкцией CreateRecord в момент исполнения: превышение предела фиксированного поля даёт MB3013 внутри TRY, невызванная процедура ничего не выделяет; - метод TYPE получает адресуемого получателя (вид источника CallByRef 6): SELF у поля и элемента массива меняет фактическое хранилище, изменения видны сразу и сохраняются при ERROR; - поле принимает константный числовой литерал с допустимым преобразованием (DOUBLE/LONG/DECIMAL = 1), вычисляемые выражения по-прежнему отклоняются; - независимые снимки графа записей для обратного шага через RuntimeSnapshotFactory; восстановленный кадр видит один экземпляр записи. IDE: фоновая проверка неизменённого документа больше не стирает ошибку исполнения того же снимка. Проверки: Semantics 530/530, Runtime 1183/1183, Bytecode 248/248, Execution 3257/3259 (два известных отказа Maze Chase), CLI 30/30, DesktopHost отдельным процессом. Примеры TYPE и их JSON-восстановление дают совпадающий вывод; проверка справочника пройдена. Версии: язык 0.1.18, компилятор/CLI 0.1.18, IDE 0.6.20.
1 parent 1f4a291 commit 82c4cd9

47 files changed

Lines changed: 2021 additions & 158 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎Versions.props‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
<Project>
22
<!-- Создан scripts/versioning.mjs из versions.json. -->
33
<PropertyGroup>
4-
<AxiomLanguageVersion>0.1.17</AxiomLanguageVersion>
5-
<AxiomCompilerVersion>0.1.17</AxiomCompilerVersion>
6-
<AxiomIdeVersion>0.6.19</AxiomIdeVersion>
7-
<Version Condition="'$(MSBuildProjectName)' != 'Axiom.DesktopHost'">0.1.17</Version>
8-
<Version Condition="'$(MSBuildProjectName)' == 'Axiom.DesktopHost'">0.6.19</Version>
4+
<AxiomLanguageVersion>0.1.18</AxiomLanguageVersion>
5+
<AxiomCompilerVersion>0.1.18</AxiomCompilerVersion>
6+
<AxiomIdeVersion>0.6.20</AxiomIdeVersion>
7+
<Version Condition="'$(MSBuildProjectName)' != 'Axiom.DesktopHost'">0.1.18</Version>
8+
<Version Condition="'$(MSBuildProjectName)' == 'Axiom.DesktopHost'">0.6.20</Version>
99
</PropertyGroup>
1010
</Project>

‎docs/ARCHITECTURE.md‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,3 +253,11 @@ IDE 0.6.17 применяет план document.editTransition только к
253253
`IGraphicsHost.TryWriteAbsolutePixels` — необязательная пакетная запись прямоугольника индексных цветов; адаптеры исполнения и ввода передают её до `GraphicsHostService`. После проверки источника PUT делает одну загрузку видимой области на GPU; обычный кадр по-прежнему не копируется целиком в Electron. PSET/PRESET не читают прежнее изображение, AND/OR/XOR выполняют одно явное чтение.
254254

255255
DesktopHost хранит атомарно публикуемую регистрацию отмены с идентификатором сессии и её отдельным провайдером. Поток чтения команд может выставить отмену только провайдеру совпавшей сессии до обработки остановки в Dispatcher. Поэтому тяжёлая PAINT проверяет отмену даже при занятом UI-потоке; состояние окна и завершение остаются в Dispatcher. Загрузчик Tiled проверяет отмену между ресурсами, слоями и блоками клеток. Electron передаёт HWND владельца через среду запуска; выбор монитора SCREEN 10 выполняется заново при обращении.
256+
257+
## Значения TYPE в исполнении — 17 октября 2026 года
258+
259+
Запись пользовательского типа создаётся инструкцией `CreateRecord` в момент исполнения объявления, создания литерала или конструктора. Шаблоны кадров и глобальные слоты хранят для пользовательского типа пустое значение, поэтому заранее не выделяются фиксированные массивные поля, а отказ выделения обрабатывается в контексте исполняемой инструкции и может быть перехвачен `TRY`.
260+
261+
Метод TYPE получает получателя адресуемым. Инструкция `CallByRef` поддерживает вид источника `ByRefArgumentSourceKind.Address`: после базовой переменной идёт цепочка шагов «поле» или «элемент» с индексами, вычисленными один раз при вызове. Слот, построенный в `BytecodeVm.ByRef.cs`, читает и пишет фактическое хранилище, поэтому `SELF` не копирует запись и не выполняет обратную запись после возврата. Простая переменная, аргумент и захват по-прежнему используют виды источников 0..3.
262+
263+
Снимки состояния для обратного шага строит `RuntimeSnapshotFactory`: она обходит записи и массивы с картой посещённых объектов, сохраняет взаимные ссылки и не применяет правила присваивания. Массив получает заготовку через `RuntimeArrayValue.CreateEmptyForSnapshot` и заполняется отдельно, чтобы общий объект успел попасть в карту до обхода элементов. Восстановленный кадр ссылается на подготовленное значение через `BytecodeVariableSlot.Adopt`, поэтому стек вычислений и локальные переменные видят один и тот же экземпляр записи.

‎docs/BYTECODE_COVERAGE.md‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,3 +132,23 @@ IDE 0.6.1 согласует завершение запроса с Electron и
132132
Для BytecodeVm добавлены независимые ожидания по GET/PUT с предельными индексами, POINT/MB3008, размерам и координатам DRAWIMAGE/DRAWSPRITE/прямоугольников, ресурсным ограничениям CANVAS и справедливому опросу мыши. Ошибки проверяются внутри TRY/CATCH с продолжением исполнения. Отдельно проверяются число пакетных записей PUT, отсутствие чтения при PSET/PRESET и перехват отказа выделения временного буфера. Парсер, набор операторов и подсветка токенов не менялись.
133133

134134
Ожидания содержатся в `GraphicsAuditRepairTests` проектов Runtime, Execution и Ide. Запускаемый пример: `samples/graphics/regressions/audit_boundaries.axm`. Справочник обновлён на существующих тематических страницах графики, ввода и мыши; новые сущности в указатель не добавляются. Настоящие окна и пиксели проверяются в `graphics-audit-repairs.spec.js`; каталог Electron содержит 477 сценариев, это не число пройденных проверок всего приложения.
135+
136+
## Аудит TYPE — 17 октября 2026 года
137+
138+
Покрытие проверено отдельной аналитической задачей без изменения реализации. 214 выбранных существующих тестов .NET прошли; все 22 примера `samples/operators/type/` успешно выполнены, их вывод совпал после сериализации/восстановления байткода. Дополнительные воспроизведения находятся в `.artifacts/type-audit-20261017/`; они пока не являются постоянными тестами.
139+
140+
Открытые пробелы: UDT-001 — структурное сравнение циклического TYPE вызывает переполнение стека Binder; UDT-006 — повторный обход общего графа типов имеет экспоненциальную стоимость; UDT-002 — SELF поля/элемента копируется с обратной записью, что нарушает немедленную видимость и сохранение изменений при ERROR; UDT-003 — массивные поля локальных записей выделяются при создании шаблонов всех кадров до исполнения и вне TRY; UDT-004 — DOUBLE = 1 отвергается как начальное значение поля; UDT-005 — обратный шаг для TYPE не поддержан снимком состояния. Эти формы нельзя считать закрытыми одними штатными успешными тестами. План: PLANS4, подробный локальный отчёт: `docs/audit/TYPE_SUBSYSTEM_AUDIT_2026-10-17.md`. Оконная проверка Electron и восстановление DesktopHost не выполнялись.
141+
142+
## Исправление находок аудита TYPE — 17 октября 2026 года
143+
144+
Все шесть находок закрыты в реализации, регрессии постоянные.
145+
146+
- UDT-001 и UDT-006. Обход графа полей вынесен в общий `StructuralEqualitySupport` с итеративным проходом, состояниями обхода и кешем внутри связывания. Сравнение циклического TYPE даёт MB2022 и MB2003 вместо переполнения стека, повторно используемый граф проверяется пропорционально числу типов и полей. Тот же обход применяет валидатор байткода; попутно устранено расхождение, из-за которого запись с полями DATE, TIME или DATETIME проходила связывание, но отвергалась валидатором как BC4116.
147+
- UDT-003. Шаблоны кадров и глобальные слоты больше не создают значения пользовательских типов заранее: запись создаётся инструкцией `CreateRecord` в момент исполнения. Превышение предела фиксированного поля выдаёт MB3013, перехватываемую через TRY, а невызванная процедура ничего не выделяет.
148+
- UDT-002. Поле и элемент массива передаются методу адресуемым получателем: кодировка `CallByRef` дополнена видом источника 6, который описывает базовую переменную и цепочку полей и элементов с уже вычисленными индексами. `SELF` больше не работает через копию записи и обратную запись, поэтому изменения видны сразу, сторонние изменения не затираются, а изменения сохраняются при ERROR.
149+
- UDT-004. Начальное значение поля принимает числовой литерал с допустимым преобразованием к типу поля; значения DATE, TIME и DATETIME по-прежнему не поддерживаются.
150+
- UDT-005. Снимки состояния и обратный шаг используют отдельную фабрику `RuntimeSnapshotFactory`: она сохраняет взаимные ссылки графа и не применяет правила присваивания. Восстановление кадра ссылается на подготовленное значение без повторного копирования записи, поэтому шаг назад и возврат вперёд дают прежний вывод.
151+
152+
Проверки: Semantics 530/530 (включая `BinderTypeAuditTests`), Runtime 1183/1183 (включая дополнения `LanguageContractTests.TypeAudit.cs`), Bytecode 248/248, Execution 3257/3259 с двумя известными отказами Maze Chase. Примеры: `samples/operators/type/method_receiver_field_changes.axm`, `samples/operators/type/method_receiver_array_changes.axm`, `samples/operators/type/default_numeric_conversion.axm`, `samples/operators/type/large_fixed_field_allocation.axm`, `samples/acceptance/negative/type_cyclic_structural_comparison.axm`. Справочник: `type.html` (значения по умолчанию, методы и SELF, диагностика MB3013) и `calls.html` (неявный получатель метода).
153+
154+
Путь фоновой диагностики DesktopHost проверен отдельным процессом через NDJSON: `document.analyse` для программы с циклическим TYPE вернул MB2022 и MB2003, служба продолжила работу, а следующий запрос для корректной программы прошёл без диагностик. Оконная проверка Electron не выполнялась и остаётся границей доказательств.

‎docs/BYTECODE_PERF_MATRIX.md‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
dotnet run --project src/Axiom.ManualChecks -- benchmark-bytecode --iterations 3 --warmup 1
77
```
88

9-
Команды .NET выполнять последовательно. `profile-bytecode-opcodes` и `audit-bytecode-coverage` остаются отдельными средствами. Каталог существующих нагрузок `samples/smoke/engine-compare/` сохранён как точный путь; 51 файл перечислен ниже.
9+
Команды .NET выполнять последовательно. `profile-bytecode-opcodes` и `audit-bytecode-coverage` остаются отдельными средствами. Каталог существующих нагрузок `samples/smoke/engine-compare/` сохранён как точный путь; 52 файла перечислены ниже.
1010

1111
## Открытые измерения
1212

@@ -74,6 +74,7 @@ dotnet run --project src/Axiom.ManualChecks -- benchmark-bytecode --iterations 3
7474
- `samples/smoke/engine-compare/temp_storage_roundtrip.axm`
7575
- `samples/smoke/engine-compare/temp_writefile_probe.axm`
7676
- `samples/smoke/engine-compare/type_record_roundtrip.axm`
77+
- `samples/smoke/engine-compare/type_method_receiver_chain.axm`
7778

7879
## Отдельные измерения GPU-CANVAS — 13 октября 2026 года
7980

@@ -97,3 +98,9 @@ dotnet run --project src/Axiom.ManualChecks -- benchmark-bytecode --iterations 3
9798
Добавлены два сценария семейства массивов: `array_push_pop_growth.axm` (12 раундов по 1500 добавлений и 500 снятий) и `array_distinct_unique.axm` (6000 уникальных значений, четыре прохода). Они закрепляют измерения операций, которые раньше проверялись только косвенно.
9899

99100
До исправления одиночные замеры Debug CLI давали около 9,1 с на 60 000 последовательных `ARRAYPUSH` и около 26,4 с на `ARRAYDISTINCT` с 20 000 уникальных значений. После перехода на ёмкость хранилища и хеш-множество те же сценарии укладываются примерно в 0,78 с и 0,4 с с учётом запуска CLI (около 0,32–0,42 с). Числа остаются диагностическими одиночными замерами, а не эталоном; существующие сценарии и их размеры не менялись.
101+
102+
## Нагрузка методов TYPE с составным получателем — 17 октября 2026 года
103+
104+
Добавлен сценарий `type_method_receiver_chain.axm`: 400 проходов по методу вложенного поля и 16 методам элементов массива записей, всего 6800 вызовов с адресуемым `SELF`. Сценарий закрепляет путь, который раньше шёл через копию записи и обратную запись, а теперь передаёт метод адрес поля или элемента с однократно вычисленными индексами.
105+
106+
Одиночный замер Release CLI с учётом запуска процесса: около 0,8 с, вывод 80200 / 7200 / 400 / 10200. Число остаётся диагностическим ориентиром, а не эталоном: сравнительного замера до и после изменения не выполнялось, потому что прежняя реализация теряла изменения `SELF` и давала другой вывод, так что сравнение времени на разном результате некорректно. Каталог engine-compare теперь содержит 52 файла; остальные семьи не менялись.

‎docs/CHANGELOG.md‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -453,3 +453,15 @@ Stop отменяет ожидающий Restart, поздний ответ не
453453
Язык **0.1.17** · компилятор/CLI **0.1.17** · IDE **0.6.19**
454454

455455
Объединены независимые исправления массивов и графики; согласованы общие версии
456+
457+
## 2026-10-17 17:24 — Сохранять ошибку исполнения при фоновой проверке
458+
459+
Язык **0.1.17** · компилятор/CLI **0.1.17** · IDE **0.6.20**
460+
461+
Сохранять ошибку исполнения при фоновой проверке
462+
463+
## 2026-10-17 18:27 — Пользовательские типы TYPE: адресуемый SELF, отложенное создание записей, константные значения полей, устойчивое сравнение и снимки состояния
464+
465+
Язык **0.1.18** · компилятор/CLI **0.1.18** · IDE **0.6.20**
466+
467+
Пользовательские типы TYPE: адресуемый SELF, отложенное создание записей, константные значения полей, устойчивое сравнение и снимки состояния

0 commit comments

Comments
 (0)