Spec-Zone.ru › Perl 5.34

perlmroapi

СОДЕРЖАНИЕ

  • ИМЯ
  • ОПИСАНИЕ
  • Обработчики событий
  • Кэширование
  • Примеры
  • АВТОРЫ

ИМЯ

perlmroapi - Perl плагин для метода разрешения

ОПИСАНИЕ

Начиная с Perl 5.10.1, появился новый интерфейс для подключения и использования порядков разрешения методов, отличных от стандартного (линейный поиск в глубину). Порядок разрешения методов C3, добавленный в 5.10.0, был повторно реализован как плагин, без изменения интерфейса Perl.

Каждый плагин должен зарегистрироваться, предоставив следующую структуру

struct mro_alg {
    AV *(*resolve)(pTHX_ HV *stash, U32 level);
    const char *name;
    U16 length;
    U16 kflags;
    U32 hash;
};

и вызвав Perl_mro_register.

Perl_mro_register(aTHX_ &my_mro_alg);
resolve

Указатель на функцию линейной функции, описанную ниже.

name

Имя MRO, либо в ISO-8859-1, либо UTF-8.

length

Длина имени.

kflags

Если имя задано в UTF-8, установите это значение в HVhek_UTF8. Значение передаётся напрямую как параметр kflags в hv_common().

hash

Предварительно вычисленный хэш-код имени MRO или 0.

Обработчики событий

Функция resolve вызывается для генерации линейного ISA для данного стека с использованием данного MRO. Она вызывается с указателем на стек и уровнем 0. Ядро всегда устанавливает level в 0, когда вызывает вашу функцию. Параметр предоставляется для того, чтобы ваша реализация могла отслеживать глубину, если ей необходимо рекурсировать.

Функция должна вернуть ссылку на массив, содержащий родительские классы в порядке. Имена классов должны быть результатом вызова HvENAME() на стеке. В тех случаях, когда HvENAME() возвращает null, следует использовать HvNAME().

Вызывающий метод несет ответственность за увеличение счётчика ссылок массива, возвращаемого, если он хочет сохранить структуру. Следовательно, если вы создали временную переменную, на которую вы не храните указатель, используйте sv_2mortal(), чтобы убедиться, что она утилизирована корректно. Если вы кэшировали возвращаемое значение, верните указатель на него без изменения счётчика ссылок.

Кэширование

Вычисление MRO может быть дорогостоящим. Реализация предоставляет кэш, в котором вы можете хранить одно SV *, или всё, что можно привести к типу SV *, например AV *. Для чтения вашего частного значения используйте макрос MRO_GET_PRIVATE_DATA(), передав ему структуру mro_meta из стека и указатель на вашу структуру mro_alg:

meta = HvMROMETA(stash);
private_sv = MRO_GET_PRIVATE_DATA(meta, &my_mro_alg);

Чтобы установить ваше частное значение, вызовите Perl_mro_set_private_data():

Perl_mro_set_private_data(aTHX_ meta, &c3_alg, private_sv);

Кэш частных данных возьмёт на себя управление ссылкой на private_sv, так же, как и hv_store() берёт на себя управление ссылкой на значение, которое вы ему передаёте.

Примеры

Примеры реализаций MRO см. в S_mro_get_linear_isa_c3() и разделе BOOT: в ext/mro/mro.xs, а также S_mro_get_linear_isa_dfs() в mro_core.c

АВТОРЫ

Реализацию MRO C3 и переключаемых MRO в ядре Perl написал Brandon L Black. Nicholas Clark создал плагиновый интерфейс, переработал реализацию Брендона для работы с ним и написал этот документ.

© 1993–2021 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.34.0/perlmroapi

Spec-Zone.ru

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