T2-B — локальные readonly subviews
Контракт следующего этапа, реализация ещё не начата. База — T2-A,
слитая в b320611. Возвращаемые TextView, mutable borrows и MT сюда не входят.
Операция и границы
Проектируемая операция внутри readonly-функции:
Источник — доступный локальный View<T>. Диапазон полуоткрытый; требуется
0 <= start <= end <= bytes.len. Нарушение границ вызывает обязательный trap,
как у существующего выражения view. Проверка выполняется до вычисления адреса
и end - start. Индексы относятся к исходному view, не к вместимости Buffer.
Пустые диапазоны допустимы, включая [len,len); они не дают права чтения.
Subview хранит дескриптор диапазона, не копирует элементы и не аллоцирует память.
Вложенный subview проверяется относительно непосредственного родителя. Физическое
смещение складывается с его смещением только после проверки диапазона; LLVM
lowering должен сохранять эти проверки, включая случаи максимального u32.
View<u8> не гарантирует UTF-8: произвольный байтовый срез может разрезать символ.
Корень и время жизни
Subview наследует исходный корень займа через всю цепочку проекций и subviews. Новый дескриптор не создаёт независимого владельца или lifetime. Все живые производные views удерживают запрет на потребление и изменение владельца и закрытие его региона. Применяются существующие лексические правила завершения займа; этот этап не вводит сокращение lifetime по последнему использованию.
Разрешена передача локального subview наблюдающей функции. Запрещены возврат, сохранение в агрегате и перенос за область исходного займа. Generic-подстановка, вложенные вызовы и вычисление последующих аргументов должны сохранять корень. Два readonly-среза могут сосуществовать; после окончания их области владелец снова доступен для append, clear, move и release.
Эталон и приёмка
Эталон — вывод только [0,length) из String через наблюдающую функцию с io.
Неиспользованная вместимость не выводится. Приватность storage не ослабляется;
публичного возвращаемого view у String пока нет.
Обязательны проверки:
- полные, пустые и вложенные диапазоны; произвольные бинарные байты;
- границы относительно укороченного родителя,
start > end,end > len, максимальные индексы и отсутствие переполнения адресных вычислений; - попытки move, release, мутации и закрытия региона при живом дочернем view;
- вложенные generic-проекции и конфликт в последующем аргументе вызова;
- отсутствие escape и сохранение приватности; разрешение потребления после блока;
- одинаковое поведение O0/O2, сохранение owner metadata в Semantic IR;
- отсутствие аллокаций и копирования содержимого при создании subview;
- отдельные отрицательные проверки порядка операций: в IR/lowering проверка
start <= end <= parent.lenдолжна доминировать над вычислением физического адреса. Контроль с намеренно переставленной проверкой должен обнаруживаться; одного нативного теста на факт trap недостаточно для установления его причины.
Сначала добавляются отрицательные и положительные тесты, затем обновляются анализ займов, IR/lowering и API String. Успех прежних Verified-наборов остаётся регрессией, а не доказательством soundness T2-B.