Spec-Zone.ru › Perl 5.30

perlintern

СОДЕРЖАНИЕ

  • ИМЯ
  • ОПИСАНИЕ
  • Временные метки области видимости во время компиляции
  • Пользовательские операторы
  • Функции управления CV
  • Счетчики ссылок CV и CvOUTSIDE
  • Функции встраивания
  • Функции GV
  • Функции управления хешами
  • Функции Ввода/Вывода
  • Интерфейс лексического анализатора
  • Магические функции
  • Разнообразные функции
  • Функции MRO
  • Числовые функции
  • Функции манипулирования Optree
  • Структуры данных Pad
  • Переменные на интерпретатор
  • Макросы управления стеком
  • Функции управления SV
  • Поддержка Unicode
  • Недокументированные функции
  • АВТОРЫ
  • СМОТРИТЕ ТАКЖЕ

ИМЯ

perlintern - автоматически сгенерированная документация чисто внутренних функций Perl

ОПИСАНИЕ

Этот файл содержит автоматически сгенерированную документацию функций интерпретатора Perl, которые документированы с использованием внутреннего формата документации Perl, но не помечены как часть API Perl. Другими словами, они не предназначены для использования в расширениях!

Временные метки области видимости во время компиляции

BhkENTRY

ПРИМЕЧАНИЕ: эта функция является экспериментальной и может быть изменена или удалена без предварительного уведомления.

Возвращает запись из структуры BHK. which — это препроцессорный токен, указывающий, какую запись вернуть. Если соответствующий флаг не установлен, возвращается NULL. Тип возвращаемого значения зависит от того, какую запись вы запрашиваете.

void *  BhkENTRY(BHK *hk, which)
BhkFLAGS

ПРИМЕЧАНИЕ: эта функция является экспериментальной и может быть изменена или удалена без предварительного уведомления.

Возвращает флаги BHK.

U32     BhkFLAGS(BHK *hk)
CALL_BLOCK_HOOKS

ПРИМЕЧАНИЕ: эта функция является экспериментальной и может быть изменена или удалена без предварительного уведомления.

Вызывает все зарегистрированные временные метки блока для типа which. which — это препроцессорный токен; тип arg зависит от which.

void    CALL_BLOCK_HOOKS(which, arg)

Пользовательские операторы

core_prototype

Эта функция назначает прототип указанной внутренней функции sv, или новому временному SV, если sv равно NULL. Она возвращает измененный sv, или NULL если у внутренней функции нет прототипа. code — это код, возвращённый keyword(). Он не должен быть равен 0.

SV *    core_prototype(SV *sv, const char *name,
                       const int code,
                       int * const opnum)

Функции управления CV

docatch

Проверяет значения 0 или 3 в cur_env.je_ret, используется только внутри контекста eval.

0 используется для продолжения внутри eval,

3 используется для исключения, перехваченного внутренним eval - продолжение внутреннего цикла

См. cop.h: je_mustcatch, когда установлено в TRUE на любом уровне, означает, что операторы eval должны создать локальный jmpenv для обработки ловушек исключений.

OP*     docatch(Perl_ppaddr_t firstpp)

Счетчики ссылок CV и CvOUTSIDE

CvWEAKOUTSIDE

Каждый CV имеет указатель CvOUTSIDE(), на его лексически окружающий CV (если есть). Так как указатели на прототипы анонимных подпрограмм хранятся в & слотах, возможно получить циклическую ссылку, где родитель указывает на ребенка, а ребенок - на родителя. Чтобы избежать утечки памяти, мы не увеличиваем счетчик ссылок CV на который указывает CvOUTSIDE в конкретном случае, когда родитель имеет & слот, указывающий на нас. В этом случае мы устанавливаем флаг CvWEAKOUTSIDE в ребенке. Это позволяет нам определить, в каких обстоятельствах нам следует уменьшить счетчик ссылок родителя при освобождении ребенка.

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

BEGIN { $a = sub { eval '$x' } }

В этом случае BEGIN освобождается сразу после выполнения, поскольку нет активных ссылок на него: прототип анонимной подпрограммы имеет CvWEAKOUTSIDE установленным, поскольку он не является замыканием, и $a указывает на тот же CV, поэтому он тоже не влияет на счетчик ссылок BEGIN. Когда выполняется $a, eval '$x' вызывает следование цепочке CvOUTSIDE, и освобожденный BEGIN обращается к нему.

Чтобы избежать этого, каждый раз, когда CV и связанный с ним блок освобождаются, любые записи & в блоке явно удаляются из блока, и если счетчик ссылок на указанную анонимную подпрограмму всё ещё положителен, то CvOUTSIDE ребёнка устанавливается в указание на его прародителя. Это произойдёт только в единственном случае анонимного прототипа, не являющегося замыканием, имеющего одну или более активных ссылок (например, $a выше).

Ещё один момент, который следует учитывать, это то, что CV может быть просто не определен, а не освобожден, например undef &foo. В этом случае его счетчик ссылок может не достигнуть нуля, но мы всё равно удаляем его блок и CvROOT и т.д. Поскольку различные дети могут иметь свои CvOUTSIDE, указывающие на этот неопределённый CV, мы сохраняем свой CvOUTSIDE на время, чтобы цепочка лексических областей видимости оставалась неразрывной. Например, следующее должно вывести 123:

my $x = 123;
sub tmp { sub { eval '$x' } }
my $a = tmp();
undef &tmp;
print  $a->();

    bool    CvWEAKOUTSIDE(CV *cv)

Функции встраивания

cv_dump

вывод содержимого CV

void    cv_dump(CV *cv, const char *title)
cv_forget_slab

Когда CV имеет счетчик ссылок на своем блоке (CvSLABBED), он отвечает за его освобождение. (Следовательно, два CV не должны иметь счетчик ссылок на одном и том же блоке.) CV должен ссылаться на блок только во время компиляции. После компиляции и CvROOT подключения он завершает свою работу, поэтому может забыть блок.

void    cv_forget_slab(CV *cv)
do_dump_pad

Вывести содержимое списка блоков

void    do_dump_pad(I32 level, PerlIO *file,
                    PADLIST *padlist, int full)
pad_alloc_name

Выделяет место в текущем компилируемом блоке (через "pad_alloc" в perlapi) и затем сохраняет имя для этой записи. name принимается и становится именем записи; она должна уже содержать строку с именем. typestash и ourstash и padadd_STATE флаг добавляются к name. Никакая другая обработка "pad_add_name_pvn" в perlapi не выполняется. Возвращает смещение выделенного слота блока.

PADOFFSET pad_alloc_name(PADNAME *name, U32 flags,
                         HV *typestash, HV *ourstash)
pad_block_start

Обновить переменные состояния компиляции блока при входе в новый блок.

void    pad_block_start(int full)
pad_check_dup

Проверка на дублирующие объявления: сообщается об одном из следующих:

* a 'my' in the current scope with the same name;
* an 'our' (anywhere in the pad) with the same name and the
  same stash as 'ourstash'

is_our указывает, что проверяемое имя является объявлением "our".

void    pad_check_dup(PADNAME *name, U32 flags,
                      const HV *ourstash)
pad_findlex

Поиск именованного лексического блока в цепочке вложенных блоков. Добавить фиктивные записи во внутренние блоки, если он найден во внешнем.

Возвращает смещение в нижнем блоке лексического блока или фиктивного лексического блока. cv - CV, в котором следует начать поиск, а seq - текущий cop_seq для сопоставления. Если warn имеет значение true, выводятся соответствующие предупреждения. Переменные out_* возвращают значения и поэтому являются указателями на место, где должны храниться возвращаемые значения. out_capture, если не равно null, запрашивает захват внутреннего экземпляра лексического блока; out_name устанавливается на имя вложенного совпадающего блока или имя фиктивного блока; out_flags возвращает флаги, обычно связанные с PARENT_FAKELEX_FLAGS полем имени фиктивного блока.

Обратите внимание, что pad_findlex() рекурсивный; он рекурсивно поднимается по цепочке CV, затем возвращается вниз, добавляя фиктивные записи по мере продвижения. Это необходимо, потому что фиктивные имена в анонимных прототипах должны хранить в xpadn_low индекс в родительском блоке.

PADOFFSET pad_findlex(const char *namepv,
                      STRLEN namelen, U32 flags,
                      const CV* cv, U32 seq, int warn,
                      SV** out_capture,
                      PADNAME** out_name,
                      int *out_flags)
pad_fixup_inner_anons

Для всех анонимных CV в блоке измените CvOUTSIDE этого CV с old_cv на new_cv, если это необходимо. Необходимо, когда недавно скомпилированный CV необходимо переместить в существующую структуру CV.

void    pad_fixup_inner_anons(PADLIST *padlist,
                              CV *old_cv, CV *new_cv)
pad_free

Освободить SV по смещению po в текущем блоке.

void    pad_free(PADOFFSET po)
pad_leavemy

Очистка в конце области видимости во время компиляции: установить максимальное значение seq для лексических блоков в этой области видимости и предупредить о любых лексических блоках, которые никогда не были введены.

void    pad_leavemy()
padlist_dup

Создает копию блока.

PADLIST * padlist_dup(PADLIST *srcpad,
                      CLONE_PARAMS *param)
padname_dup

Создает копию имени блока.

PADNAME * padname_dup(PADNAME *src, CLONE_PARAMS *param)
padnamelist_dup

Создает копию списка имён блоков.

PADNAMELIST * padnamelist_dup(PADNAMELIST *srcpad,
                              CLONE_PARAMS *param)
pad_push

Поместить новый кадр блока в список блоков, если в этом уровне уже есть блок, то не создавайте новый. Затем присвойте новому блоку @_ в нулевом слоте.

void    pad_push(PADLIST *padlist, int depth)
pad_reset

Отметить все текущие временные переменные для повторного использования

void    pad_reset()
pad_swipe

Отказаться от tmp в текущем блоке по смещению po и заменить его новым.

void    pad_swipe(PADOFFSET po, bool refadjust)

GV Functions

gv_try_downgrade

ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.

Если типглоб gv можно выразить более кратко, поместив вместо него что-то другое, кроме реального GV, в стэш, замените его оптимизированной формой. Основные требования заключаются в том, что gv является реальным типглобом, достаточно обычным и ссылается только из своего пакета. Эта функция предназначена для использования, когда GV был частично просмотрен для определения содержимого, что привело к обновлению, но на основе того, что найдено, оказалось, что реальный GV не нужен.

Если gv - полностью пустой типглоб, он удаляется из стэша.

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

void    gv_try_downgrade(GV* gv)

Hash Manipulation Functions

hv_ename_add

Добавляет имя в внутренний список эффективных имён стэша. См. "hv_ename_delete".

Вызывается при назначении стэша новому расположению в таблице символов.

void    hv_ename_add(HV *hv, const char *name, U32 len,
                     U32 flags)
hv_ename_delete

Удаляет имя из внутреннего списка эффективных имён стэша. Если это имя, возвращаемое HvENAME, то другое имя в списке займёт его место (HvENAME его использует).

Вызывается при удалении стэша из таблицы символов.

void    hv_ename_delete(HV *hv, const char *name,
                        U32 len, U32 flags)
refcounted_he_chain_2hv

Генерирует и возвращает HV *, представляющий содержимое цепочки refcounted_he. flags в настоящее время не используется и должно быть равно нулю.

HV *    refcounted_he_chain_2hv(
            const struct refcounted_he *c, U32 flags
        )
refcounted_he_fetch_pv

Как "refcounted_he_fetch_pvn", но принимает строку с нулевым завершением вместо пары "строка/длина".

SV *    refcounted_he_fetch_pv(
            const struct refcounted_he *chain,
            const char *key, U32 hash, U32 flags
        )
refcounted_he_fetch_pvn

Поиск по цепочке refcounted_he для записи с ключом, заданным keypv и keylen. Если у flags установлен бит REFCOUNTED_HE_KEY_UTF8, октеты ключа интерпретируются как UTF-8, в противном случае как Latin-1. hash - предварительно вычисленный хэш строки ключа или ноль, если он не был предварительно вычислен. Возвращает смертельный скаляр, представляющий значение, связанное с ключом, или &PL_sv_placeholder, если нет значения, связанного с ключом.

SV *    refcounted_he_fetch_pvn(
            const struct refcounted_he *chain,
            const char *keypv, STRLEN keylen, U32 hash,
            U32 flags
        )
refcounted_he_fetch_pvs

Как "refcounted_he_fetch_pvn", но принимает строку без нулевого завершения вместо пары "строка/длина", и нет предварительно вычисленного хэша.

SV *    refcounted_he_fetch_pvs(
            const struct refcounted_he *chain,
            "literal string" key, U32 flags
        )
refcounted_he_fetch_sv

Как "refcounted_he_fetch_pvn", но принимает перловский скаляр вместо пары "строка/длина".

SV *    refcounted_he_fetch_sv(
            const struct refcounted_he *chain, SV *key,
            U32 hash, U32 flags
        )
refcounted_he_free

Уменьшает счетчик ссылок на refcounted_he на единицу. Если счетчик ссылок достигает нуля, память структуры освобождается, что (рекурсивно) приводит к уменьшению счетчика ссылок родительской структуры refcounted_he. В этом случае безопасно передавать указатель null в эту функцию: никаких действий не выполняется.

void    refcounted_he_free(struct refcounted_he *he)
refcounted_he_inc

Увеличивает счетчик ссылок на refcounted_he. Указатель на refcounted_he также возвращается. В этом случае безопасно передавать указатель null в эту функцию: никаких действий не выполняется и возвращается указатель null.

struct refcounted_he * refcounted_he_inc(
                           struct refcounted_he *he
                       )
refcounted_he_new_pv

Как "refcounted_he_new_pvn", но принимает строку с нулевым завершением вместо пары "строка/длина".

struct refcounted_he * refcounted_he_new_pv(
                           struct refcounted_he *parent,
                           const char *key, U32 hash,
                           SV *value, U32 flags
                       )
refcounted_he_new_pvn

Создаёт новую refcounted_he. Она состоит из единственной пары ключ/значение и ссылки на существующую цепочку refcounted_he (которая может быть пустой), и таким образом образует более длинную цепочку. При использовании более длинной цепочки новая пара ключ/значение имеет приоритет над любой записью для того же ключа далее в цепочке.

Новый ключ задаётся keypv и keylen. Если у flags установлен бит REFCOUNTED_HE_KEY_UTF8, октеты ключа интерпретируются как UTF-8, в противном случае как Latin-1. hash - предварительно вычисленный хэш строки ключа, или ноль, если он не был предварительно вычислен.

value - скалярное значение для хранения по этому ключу. value копируется этой функцией, которая, таким образом, не берёт на себя ответственность за любую ссылку на неё, и последующие изменения скаляра не будут отражены в значении, видимом в refcounted_he. Сложные типы скаляров не будут храниться с целостностью ссылок, а будут преобразованы в строки. value может быть либо null, либо &PL_sv_placeholder для обозначения того, что значение не должно быть связано с ключом; это, как и любое ненулевое значение, имеет приоритет над существованием значения для ключа далее в цепочке.

parent указывает на остальную часть цепочки refcounted_he для присоединения к новому refcounted_he. Эта функция берёт на себя ответственность за одну ссылку на parent, и возвращает одну ссылку на новый refcounted_he.

struct refcounted_he * refcounted_he_new_pvn(
                           struct refcounted_he *parent,
                           const char *keypv,
                           STRLEN keylen, U32 hash,
                           SV *value, U32 flags
                       )
refcounted_he_new_pvs

Как "refcounted_he_new_pvn", но принимает строку без нулевого завершения вместо пары "строка/длина", и нет предварительно вычисленного хэша.

struct refcounted_he * refcounted_he_new_pvs(
                           struct refcounted_he *parent,
                           "literal string" key,
                           SV *value, U32 flags
                       )
refcounted_he_new_sv

Как "refcounted_he_new_pvn", но принимает перловский скаляр вместо пары "строка/длина".

struct refcounted_he * refcounted_he_new_sv(
                           struct refcounted_he *parent,
                           SV *key, U32 hash, SV *value,
                           U32 flags
                       )

IO Functions

start_glob

ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.

Функция, вызываемая do_readline для запуска глобуса (или выполнения глобуса внутри perl на VMS). Этот код раньше был встроенным, но теперь perl использует File::Glob. Этот стартер глобуса используется только miniperl во время процесса сборки или при определении PERL_EXTERNAL_GLOB. Перемещение его сокращает pp_hot.c; сокращение pp_hot.c помогает ускорить perl.

PerlIO* start_glob(SV *tmpglob, IO *io)

Lexer interface

validate_proto

ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.

Эта функция выполняет синтаксическую проверку прототипа, proto. Если warn имеет значение true, любые неправомерные символы или несовпадающие скобки будут вызывать предупреждения illegalproto, заявляя, что они были обнаружены в прототипе для name.

Значение возврата — true, если это допустимый прототип, и false, если нет, независимо от того, было ли warn true или false.

Обратите внимание, что NULL является допустимым proto и всегда возвращает true.

ПРИМЕЧАНИЕ: perl_ форма этой функции устарела.

bool    validate_proto(SV *name, SV *proto, bool warn,
                       bool curstash)

Магические функции

magic_clearhint

Вызывается при удалении из %^H, записывает ключ в PL_compiling.cop_hints_hash.

int     magic_clearhint(SV* sv, MAGIC* mg)
magic_clearhints

Вызывается при очистке %^H, сбрасывает PL_compiling.cop_hints_hash.

int     magic_clearhints(SV* sv, MAGIC* mg)
magic_methcall

Вызов магического метода (например, FETCH).

sv и mg — это привязанный объект и магическая привязка.

meth — имя метода для вызова.

argc — количество аргументов (кроме $self), которые нужно передать методу.

flags может быть:

G_DISCARD     invoke method with G_DISCARD flag and don't
              return a value
G_UNDEF_FILL  fill the stack with argc pointers to
              PL_sv_undef

Сами аргументы — любые значения, следующие за аргументом flags.

Возвращает SV (если есть) возвращённый методом или NULL в случае ошибки.

SV*     magic_methcall(SV *sv, const MAGIC *mg,
                       SV *meth, U32 flags, U32 argc,
                       ...)
magic_sethint

Вызывается при записи в %^H, записывает пару ключ/значение в PL_compiling.cop_hints_hash. Предполагается, что подсказки не хранят ничего, что потребовало бы глубокой копии. Возможно, стоило бы выводить предупреждение, если мы найдём ссылку.

int     magic_sethint(SV* sv, MAGIC* mg)
mg_localize

Копирует часть магии из существующего SV в новую локальную версию этого SV. Магия контейнера (например, %ENV, $1, tie) копируется, а магия значения — нет (например, taint, pos).

Если setmagic имеет значение false, то никакие магические установки не будут вызваны на новом (пустом) SV. Это обычно означает, что вскоре последует присваивание (например, 'local $x = $y'), и оно обработает магию.

void    mg_localize(SV* sv, SV* nsv, bool setmagic)

Вспомогательные функции

free_c_backtrace

Освобождает стек вызовов, полученный из get_c_bracktrace.

void    free_c_backtrace(Perl_c_backtrace* bt)
get_c_backtrace

Собирает стек вызовов (также известный как «стек трейса») в один линейный буфер, выделенный с помощью malloc, который вызывающая сторона обязана Perl_free_c_backtrace().

Сканирует кадры назад на depth + skip, затем опускает skip самый внутренний, возвращая не более depth кадров.

Perl_c_backtrace* get_c_backtrace(int max_depth,
                                  int skip)

Функции MRO

mro_get_linear_isa_dfs

Возвращает линейную последовательность поиска в глубину (Depth-First Search) для @ISA данного хранилища. Возвращаемое значение — только для чтения AV*. level должно быть 0 (используется внутри рекурсии этой функции).

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

AV*     mro_get_linear_isa_dfs(HV* stash, U32 level)
mro_isa_changed_in

Выполняет необходимые шаги (в основном очистка кеша), когда @ISA заданного пакета изменилось. Вызывается магией setisa, не должно вызываться напрямую.

void    mro_isa_changed_in(HV* stash)
mro_package_moved

Вызовите эту функцию, чтобы сообщить хранилищу, что оно было назначено в другое место иерархии хранилищ. stash — хранилище, которому было назначено место. oldstash — хранилище, которое оно заменяет (если есть). gv — глобус, которому фактически присвоено место.

Также можно вызвать с нулевым первым аргументом, чтобы указать, что oldstash было удалено.

Эта функция очищает кеши isa для старого хранилища, всех вложенных подпакетов и подклассов всех, включая несуществующие пакеты, имеющие соответствующие записи в stash.

Она также устанавливает эффективные имена (HvENAME) для всех хранилищ, как требуется.

Если gv присутствует и отсутствует в таблице символов, эта функция просто возвращает. Эта проверка будет пропущена, если flags & 1.

void    mro_package_moved(HV * const stash,
                          HV * const oldstash,
                          const GV * const gv,
                          U32 flags)

Числовые функции

grok_atoUV

Разбирает строку, ища целое десятичное число без знака.

При входе pv указывает на начало строки; valptr указывает на UV, который получит преобразованное значение, если найдено; endptr либо равно NULL, либо указывает на переменную, которая указывает на байт после позиции в pv, которую должна проверить эта функция. Если endptr равно NULL, то pv предполагается завершающимся нулём.

Возвращает FALSE, если pv не представляет собой допустимое значение целого числа без знака (без ведущих нулей). В противном случае возвращает TRUE и устанавливает *valptr на это значение.

Если вы ограничиваете часть pv , на которую смотрит эта функция (передав ненулевой endptr), и если начальные байты этой части образуют допустимое значение, она вернёт TRUE, установив *endptr на байт, следующий за последней цифрой значения. Но если нет ограничений на просматриваемую область, вся pv должна быть допустимой, чтобы вернуть TRUE.

Единственные допустимые символы — десятичные цифры от '0' до '9'.

В отличие от atoi(3) или strtol(3), grok_atoUV НЕ допускает необязательных ведущих пробелов, а также отрицательных входных данных. Если такие функции необходимы, вызывающий код должен явно их реализовать.

Обратите внимание, что эта функция возвращает FALSE для входных данных, которые могут привести к переполнению UV или содержат ведущие нули. Так, одиночный 0 допустим, но не 00 ни 01, 002, и так далее.

Предыстория: atoi имеет серьёзные проблемы с неверными входными данными, не может использоваться для инкрементального разбора и поэтому должна избегаться atoi и strtol также зависят от настроек локали, что можно рассматривать как ошибку (управляемая пользователем глобальная переменная состояния).

bool    grok_atoUV(const char* pv, UV* valptr,
                   const char** endptr)

Функции управления Optree

finalize_optree

Эта функция завершает обработку дерева optree. Следует вызывать сразу после построения полного дерева optree. Она выполняет дополнительную проверку, которую нельзя выполнить в обычных ck_xxx функциях, и делает дерево потокобезопасным.

void    finalize_optree(OP* o)
newATTRSUB_x

Создаёт подпрограмму Perl, выполняя также некоторые связанные задачи.

Ожидается, что эта функция будет вызвана в контексте компиляции Perl, и некоторые аспекты подпрограммы берутся из глобальных переменных, связанных с компиляцией. В частности, PL_compcv представляет подпрограмму, которая в данный момент компилируется. Она должна быть не равной null при вызове этой функции, и некоторые аспекты конструируемой подпрограммы берутся из неё. Созданная подпрограмма может фактически быть повторным использованием объекта PL_compcv, но это не обязательно.

Если block равно null, то у подпрограммы не будет тела, и в настоящее время будет ошибкой её вызов. Это представляет собой объявление подпрограммы вперёд, например, sub foo ($$);. Если block не равно null, то оно предоставляет код Perl тела подпрограммы, который будет выполнен при вызове подпрограммы. Это тело включает в себя код разворачивания аргументов, полученный из сигнатуры подпрограммы или подобных элементов. Использование стека в коде должно соответствовать стеку, прикреплённому к PL_compcv. Не ожидается, что код будет содержать операторы leavesub или leavesublv; эта функция добавит такой оператор. block используется этой функцией и станет частью созданной подпрограммы.

proto указывает прототип подпрограммы, если он не задан в качестве атрибута (см. ниже). Если proto равно null, то подпрограмма не будет иметь прототип. Если proto не равно null, то оно должно указывать на оператор const, значение которого является строкой, и подпрограмма будет иметь эту строку в качестве своего прототипа. Если прототип задан как атрибут, атрибут имеет приоритет над proto, но в этом случае proto предпочтительно должно быть null. В любом случае proto потребляется этой функцией.

attrs предоставляет атрибуты, которые должны быть применены к подпрограмме. Несколько атрибутов вступают в силу встроенными средствами, применяясь к PL_compcv сразу же при появлении. Другие атрибуты собираются и прикрепляются к подпрограмме этим способом. attrs может быть равно null, чтобы не задавать атрибутов, или указывать на оператор const для одного атрибута, или указывать на оператор list, чьи дочерние элементы, кроме pushmark, являются операторами const для одного или нескольких атрибутов. Каждый оператор const должен быть строкой, содержащей имя атрибута, необязательно с последующими скобками с аргументами, так же, как атрибуты отображаются в исходном коде Perl. Атрибуты будут применены к подпрограмме этой функцией. attrs потребляется этой функцией.

Если o_is_gv ложно и o равно null, то подпрограмма будет анонимной. Если o_is_gv ложно и o не равно null, то o должен указывать на оператор const, который будет потреблён этой функцией, и его строковое значение указывает имя подпрограммы. Имя может быть квалифицированным или неквалифицированным, и если оно неквалифицировано, то будет выбран стандартный хранилище (stash) каким-то способом. Если o_is_gv истинно, то o вообще не указывает на OP, а вместо этого является указателем на GV, по которому будет именоваться подпрограмма.

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

Если подпрограмма имеет одно из нескольких специальных имён, таких как BEGIN или END, то она будет взята соответствующим очереди для автоматического выполнения подпрограмм, связанных с фазами. В этом случае соответствующий глоб останется пустым, даже если он содержал подпрограмму ранее. В случае BEGIN, подпрограмма будет выполнена, а ссылка на неё будет удалена до возврата этой функции.

Функция возвращает указатель на созданную подпрограмму. Если подпрограмма анонимная, то владение одной ссылкой со счётом на подпрограмму передаётся вызывающей стороне. Если подпрограмма имеет имя, то вызывающая сторона не получает владения ссылкой. В большинстве таких случаев, когда подпрограмма имеет имя, отличное от имени фазы, подпрограмма будет существовать в момент возврата благодаря тому, что она содержится в глобе, который её называет. Подпрограмма с именем фазы обычно существует благодаря ссылке, принадлежащей очереди автоматического выполнения фазы. Но подпрограмма BEGIN, уже выполненная, с большой вероятностью будет уничтожена к моменту возврата этой функции, что сделает ошибочным использование вызывающей стороной возвращённого указателя. Вызывающая сторона несет ответственность за то, чтобы знать, какой из этих случаев имеет место.

CV *    newATTRSUB_x(I32 floor, OP *o, OP *proto,
                     OP *attrs, OP *block, bool o_is_gv)
newXS_len_flags

Создаёт подпрограмму XS, выполняя также некоторые связанные задачи.

Подпрограмма будет иметь точку входа subaddr. Она будет иметь прототип, заданный нуль-завершённой строкой proto, или без прототипа, если proto равно null. Строка прототипа копируется; вызывающая сторона может модифицировать предоставленную строку после этого. Если filename не равно null, оно должно быть нуль-завершённым именем файла, и подпрограмма будет иметь свой CvFILE соответствующим образом. По умолчанию CvFILE устанавливается в непосредственное указание на предоставленную строку, которая должна быть статической. Если flags имеет установленный бит XS_DYNAMIC_FILENAME, то вместо этого будет взята копия строки.

Другие аспекты подпрограммы будут оставлены в их состоянии по умолчанию. Если для корректной работы подпрограммы требуется что-либо ещё, вызывающая сторона несет ответственность за это после того, как функция её создаст. Однако будьте осторожны, так как подпрограмма потенциально может быть уничтожена до возврата этой функции, как описано ниже.

Если name равно null, то подпрограмма будет анонимной, и её CvGV будет ссылаться на __ANON__ глоб. Если name не равно null, то подпрограмма будет названа соответствующим образом, ссылаться на соответствующий глоб. name — это строка длиной len байт, задающая имя символа без сигнатуры, в UTF-8, если flags имеет установленный бит SVf_UTF8, и в Latin-1 в противном случае. Имя может быть квалифицированным или неквалифицированным, со стандартным хранилищем (stash), выбранным так же, как для gv_fetchpvn_flags. flags может содержать флаги, понимаемые gv_fetchpvn_flags, со значением, аналогичным тому, которое у них есть там, например GV_ADDWARN. Символ всегда добавляется в хранилище (stash), если необходимо, с семантикой GV_ADDMULTI.

Если уже существует подпрограмма с указанным именем, то новая подпрограмма заменит существующую в глобе. Может быть сгенерировано предупреждение о переопределении. Если старая подпрограмма была CvCONST, то решение о том, предупреждать или нет, зависит от ожиданий того, станет ли новая подпрограмма константой с подобным значением. Это ожидание определяется const_svp. (Обратите внимание, что вызов этой функции не делает новую подпрограмму CvCONST в любом случае; это оставлено вызывающей стороне.) Если const_svp равно null, это означает, что новая подпрограмма не станет константой. Если const_svp не равно null, это означает, что новая подпрограмма станет константой, и она указывает на SV*, который предоставляет константное значение, которым будет обладать подпрограмма.

Если подпрограмма имеет одно из нескольких специальных имён, таких как BEGIN или END, то она будет взята соответствующим очереди для автоматического выполнения подпрограмм, связанных с фазами. В этом случае соответствующий глоб останется пустым, даже если он содержал подпрограмму ранее. В случае BEGIN, подпрограмма будет выполнена, и ссылка на неё будет удалена до возврата этой функции, а также до установки её прототипа. Если подпрограмма BEGIN не будет достаточно сконструирована этой функцией для готовности к выполнению, то вызывающая сторона должна предотвратить это, дав подпрограмме другое имя.

Функция возвращает указатель на созданную подпрограмму. Если подпрограмма анонимная, то владение одной ссылкой со счётом на подпрограмму передаётся вызывающей стороне. Если подпрограмма имеет имя, то вызывающая сторона не получает владения ссылкой. В большинстве таких случаев, когда подпрограмма имеет имя, отличное от имени фазы, подпрограмма будет существовать в момент возврата благодаря тому, что она содержится в глобе, который её называет. Подпрограмма с именем фазы обычно существует благодаря ссылке, принадлежащей очереди автоматического выполнения фазы. Но подпрограмма BEGIN, уже выполненная, с большой вероятностью будет уничтожена к моменту возврата этой функции, что сделает ошибочным использование вызывающей стороной возвращённого указателя. Вызывающая сторона несёт ответственность за то, чтобы знать, какой из этих случаев имеет место.

CV *    newXS_len_flags(const char *name, STRLEN len,
                        XSUBADDR_t subaddr,
                        const char *const filename,
                        const char *const proto,
                        SV **const_svp, U32 flags)
optimize_optree

Эта функция применяет некоторые оптимизации к дереву optree в порядке сверху вниз. Она вызывается перед оптимизатором peephole, который обрабатывает операторы в порядке выполнения. Обратите внимание, что finalize_optree() также выполняет поиск сверху вниз, но вызывается *после* оптимизатора peephole.

void    optimize_optree(OP* o)
traverse_op_tree

Возвращает следующий оператор в обходе дерева операторов в глубину, возвращая NULL, когда обход завершён.

Первый вызов должен передать корень дерева как top, так и o.

Пока что это статическая функция, но в будущем она может быть доступна в API.

traverse_op_tree;

Структуры данных падов

CX_CURPAD_SAVE

Сохранить текущий блок в заданной структуре контекста.

void    CX_CURPAD_SAVE(struct context)
CX_CURPAD_SV

Доступ к SV по смещению po в сохранённом текущем блоке в заданной структуре контекста (может использоваться как lvalue).

SV *    CX_CURPAD_SV(struct context, PADOFFSET po)
PAD_BASE_SV

Получить значение из слота po в базовом (DEPTH=1) блоке списка блоков.

SV *    PAD_BASE_SV(PADLIST padlist, PADOFFSET po)
PAD_CLONE_VARS

Клонировать переменные состояния, связанные с выполняемыми и компилируемыми блоками.

void    PAD_CLONE_VARS(PerlInterpreter *proto_perl,
                       CLONE_PARAMS* param)
PAD_COMPNAME_FLAGS

Возвращает флаги для текущего имени компилируемого блока по смещению po. Предполагается наличие действительной записи слота.

U32     PAD_COMPNAME_FLAGS(PADOFFSET po)
PAD_COMPNAME_GEN

Номер поколения имени по смещению po в текущем компилируемом блоке (lvalue).

STRLEN  PAD_COMPNAME_GEN(PADOFFSET po)
PAD_COMPNAME_GEN_set

Устанавливает номер поколения имени по смещению po в текущем блоке (lvalue) на значение gen. STRLEN PAD_COMPNAME_GEN_set(PADOFFSET po, int gen)

PAD_COMPNAME_OURSTASH

Возвращает стежок, связанный с переменной our. Предполагается, что запись слота является корректным лексическим элементом our.

HV *    PAD_COMPNAME_OURSTASH(PADOFFSET po)
PAD_COMPNAME_PV

Возвращает имя текущего компилируемого блока по смещению po. Предполагается наличие действительной записи слота.

char *  PAD_COMPNAME_PV(PADOFFSET po)
PAD_COMPNAME_TYPE

Возвращает тип (стежок) текущего имени компилируемого блока по смещению po. Должно быть действительное имя. Возвращает null, если тип не задан.

HV *    PAD_COMPNAME_TYPE(PADOFFSET po)
PadnameIsOUR

Является ли эта переменная "our"?

bool    PadnameIsOUR(PADNAME pn)
PadnameIsSTATE

Является ли эта переменная "state"?

bool    PadnameIsSTATE(PADNAME pn)
PadnameOURSTASH

Стежок, в котором была объявлена эта переменная "our".

HV *    PadnameOURSTASH()
PadnameOUTER

Принадлежит ли эта запись внешнему блоку. Записи, для которых это true, часто называются "поддельными".

bool    PadnameOUTER(PADNAME pn)
PadnameTYPE

Стежок, связанный с типизированным лексическим элементом. Возвращает хэш %Foo:: для my Foo $bar.

HV *    PadnameTYPE(PADNAME pn)
PAD_RESTORE_LOCAL

Восстановить старый блок, сохранённый в локальной переменной opad с помощью PAD_SAVE_LOCAL()

void    PAD_RESTORE_LOCAL(PAD *opad)
PAD_SAVE_LOCAL

Сохранить текущий блок в локальную переменную opad, затем установить текущий блок равным npad

void    PAD_SAVE_LOCAL(PAD *opad, PAD *npad)
PAD_SAVE_SETNULLPAD

Сохранить текущий блок, затем установить его в null.

void    PAD_SAVE_SETNULLPAD()
PAD_SETSV

Установить значение в слоте по смещению po в текущем блоке на sv

SV *    PAD_SETSV(PADOFFSET po, SV* sv)
PAD_SET_CUR

Установить текущий блок на блок n в списке блоков, сохраняя предыдущий текущий блок. Примечание: в настоящее время этот макрос расширяется до слишком длинной строки для некоторых компиляторов, поэтому лучше заменить его на

SAVECOMPPAD();
PAD_SET_CUR_NOSAVE(padlist,n);


    void    PAD_SET_CUR(PADLIST padlist, I32 n)
PAD_SET_CUR_NOSAVE

как PAD_SET_CUR, но без сохранения

void    PAD_SET_CUR_NOSAVE(PADLIST padlist, I32 n)
PAD_SV

Получить значение по смещению po в текущем блоке

SV *    PAD_SV(PADOFFSET po)
PAD_SVl

Легковесная и lvalue версия PAD_SV. Получить или установить значение по смещению po в текущем блоке. В отличие от PAD_SV, не выводит диагностику с -DX. Только для внутреннего использования.

SV *    PAD_SVl(PADOFFSET po)
SAVECLEARSV

Очистить значение указанного блока при выходе из области видимости. (т.е. действие в ходе выполнения my)

void    SAVECLEARSV(SV **svp)
SAVECOMPPAD

сохранить PL_comppad и PL_curpad

void    SAVECOMPPAD()
SAVEPADSV

Сохранить слот блока (используется для восстановления после итерации)

XXX DAPM было бы логичнее сделать аргумент PADOFFSET void SAVEPADSV(PADOFFSET po)

Переменные интерпретатора

PL_DBsingle

При запуске Perl в режиме отладки с ключом -d, эта переменная SV является булевой, указывающей, выполняется ли пошаговая отладка подпрограмм. Пошаговая отладка автоматически включается после каждого шага. Это C-переменная, соответствующая Perl-переменной $DB::single. См. "PL_DBsub".

SV *    PL_DBsingle
PL_DBsub

При запуске Perl в режиме отладки с ключом -d, эта переменная GV содержит SV, хранящий имя отлаживаемой подпрограммы. Это C-переменная, соответствующая Perl-переменной $DB::sub. См. "PL_DBsingle".

GV *    PL_DBsub
PL_DBtrace

Переменная отслеживания, используемая при запуске Perl в режиме отладки с ключом -d. Это C-переменная, соответствующая Perl-переменной $DB::trace. См. "PL_DBsingle".

SV *    PL_DBtrace
PL_dowarn

C-переменная, примерно соответствующая Perl-переменной $^W warning. Однако $^W обрабатывается как булево значение, тогда как PL_dowarn представляет собой набор флаговых битов.

U8      PL_dowarn
PL_last_in_gv

GV, который был последним использован для операции ввода из файла. (<FH>)

GV*     PL_last_in_gv
PL_ofsgv

Глобальная переменная, содержащая разделитель полей вывода - *, в пространстве Perl.

GV*     PL_ofsgv
PL_rs

Разделитель записей ввода - $/ в пространстве Perl.

SV*     PL_rs

Макросы управления стеком

djSP

Объявить только SP. Это фактически идентично dSP, и объявляет локальную копию указателя стека Perl, доступную через макрос SP. См. "SP" in perlapi. (Доступно для обратной совместимости с кодом старой модели потоков (Perl 5.005)).

djSP;
LVRET

True, если данный оператор будет результатом выполнения lvalue подпрограммы

Функции обработки SV

SV (или AV, HV и т. д.) выделяется из двух частей: заголовок (struct sv, av, hv...) содержит информацию о типе и счетчике ссылок, а для многих типов — указатель на тело (struct xrv, xpv, xpviv...), содержащее поля, специфичные для каждого типа. Некоторые типы хранят всю необходимую информацию в заголовке, поэтому у них нет тела.

Во всех, за исключением наиболее параноидальных с точки зрения памяти конфигураций (например: PURIFY), заголовки и тела выделяется в аренах, которые по умолчанию представляют собой примерно 4К кусков памяти, распределённых на N заголовков или тел. Тела SV выделяются по типу SV, гарантируя необходимую согласованность размера для безопасного выделения из массивов.

Для заголовков SV первый слот в каждой арене зарезервирован и содержит ссылку на следующую арену, некоторые флаги и примечание о количестве слотов. По цепочке каждой арены проходит связанный список свободных элементов; когда он становится пустым, выделяется дополнительная арена и делится на N элементов, которые вставляются в свободный список.

Тела SV аналогичны, но используют наборы арен по умолчанию, которые отделяют ссылку и информацию от самой арены и освобождают первый слот в арене. Тела SV описываются подробнее позже.

Следующие глобальные переменные связаны с аренами:

PL_sv_arenaroot     pointer to list of SV arenas
PL_sv_root          pointer to list of free SV structures

PL_body_arenas      head of linked-list of body arenas
PL_body_roots[]     array of pointers to list of free bodies of svtype
                    arrays are indexed by the svtype needed

Несколько специальных заголовков SV не выделяются из арены, а создаются непосредственно в структуре интерпретатора, например, PL_sv_undef. Размер арен можно изменить от значения по умолчанию, задав PERL_ARENA_SIZE соответствующим образом во время компиляции.

Арена SV служит дополнительной цели, позволяющей найти и уничтожить всё ещё живые SV во время окончательной очистки.

На самом низком уровне макросы new_SV() и del_SV() берут и освобождают заголовок SV. (Если отлаживать с -DD, del_SV() вызывает функцию S_del_sv() для возврата SV в список свободных элементов с проверкой ошибок.) new_SV() вызывает more_sv() / sv_add_arena(), чтобы добавить дополнительную арену, если свободный список пуст. У SV в свободном списке поле SvTYPE установлено во все единицы.

В момент очень поздней очистки функция sv_free_arenas() вызывается из perl_destruct() для физического освобождения всех арен, выделенных с момента запуска интерпретатора.

Функция visit() сканирует список арен SV и вызывает указанную функцию для каждого SV, который всё ещё жив — т. е. у которого поле SvTYPE отличное от всех единиц и поле SvREFCNT отлично от нуля. visit() используется следующими функциями (указано [функция, вызывающая visit()] / [функция, вызываемая visit() для каждого SV]):

sv_report_used() / do_report_used()
                    dump all remaining SVs (debugging aid)

sv_clean_objs() / do_clean_objs(),do_clean_named_objs(),
                  do_clean_named_io_objs(),do_curse()
                    Attempt to free all objects pointed to by RVs,
                    try to do the same for all objects indir-
                    ectly referenced by typeglobs too, and
                    then do a final sweep, cursing any
                    objects that remain.  Called once from
                    perl_destruct(), prior to calling sv_clean_all()
                    below.

sv_clean_all() / do_clean_all()
                    SvREFCNT_dec(sv) each remaining SV, possibly
                    triggering an sv_free(). It also sets the
                    SVf_BREAK flag on the SV to indicate that the
                    refcnt has been artificially lowered, and thus
                    stopping sv_free() from giving spurious warnings
                    about SVs which unexpectedly have a refcnt
                    of zero.  called repeatedly from perl_destruct()
                    until there are no SVs left.
sv_2num

ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.

Возвращает SV с числовым значением исходного SV, выполняя необходимые преобразования ссылок или перегрузки. Отправитель функции ожидает, что обработка get-magic уже выполнена.

SV*     sv_2num(SV *const sv)
sv_add_arena

Принимая кусок памяти, связывает его с началом списка аренов и разбивает его на список свободных SV.

void    sv_add_arena(char *const ptr, const U32 size,
                     const U32 flags)
sv_clean_all

Уменьшает refcnt каждого оставшегося SV, что может привести к очистке. Возможно, потребуется вызвать эту функцию несколько раз, чтобы освободить SV, находящиеся в сложных самоссылочных иерархиях.

I32     sv_clean_all()
sv_clean_objs

Попытка уничтожить все объекты, которые ещё не освобождены.

void    sv_clean_objs()
sv_free_arenas

Освобождает память, используемую всеми аренами. Обратите внимание, что все отдельные заголовки и тела SV внутри аренов должны быть уже освобождены.

void    sv_free_arenas()
SvTHINKFIRST

Быстрая проверка флага, чтобы увидеть, должен ли sv передаваться в sv_force_normal, чтобы быть «пониженным», прежде чем SvIVX или SvPVX можно будет изменить напрямую.

Например, если ваш скаляр — ссылка, и вы хотите изменить слот SvIVX, вы не можете просто сделать SvROK_off, так как это приведёт к утечке референта.

Это используется внутренне различными функциями модификации sv, такими как sv_setsv, sv_setiv и sv_pvn_force.

Один случай, который эта функция не обрабатывает, — gv без установленного SvFAKE. После

if (SvTHINKFIRST(gv)) sv_force_normal(gv);

он всё ещё будет gv.

SvTHINKFIRST иногда даёт ложноположительные результаты. В таких случаях sv_force_normal ничего не делает.

U32     SvTHINKFIRST(SV *sv)

Поддержка Unicode

find_uninit_var

ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.

Находит имя неопределённой переменной (если таковая имеется), которая вызвала предупреждение оператора "Использование неопределённого значения". Если match истинно, возвращает имя только в случае совпадения его значения с uninit_sv. Грубо говоря, если унарный оператор (например, OP_COS) генерирует предупреждение, то проследив за непосредственным потомком op, можно получить OP_PADSV или OP_GV, которые указывают имя неопределённой переменной. С другой стороны, для OP_ADD есть два пути следования, поэтому мы выводим имя переменной только в случае точного совпадения. desc_p указывает на указатель строки, содержащий описание оператора. Он может быть обновлён при необходимости.

Имя возвращается в виде смертного SV.

Предполагается, что PL_op — это OP, который изначально вызвал ошибку, а PL_comppad/PL_curpad указывают на текущий выполняемый блок.

SV*     find_uninit_var(const OP *const obase,
                        const SV *const uninit_sv,
                        bool match, const char **desc_p)
isSCRIPT_RUN

Возвращает булево значение о том, образуют ли последовательность байтов от s до, но не включая send, "выполнение сценария". utf8_target ИСТИННО тогда и только тогда, когда последовательность, начинающаяся в s, должна обрабатываться как UTF-8. Точнее, за исключением двух вырожденных случаев, данная функция возвращает ИСТИННО тогда и только тогда, когда все кодовые точки в ней происходят от любого сочетания трёх «скриптов», заданных свойством Unicode "Script Extensions": Общие, Наследованные и, возможно, ещё один. Кроме того, все десятичные цифры должны происходить из одной последовательной группы из 10.

Например, если все символы в последовательности являются греческими, или общими, или наследованными, эта функция вернёт ИСТИННО, при условии, что все десятичные цифры в ней относятся к одной группе цифр в Общих (это ASCII-цифры "0".."9" и, дополнительно, группа для полных ширины форм этих цифр, а также несколько других, используемых в математической нотации). Для скриптов (в отличие от греческого), имеющих свои собственные наборы цифр, это примет либо цифры из этого набора, либо из одного из наборов общих цифр, но не их комбинацию. Некоторые скрипты, такие как арабский, имеют более одного набора цифр. Все цифры должны принадлежать одному набору, чтобы функция возвращала ИСТИННО.

*ret_script, если ret_script не NULL, то при возвращении ИСТИННО, будет содержать обнаруженный скрипт, используя тип SCX_enum. Его значение будет SCX_INVALID, если функция возвращает ЛОЖЬ.

Если последовательность пуста, возвращается ИСТИННО, но *ret_script (если запрошен) будет SCX_INVALID.

Если последовательность содержит одну кодовую точку, которая не назначена символу в используемой версии Unicode, функция вернёт ИСТИННО, и скрипт будет SCX_Unknown. Любая другая комбинация неназначенных кодовых точек в входной последовательности приведет к тому, что функция будет рассматривать входные данные как не являющиеся выполнением сценария.

Возвращаемый скрипт будет SCX_Inherited только если все кодовые точки в нём взяты из наследуемого скрипта.

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

bool    isSCRIPT_RUN(const U8 *s, const U8 *send,
                     const bool utf8_target)
is_utf8_non_invariant_string

Возвращает ИСТИННО, если "is_utf8_invariant_string" в perlapi возвращает ЛОЖЬ для первых len байтов строки s, но они, тем не менее, являются допустимыми Perl-расширенными UTF-8; в противном случае возвращает ЛОЖЬ.

Возвращаемое значение ИСТИННО означает, что по крайней мере одна кодовая точка, представленная последовательностью, либо является широким символом, не представимым одним байтом, либо её представление отличается в зависимости от того, закодирована ли последовательность в UTF-8 или нет.

См. также "is_utf8_invariant_string" in perlapi, "is_utf8_string" in perlapi

bool    is_utf8_non_invariant_string(const U8* const s,
                                     STRLEN len)
report_uninit

Выводит соответствующее предупреждение "Использование неопределённой переменной".

void    report_uninit(const SV *uninit_sv)
variant_under_utf8_count

Эта функция анализирует последовательность байтов между s и e, которые предполагаются закодированными в ASCII/Latin1, и возвращает, сколько из них изменится, если строка будет преобразована в UTF-8. Из-за особенностей UTF-8 каждый из них будет занимать два байта вместо одного в входной строке. Таким образом, эта функция возвращает точное количество байтов, на которое строка увеличится при переводе в UTF-8.

В отличие от большинства других функций, содержащих utf8 в своём имени, входной параметр этой функции НЕ является UTF-8-строкой. Имя функции немного *необычно*, чтобы подчеркнуть это.

Эта функция является внутренней для Perl, потому что khw считает, что любой XS-код, которому это потребуется, вероятно, работает слишком близко к внутренностям. Представление действительного примера использования может это изменить.

См. также "is_utf8_invariant_string" in perlapi и "is_utf8_invariant_string_loc" in perlapi,

Size_t  variant_under_utf8_count(const U8* const s,
                                 const U8* const e)

Недокументированные функции

Следующие функции в настоящее время не документированы. Если вы используете одну из них, вы можете рассмотреть возможность создания и отправки документации к ней.

PerlIO_восстановить_errno
PerlIO_сохранить_errno
PerlLIO_dup2_cloexec
PerlLIO_dup_cloexec
PerlLIO_open3_cloexec
PerlLIO_open_cloexec
PerlProc_pipe_cloexec
PerlSock_accept_cloexec
PerlSock_socket_cloexec
PerlSock_socketpair_cloexec
Slab_Выделить
Slab_Освободить
Slab_в_только_для_чтения
Slab_в_чтение_запись
_добавить_диапазон_в_invlist
_байтовый_вывод_строки
_получить_данные_класса_регистра_без_битовой_карты
_обратные_сложения
_invlistEQ
_инициализация_массива_invlist
_invlist_содержит_символ
_вывод_invlist
_пересечение_invlist
_пересечение_invlist_возможно_дополнение_второго
_инвертирование_invlist
_длина_invlist
_поиск_в_invlist
_вычитание_из_invlist
_объединение_invlist
_объединение_invlist_возможно_дополнение_второго
_является_графическим_символом
_принадлежит_категории_локалей
_mem_collxfrm
_новый_invlist
_новый_invlist_C_массив
_настройка_готового_invlist
_преобразовать_в_сложенные_latin1
_преобразовать_в_заглавные_с_заглавной_буквы_latin1
_предупреждение_о_проблемной_локали
прервать_выполнение
добавить_символ_в_invlist
выделить_LOGOP
выделить_my
amagic_активирован
дополнить_utf8_из_нативного_байта
применить
av_расширить_внутренности
av_нет_элемента
av_реализовать
привязать_сопоставление
загрузка_ядра_PerlIO
загрузка_ядра_UNIVERSAL
загрузка_ядра_mro
можно
проверить_печать_utf8
ck_анонимный_код
ck_обратные_кавычки
ck_битовая_операция
ck_сравнение
ck_конкатенация
ck_определено
ck_удалить
ck_каждый
ck_аргументы_вхождения_в_подпрограмму_ядро
ck_конец_файла
ck_вычисление
ck_выполнение
ck_существует
ck_ftst
ck_функция
ck_глоб
ck_grep
ck_индекс
ck_соединить
ck_длина
ck_lfun
ck_список_ввода_вывода
ck_сопоставление
ck_метод
ck_нуль
ck_открыть
ck_прототип
ck_строка_из_строки
ck_присвоение_ссылки
ck_повторить
ck_требуется
ck_возврат
ck_rfun
ck_rvconst
ck_присвоение_скаляру
ck_выбрать
ck_сдвинуть
ck_умное_сопоставление
ck_сортировать
ck_пара
ck_разбить
ck_преобразовать_в_строку
ck_подпрограмма
ck_подстрока
ck_svconst
ck_tell
ck_обрезать
самый_близкий_cop
вычислить_приблизительно
операция_встроенной_подпрограммы
создать_область_вычислений
croak_вызывающий
croak_нет_памяти
croak_вытащить_из_стека
текущий_двигатель_регулярных_выражений
пользовательская_операция_получить_поле
cv_ckproto_длина_флаги
cv_клонировать_в
cv_постоянная_sv_или_av
cv_флаги_неопределения
cvgv_из_hek
cvgv_установить
cvstash_установить
deb_стек_все
defelem_цель
удалить_область_вычислений
delimcpy_без_экранирования
die_разворот
выполнить_aexec
выполнить_aexec5
выполнить_eof
выполнить_exec
выполнить_exec3
выполнить_ipcctl
выполнить_ipcget
выполнить_msgrcv
выполнить_msgsnd
выполнить_ncmp
выполнить_open6
выполнить_open_raw
выполнить_печать
выполнить_строку_из_строки
выполнить_переход
выполнить_semop
выполнить_shmio
выполнить_sysseek
выполнить_tell
выполнить_трансформацию
выполнить_vecget
выполнить_vecset
выполнить_vop
переполнение_utf8
выполнить_файл
drand48_инициализировать_r
drand48_r
dtrace_отлавливание_вызова
dtrace_отлавливание_загрузки
dtrace_отлавливание_операции
dtrace_отлавливание_фазы
вывести_все_perl
вывести_пакетные_подпрограммы_perl
вывести_подпрограмму_perl
вывести_потомка_sv
дублировать_предупреждения
эмулировать_cop_ввод_вывод
функция_активирована
найти_лексическую_cv
найти_выполняемую_cv_где
найти_скрипт
foldEQ_latin1_s2_сложенный
формат_короткий_восьмеричный_предупреждение
освободить_связанный_пул_hv
получить_и_проверить_backslash_N_имя
получить_db_подпрограмму
получить_дебажные_опции
получить_семя_хеша
получить_адрес_итератора_invlist
получить_адрес_смещения_invlist
получить_адрес_предыдущего_индекса_invlist
получить_не_изменять
получить_аргументы_оператора
получить_аргумент_ре
getenv_длина
обработать_bslash_c
обработать_bslash_o
обработать_bslash_x
gv_fetchmeth_внутренний
gv_переопределить
gv_установить_ссылку
gv_stashpvn_внутренний
gv_stashsvpvn_кешированный
обработать_именованную_обратную_ссылку
обработать_пользовательское_определяемое_свойство
hfree_следующая_запись
hv_обратные_ссылки_p
hv_убить_обратные_ссылки
hv_заполнитель_p
hv_добавить_ключ_значение
hv_флаги_неопределения
инициализировать_символы_argv
инициализировать_константы
инициализировать_dbargs
инициализировать_отладчик
инициализировать_именованную_cv
инициализировать_uniprops
инвертировать
invlist_массив
invlist_очистить
invlist_клонировать
invlist_наибольший
invlist_итерация
invlist_завершить_итерацию
invlist_инициализация_итерации
invlist_максимум
invlist_предыдущий_индекс
invlist_установить_длину
invlist_установить_предыдущий_индекс
invlist_укоротить
io_закрыть
isFF_OVERLONG
isFOO_lc
является_invlist
is_utf8_обычный
is_utf8_обычный_с_длиной
is_utf8_слишком_длинный_для_данного_стартового_байта_в_порядке
isinfnansv
jmaybe
ключевое_слово
ключевое_слово_стандартный_плагин
список
локализовать
магия_очистить_все_переменные_среды
магия_очистить_arylen_p
магия_очистить_среду
магия_очистить_isa
магия_очистить_упаковку
магия_очистить_сигнал
магия_скопировать_callchecker
магия_существует_упаковка
магия_освободить_arylen_p
магия_освободить_переопределения
магия_получить
магия_получить_arylen
магия_получить_дебажную_переменную
магия_получить_defelem
магия_получить_nkeys
магия_получить_упаковку
магия_получить_положение
магия_получить_сигнал
магия_получить_подстроку
магия_получить_загрязнение
магия_получить_uvar
магия_получить_vec
магия_убить_обратные_ссылки
магия_следующая_упаковка
магия_regdata_счет
магия_regdatum_получить
магия_regdatum_установить
магия_скалярная_упаковка
магия_установить
магия_установить_все_переменные_среды
магия_установить_arylen
магия_установить_collxfrm
магия_установить_dbline
магия_установить_дебажную_переменную
магия_установить_defelem
магия_установить_переменную_среды
магия_установить_isa
магия_установить_lvref
магия_установить_mglob
магия_установить_nkeys
магия_установить_nonelem
магия_установить_упаковку
магия_установить_положение
END_OF_DOCUMENT_MARKER
magic_setregexp
magic_setsig
magic_setsubstr
magic_settaint
magic_setutf8
magic_setuvar
magic_setvec
magic_sizepack
magic_wipepack
malloc_good_size
malloced_size
mem_collxfrm
mem_log_alloc
mem_log_free
mem_log_realloc
mg_find_mglob
mode_from_discipline
more_bodies
mro_meta_dup
mro_meta_init
multiconcat_stringify
multideref_stringify
my_attrs
my_clearenv
my_lstat_flags
my_memrchr
my_mkostemp
my_mkstemp
my_mkstemp_cloexec
my_stat_flags
my_strerror
my_unexec
newGP
newMETHOP_internal
newSTUB
newSVavdefelem
newXS_deffile
new_warnings_bitfield
nextargv
noperl_die
notify_parser_that_changed_to_utf8
oopsAV
oopsHV
op_clear
op_integerize
op_lvalue_flags
op_refcnt_dec
op_refcnt_inc
op_relocate_sv
op_std_init
op_unscope
opmethod_stash
opslab_force_free
opslab_free
opslab_free_nopad
package
package_version
pad_add_weakref
padlist_store
padname_free
padnamelist_free
parse_unicode_opts
parse_uniprop_string
parser_free
parser_free_nexttoke_ops
path_is_searchable
peep
pmruntime
populate_isa
ptr_hash
qerror
re_exec_indentf
re_indentf
re_op_compile
re_printf
reg_named_buff
reg_named_buff_iter
reg_numbered_buff_fetch
reg_numbered_buff_length
reg_numbered_buff_store
reg_qr_package
reg_skipcomment
reg_temp_copy
regcurly
regprop
report_evil_fh
report_redefined_cv
report_wrongway_fh
rpeep
rsignal_restore
rsignal_save
rxres_save
same_dirent
save_strlen
save_to_buffer
sawparens
scalar
scalarvoid
scan_str
scan_word
set_caret_X
set_numeric_standard
set_numeric_underlying
set_padlist
setfd_cloexec
setfd_cloexec_for_nonsysfd
setfd_cloexec_or_inhexec_by_sysfdness
setfd_inhexec
setfd_inhexec_for_sysfd
should_warn_nl
sighandler
skipspace_flags
softref2xv
ssc_add_range
ssc_clear_locale
ssc_cp_and
ssc_intersection
ssc_union
sub_crush_depth
sv_add_backref
sv_buf_to_ro
sv_del_backref
sv_free2
sv_kill_backrefs
sv_len_utf8_nomg
sv_magicext_mglob
sv_mortalcopy_flags
sv_only_taint_gmagic
sv_or_pv_pos_u2b
sv_resetpvn
sv_sethek
sv_setsv_cow
sv_unglob
swash_fetch
swash_init
tied_method
tmps_grow_p
translate_substr_offsets
try_amagic_bin
try_amagic_un
uiv_2buf
unshare_hek
utf16_to_utf8
utf16_to_utf8_reversed
utilize
varname
vivify_defelem
vivify_ref
wait4pid
was_lvalue_sub
watch
win32_croak_not_implemented
write_to_stderr
xs_boot_epilog
xs_handshake
yyerror
yyerror_pv
yyerror_pvn
yylex
yyparse
yyquit
yyunlex

Авторы

Система автоматической документации была первоначально добавлена в ядро Perl Бенджамином Штулем. Документация написана теми, кто любезно задокументировал свои функции.

См. также

perlguts, perlapi

© 1993–2020 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.30.3/perlintern

Spec-Zone.ru

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