Перейти к содержанию

T2-B — локальные readonly subviews

Контракт следующего этапа, реализация ещё не начата. База — T2-A, слитая в b320611. Возвращаемые TextView, mutable borrows и MT сюда не входят.

Операция и границы

Проектируемая операция внутри readonly-функции:

bytes = memory.view(text.storage)
prefix = view bytes[0..text.length]

Источник — доступный локальный 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.