Spec-Zone.ru › Ada 2012
Справочник по Ada 2012

4.8 Распределители

Вычисление распределителя создаёт объект и возвращает значение доступа, которое обозначает этот объект.

Синтаксис

распределитель ::=
new [спецификация_подпула] индикация_типа_подтипа
| new [спецификация_подпула] квалифицированное_выражение
спецификация_подпула ::= (указатель_подпула_имя)
Для распределителя с индикацией_типа_подтипа, индикация_типа_подтипа не должна указывать исключение_нуля.

Правила разрешения имён

Ожидаемый тип для распределителя должен быть единственным типом доступа к объекту с указанным типом D, таким, что либо D охватывает тип, определяемый меткой_типа_подтипа индикации_типа_подтипа или квалифицированным_выражением, или ожидаемый тип является анонимным, а определённый тип — D'Класс. указатель_подпула_имя ожидается как любой тип, являющийся потомком Subpool_Handle, который используется для идентификации подпула, объявленного в пакете System.Storage_Pools.Subpools (см. 13.11.4).

Правила допустимости

Инициализированный распределитель — это распределитель с квалифицированным_выражением. Неинициализированный распределитель — это распределитель с индикацией_типа_подтипа. В индикации_типа_подтипа неинициализированного распределителя допускается ограничение только если метка_типа_подтипа обозначает нескомпонованный составной подтип; если ограничение отсутствует, то метка_типа_подтипа должна обозначать определённый подтип.
Если тип распределителя является типом доступа к константе, распределитель должен быть инициализированным распределителем.
Если задана спецификация_подпула, тип хранилища пула доступа должен быть потомком Root_Storage_Pool_With_Subpools.
Если указанный тип типа распределителя является классовым, уровень доступности типа, определяемого индикацией_типа_подтипа или квалифицированным_выражением, не должен быть статически глубже, чем уровень доступности типа распределителя.
Если подтип, определяемый индикацией_типа_подтипа или квалифицированным_выражением распределителя, имеет один или несколько дискриминантов доступа, то уровень доступности анонимного типа доступа каждого дискриминанта доступа не должен быть статически глубже уровня доступности типа распределителя (см. 3.10.2).
Распределитель не должен быть типа доступа, для которого Storage_Size был указан статическим выражением со значением ноль или определён языком как ноль.
Если указанный тип типа распределителя ограничен, то распределитель не должен использоваться для определения значения дискриминанта доступа, если только дискриминируемый тип не является неизменно ограниченным (см. 7.5).
Помимо мест, где обычно применяются Правила допустимости (см. 12.3), эти правила также применяются в закрытой части экземпляра генерируемого блока.

Статические семантики

Если указанный тип типа распределителя является элементарным, то подтип созданного объекта является указанным подтипом. Если указанный тип является составным, то подтип созданного объекта является указанным подтипом, когда указанный подтип ограничен или имеется предок указанного типа, имеющий ограниченное частичное представление; в противном случае созданный объект ограничен своим начальным значением (даже если указанный подтип является неограниченным со значениями по умолчанию).

Динамические семантики

Для вычисления инициализированного распределителя сначала выполняется вычисление квалифицированного_выражения. Создаётся объект указанного типа, и значение квалифицированного_выражения преобразуется к указанному подтипу и присваивается объекту.
Для вычисления неинициализированного распределителя сначала выполняется разработка индикации_типа_подтипа. Затем:
  • Если указанный тип элементарный, создаётся объект указанного подтипа, и ему присваивается любое неявное начальное значение;
  • Если указанный тип составной, создаётся объект указанного типа с тегом, если таковой имеется, определяемым меткой_типа_подтипа индикации_типа_подтипа. Этот объект затем инициализируется по умолчанию (см. 3.3.1), используя индикацию_типа_подтипа для определения его номинального подтипа. Проверяется, принадлежит ли значение объекта указанному подтипу. Constraint_Error генерируется, если эта проверка не проходит. Проверка и инициализация объекта выполняются в произвольном порядке.
Для любого распределителя, если указанный тип типа распределителя является классовым, то выполняется проверка, включает ли главный тип, определяемый индикацией_типа_подтипа или тегом значения квалифицированного_выражения, обработку типа распределителя. Если какая-либо часть подтипа, определяемого индикацией_типа_подтипа или квалифицированным_выражением распределителя (или тегом значения, если тип квалифицированного_выражения является классовым), имеет один или несколько дискриминантов доступа, то выполняется проверка, что уровень доступности анонимного типа доступа каждого дискриминанта доступа не глубже уровня доступности типа распределителя. Program_Error генерируется, если любая такая проверка терпит неудачу.
Если создаваемый объектом распределителя содержит управляемую или защищённую часть, и началась финализация коллекции типа распределителя (см. 7.6.1), генерируется Program_Error.
Если объект, создаваемый распределителем, содержит какие-либо задачи, и главный тип распределителя завершён, и все зависимые задачи главного типа завершены (см. 9.3), то генерируется Program_Error.
Если распределитель включает указатель_подпула_имя, Constraint_Error генерируется, если указатель подпула равен null. Program_Error генерируется, если подпул не принадлежит (см. 13.11.4) хранилищу пула типа доступа распределителя.
Если создаваемый объект содержит какие-либо задачи, они активируются (см. 9.2). Наконец, возвращается значение доступа, которое обозначает созданный объект.

Ограниченные (временно́й) ошибки

Ошибка является ограниченной, если завершение инициализации коллекции типа (см. 7.6.1) аллокатора началась. Если ошибка обнаружена, то поднимается Program_Error. В противном случае, выделение памяти происходит нормально.
ПРИМЕЧАНИЯ
24 Аллокаторы не могут создавать объекты абстрактного типа. См. 3.9.3.
25 Если какая-либо часть создаваемого объекта контролируется, инициализация включает вызовы соответствующих процедур Initialize или Adjust. См. 7.6.
26 Как объяснено в 13.11, «Управление памятью», память для объекта, выделенного аллокатором, берётся из пула памяти (возможно, определённого пользователем). Исключение Storage_Error генерируется аллокатором, если памяти недостаточно. Экземпляры Unchecked_Deallocation могут использоваться для явного возврата памяти.
27 Реализации разрешено, но не обязательно, предоставлять сборку мусора.

Примеры

Примеры аллокаторов:
new Cell'(0, null, null) -- инициализируется явно, см. 3.10.1
new Cell'(Value => 0, Succ => null, Pred => null) -- инициализируется явно
new Cell -- не инициализируется
new Matrix(1 .. 10, 1 .. 20) -- указаны только границы
new Matrix'(1 .. 10 => (1 .. 20 => 0.0)) -- инициализируется явно
new Buffer(100) -- указан только дискриминант
new Buffer'(Size => 80, Pos => 0, Value => (1 .. 80 => 'A')) -- инициализируется явно
Expr_Ptr'(new Literal) -- аллокатор для доступа к типу класса, см. 3.9.1
Expr_Ptr'(new Literal'(Expression with 3.5)) -- инициализируется явно


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API