Spec-Zone.ru › Perl 5.32

perlintern

СОДЕРЖАНИЕ

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

ИМЯ

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

ОПИСАНИЕ

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

Функции манипулирования массивами

AvFILLp
int     AvFILLp(AV* av)

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

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 используется для отлова die внутренним 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(const 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 истинно, вывести соответствующие предупреждения. Переменные out_* возвращают значения и являются указателями на место хранения возвращаемых значений. out_capture, если не нулевой, запрашивает захват внутреннего экземпляра лексического элемента; 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 для лексических элементов в этой области видимости и предупредить о лексических элементах, которые так и не были введены.

OP *    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)

Errno

dSAVEDERRNO

Объявить переменные, необходимые для сохранения errno и любого операционной системы-специфического кода ошибки.

void    dSAVEDERRNO
dSAVE_ERRNO

Объявить переменные, необходимые для сохранения errno и любого операционной системы-специфического кода ошибки, и сохранить их для необязательного последующего восстановления функцией RESTORE_ERRNO.

void    dSAVE_ERRNO
RESTORE_ERRNO

Восстановить errno и любой операционной системы-специфический код ошибки, сохраненный функциями dSAVE_ERRNO или RESTORE_ERRNO.

void    RESTORE_ERRNO
SAVE_ERRNO

Сохранить errno и любой операционной системы-специфический код ошибки для необязательного последующего восстановления функцией RESTORE_ERRNO. Требует наличия в области видимости dSAVEDERRNO или dSAVE_ERRNO.

void    SAVE_ERRNO
SETERRNO

Установить errno, и на VMS установить vaxc$errno.

void    SETERRNO(int errcode, int vmserrcode)

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, "key",
            U32 flags
        )
refcounted_he_fetch_sv

Аналогично "refcounted_he_fetch_pvn", но принимает скаляр Perl вместо пары "строка/длина".

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 может быть либо нулём, либо &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,
                           "key", SV *value, U32 flags
                       )
refcounted_he_new_sv

Аналогично "refcounted_he_new_pvn", но принимает скаляр Perl вместо пары "строка/длина".

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

Функции Ввода-Вывода

start_glob

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

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

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

PerlIO* Perl_start_glob(pTHX_ SV *tmpglob, IO *io)

Интерфейс лексического анализатора

validate_proto

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

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

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

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

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 в случае ошибки.

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

SV*     Perl_magic_methcall(pTHX_ 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 ложно, то никакие магические установки не будут вызваны для нового (пустого) 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)
quadmath_format_needed

quadmath_format_needed() возвращает true, если строка format кажется содержащей по крайней мере один спецификатор формата %[efgaEFGA] без префикса Q, или false в противном случае.

Обнаружение спецификаторов формата не является полным обнаружением синтаксиса printf, но оно должно обнаружить большинство распространённых случаев.

Если возвращается true, эти аргументы должны теоретически обрабатываться с помощью quadmath_snprintf(), но в случае, если имеется более одного такого спецификатора формата (см. "quadmath_format_valid"), и если есть что-либо ещё помимо этого одного (даже просто один байт), они не могут быть обработаны, потому что quadmath_snprintf() очень строг, принимая только один спецификатор формата и ничего более. В этом случае код, вероятно, должен завершиться ошибкой.

bool    quadmath_format_needed(const char* format)
quadmath_format_valid

quadmath_snprintf() очень строг в отношении строки format и завершится ошибкой, вернув -1, если формат неверен. Он принимает ровно один спецификатор формата.

quadmath_format_valid() проверяет, что предполагаемый одиночный спецификатор выглядит разумно: начинается с %, содержит только один %, заканчивается [efgaEFGA], и имеет Q перед ним. Это не полная "проверка синтаксиса printf", а только основы.

Возвращает true, если формат корректен, false — если нет.

См. также "quadmath_format_needed".

bool    quadmath_format_valid(const char* format)

Функции MRO

mro_get_linear_isa_dfs

Возвращает линейную сериализацию поиска в глубину @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. *endptr не изменяется от входного значения, если возвращается FALSE;

Единственные допустимые символы — десятичные цифры '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)
isinfnansv

Проверяет, будет ли аргумент бесконечностью или NaN при использовании как число, но осторожно, не вызывая предупреждений о нечисловых или неинициализированных значениях. Предполагается, что вызывающий код уже выполнил SvGETMAGIC(sv).

bool    isinfnansv(SV *sv)

Функции устаревшей обратной совместимости

utf8n_to_uvuni

УСТАРЕВШАЯ! Планируется удалить эту функцию из будущей версии Perl. Не используйте её в новом коде; удалите её из существующего кода.

Вместо этого используйте "utf8_to_uvchr_buf" в perlapi, или в редких случаях, "utf8n_to_uvchr" в perlapi.

Эта функция была полезна для кода, который хотел обрабатывать как EBCDIC, так и ASCII платформы с свойствами Unicode, но начиная с Perl v5.20, различия между платформами в основном скрыты от большинства кода, поэтому эта функция вряд ли вам понадобится. Если вам нужна именно эта функциональность, используйте вместо этого NATIVE_TO_UNI(utf8_to_uvchr_buf(...)) или NATIVE_TO_UNI(utf8n_to_uvchr(...)).

UV      utf8n_to_uvuni(const U8 *s, STRLEN curlen,
                       STRLEN *retlen, U32 flags)
utf8_to_uvuni

УСТАРЕВШАЯ! Планируется удалить эту функцию из будущей версии Perl. Не используйте её в новом коде; удалите её из существующего кода.

Возвращает код Unicode первого символа в строке s, которая предполагается в кодировке UTF-8; retlen будет установлено на длину этого символа в байтах.

Некоторые, но не все, нарушения UTF-8 обнаруживаются, и, фактически, некоторые некорректные входные данные могут привести к чтению за пределами буфера входных данных, что является одной из причин устаревания этой функции. Другая причина в том, что только в очень ограниченных обстоятельствах вам может быть интересно различие между кодом Unicode и кодом исходной платформы. Обратитесь к "utf8_to_uvuni_buf" для альтернатив.

Если s указывает на одно из обнаруженных нарушений, и предупреждения UTF8 включены, возвращается ноль, а *retlen устанавливается (если retlen не указывает на NULL) в -1. Если эти предупреждения выключены, вычисленное значение (или ЗАМЕЩАЮЩИЙ СИМВОЛ Unicode, если нет) возвращается безмолвно, и *retlen устанавливается (если retlen не NULL), так что (s + *retlen) — это следующая возможная позиция в s, которая может начинать неиспорченный символ. См. "utf8n_to_uvchr" в perlapi для подробностей о том, когда возвращается ЗАМЕЩАЮЩИЙ СИМВОЛ.

UV      utf8_to_uvuni(const U8 *s, STRLEN *retlen)
uvuni_to_utf8_flags

УСТАРЕВШАЯ! Планируется удалить эту функцию из будущей версии Perl. Не используйте её в новом коде; удалите её из существующего кода.

Вместо этого, почти наверняка, вам понадобится использовать "uvchr_to_utf8" в perlapi или "uvchr_to_utf8_flags" в perlapi.

Эта функция — устаревшая синоним для "uvoffuni_to_utf8_flags", которая сама по себе, хотя и не устаревшая, должна использоваться только в особых случаях. Эти функции были полезны для кода, который хотел обрабатывать как EBCDIC, так и ASCII платформы с свойствами Unicode, но начиная с Perl v5.20, различия между платформами в основном скрыты от большинства кода, поэтому эта функция вряд ли вам понадобится.

U8*     uvuni_to_utf8_flags(U8 *d, UV uv, UV flags)

Функции манипулирования 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, который будет потреблён этой функцией, а его строковое значение предоставляет имя подпрограммы. Имя может быть квалифицированным или неквалифицированным, и если оно неквалифицированное, то будет выбран по умолчанию некоторый стэк. Если 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 в противном случае. Имя может быть квалифицированным или неквалифицированным, со стэком по умолчанию, аналогичным gv_fetchpvn_flags. flags может содержать флаги, понятные gv_fetchpvn_flags, с тем же значением, что и там, например, GV_ADDWARN. Символ всегда добавляется в стэк при необходимости, с семантикой 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

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

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

На данный момент он статический, но в будущем может быть доступен в API.

OP*     traverse_op_tree(OP* top, OP* o)

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

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. Однако $^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

SVt_INVLIST

Флаг типа для скаляров. См. "svtype" в perlapi.

Функции-обработки-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

Это различные вспомогательные функции для работы со строками, закодированными в UTF-8. Для неосведомленных, это способ представления произвольных символов Юникода с использованием переменного числа байтов, таким образом, что символы диапазона ASCII не изменяются, а нулевой байт никогда не появляется внутри ненулевых символов.

find_uninit_var

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

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

Имя возвращается как смертный SV.

Предполагается, что PL_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»: Common, Inherited и, возможно, ещё одного. Кроме того, все десятичные цифры должны происходить из одной последовательной группы из 10.

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

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

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

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

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

В противном случае возвращаемый скрипт будет SCX_Common тогда и только тогда, когда все кодовые точки в нём принадлежат скриптам Inherited или 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, но они всё же являются допустимыми расширенными UTF-8 в Perl; в противном случае возвращает ЛОЖЬ.

Возвращаемое значение ИСТИНА означает, что, по крайней мере, одна кодовая точка, представленная последовательностью, либо является широким символом, не представимым одним байтом, либо её представление различается в зависимости от того, закодирована ли последовательность в 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)
utf8_to_uvuni_buf

УСТАРЕВШАЯ функция! Планируется удалить эту функцию из будущих релизов Perl. Не используйте её в новом коде; удалите её из существующего кода.

Только в очень редких случаях код должен иметь дело с кодовыми точками Юникода (в отличие от исходных). В этих редких случаях используйте NATIVE_TO_UNI(utf8_to_uvchr_buf(...)) вместо этого. Если вы не уверены, что это один из таких случаев, предположите, что это не так, и используйте обычное utf8_to_uvchr_buf.

Возвращает кодовую точку Юникода (не исходную) первого символа в строке s, которая предполагается закодированной в UTF-8; send указывает на позицию на 1 символ дальше конца s. retlen будет установлено в длину этого символа в байтах.

Если s не указывает на правильно сформированный символ UTF-8 и предупреждения UTF8 включены, возвращается ноль, и *retlen устанавливается (если retlen не NULL) в -1. Если эти предупреждения выключены, вычисленное значение, если оно определено (или символ ЗАМЕЩЕНИЯ Юникода, если нет), возвращается безмолвно, и *retlen устанавливается (если retlen не NULL), чтобы (s + *retlen) была следующей возможной позицией в s, которая могла бы начинать неиспорченный символ. См. "utf8n_to_uvchr" в perlapi для деталей о том, когда возвращается символ ЗАМЕЩЕНИЯ.

UV      utf8_to_uvuni_buf(const U8 *s, const U8 *send,
                          STRLEN *retlen)
uvoffuni_to_utf8_flags

ЭТУ ФУНКЦИЮ СЛЕДУЕТ ИСПОЛЬЗОВАТЬ ТОЛЬКО В ОЧЕНЬ СПЕЦИАЛИЗИРОВАННЫХ СЛУЧАЯХ. Вместо этого почти весь код должен использовать "uvchr_to_utf8" в perlapi или "uvchr_to_utf8_flags" в perlapi.

Эта функция похожа на них, но вход — строгая кодовая точка Юникода (в отличие от исходной). Только в очень редких случаях код не должен использовать исходную кодовую точку.

Для деталей см. описание для "uvchr_to_utf8_flags" в perlapi.

U8*     uvoffuni_to_utf8_flags(U8 *d, UV uv,
                               const UV flags)
valid_utf8_to_uvchr

Подобно "utf8_to_uvchr_buf" in perlapi, но должна вызываться только тогда, когда известно, что следующий символ в входной строке UTF-8 s правильно сформирован (например, он проходит "isUTF8_CHAR" in perlapi. Поддерживаются суррогаты, кодовые точки, не являющиеся символами, и кодовые точки, не являющиеся Unicode.

UV      valid_utf8_to_uvchr(const U8 *s, STRLEN *retlen)
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)

Неописанные функции

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

ASCII_TO_NEED
NATIVE_TO_NEED
POPMARK
PadnameIN_SCOPE
PerlIO_restore_errno
PerlIO_save_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
ReANY
Slab_Alloc
Slab_Free
Slab_to_ro
Slab_to_rw
TOPMARK
_add_range_to_invlist
_byte_dump_string
_force_out_malformed_utf8_message
_inverse_folds
_invlistEQ
_invlist_array_init
_invlist_contains_cp
_invlist_dump
_invlist_intersection
_invlist_intersection_maybe_complement_2nd
_invlist_invert
_invlist_len
_invlist_search
_invlist_subtract
_invlist_union
_invlist_union_maybe_complement_2nd
_is_cur_LC_category_utf8
_is_in_locale_category
_is_uni_FOO
_is_uni_perl_idcont
_is_uni_perl_idstart
_is_utf8_FOO
_is_utf8_perl_idcont
_is_utf8_perl_idstart
_mem_collxfrm
_new_invlist
_new_invlist_C_array
_setup_canned_invlist
_to_fold_latin1
_to_uni_fold_flags
_to_upper_title_latin1
_to_utf8_fold_flags
_to_utf8_lower_flags
_to_utf8_title_flags
_to_utf8_upper_flags
_utf8n_to_uvchr_msgs_helper
_warn_problematic_locale
abort_execution
add_cp_to_invlist
alloc_LOGOP
allocmy
amagic_cmp
amagic_cmp_desc
amagic_cmp_locale
amagic_cmp_locale_desc
amagic_i_ncmp
amagic_i_ncmp_desc
amagic_is_enabled
amagic_ncmp
amagic_ncmp_desc
append_utf8_from_native_byte
apply
av_extend_guts
av_nonelem
av_reify
bind_match
boot_core_PerlIO
boot_core_UNIVERSAL
boot_core_mro
cando
check_utf8_print
ck_anoncode
ck_backtick
ck_bitop
ck_cmp
ck_concat
ck_defined
ck_delete
ck_each
ck_entersub_args_core
ck_eof
ck_eval
ck_exec
ck_exists
ck_ftst
ck_fun
ck_glob
ck_grep
ck_index
ck_isa
ck_join
ck_length
ck_lfun
ck_listiob
ck_match
ck_method
ck_null
ck_open
ck_prototype
ck_readline
ck_refassign
ck_repeat
ck_require
ck_return
ck_rfun
ck_rvconst
ck_sassign
ck_select
ck_shift
ck_smartmatch
ck_sort
ck_spair
ck_split
ck_stringify
ck_subr
ck_substr
ck_svconst
ck_tell
ck_trunc
closest_cop
cmp_desc
cmp_locale_desc
cmpchain_extend
cmpchain_finish
cmpchain_start
cntrl_to_mnemonic
coresub_op
create_eval_scope
croak_caller
croak_memory_wrap
croak_no_mem
croak_popstack
current_re_engine
custom_op_get_field
cv_ckproto_len_flags
cv_clone_into
cv_const_sv_or_av
cv_undef_flags
cvgv_from_hek
cvgv_set
cvstash_set
deb_stack_all
defelem_target
delete_eval_scope
delimcpy_no_escape
die_unwind
do_aexec
do_aexec5
do_eof
do_exec
do_exec3
do_ipcctl
do_ipcget
do_msgrcv
do_msgsnd
do_ncmp
do_open6
do_open_raw
do_print
do_readline
do_seek
do_semop
do_shmio
do_sysseek
do_tell
do_trans
do_uniprop_match
do_vecget
do_vecset
do_vop
does_utf8_overflow
dofile
drand48_init_r
drand48_r
dtrace_probe_call
dtrace_probe_load
dtrace_probe_op
dtrace_probe_phase
dump_all_perl
dump_packsubs_perl
dump_sub_perl
dump_sv_child
dup_warnings
emulate_cop_io
find_first_differing_byte_pos
find_lexical_cv
find_runcv_where
find_script
foldEQ_latin1_s2_folded
foldEQ_utf8_flags
form_alien_digit_msg
form_cp_too_large_msg
free_tied_hv_pool
get_and_check_backslash_N_name
get_db_sub
get_debug_opts
get_deprecated_property_msg
get_hash_seed
get_invlist_iter_addr
get_invlist_offset_addr
get_invlist_previous_index_addr
get_no_modify
get_opargs
get_prop_definition
get_prop_values
get_re_arg
get_re_gclass_nonbitmap_data
get_regclass_nonbitmap_data
get_regex_charset_name
getenv_len
grok_bin_oct_hex
grok_bslash_c
grok_bslash_o
grok_bslash_x
gv_fetchmeth_internal
gv_override
gv_setref
gv_stashpvn_internal
gv_stashsvpvn_cached
hfree_next_entry
hv_backreferences_p
hv_kill_backrefs
hv_placeholders_p
hv_pushkv
hv_undef_flags
init_argv_symbols
init_constants
init_dbargs
init_debugger
init_i18nl10n
init_i18nl14n
init_named_cv
init_uniprops
invert
invlist_array
invlist_clear
invlist_clone
invlist_contents
invlist_extend
invlist_highest
invlist_is_iterating
invlist_iterfinish
invlist_iterinit
invlist_iternext
invlist_lowest
invlist_max
invlist_previous_index
invlist_set_len
invlist_set_previous_index
invlist_trim
invmap_dump
io_close
isFF_OVERLONG
isFOO_lc
is_grapheme
is_invlist
END_OF_DOCUMENT_MARKER
is_utf8_char_helper
is_utf8_common
is_utf8_overlong_given_start_byte_ok
jmaybe
keyword
keyword_plugin_standard
list
load_charnames
localize
lossless_NV_to_IV
magic_clear_all_env
magic_cleararylen_p
magic_clearenv
magic_clearisa
magic_clearpack
magic_clearsig
magic_copycallchecker
magic_existspack
magic_freearylen_p
magic_freeovrld
magic_get
magic_getarylen
magic_getdebugvar
magic_getdefelem
magic_getnkeys
magic_getpack
magic_getpos
magic_getsig
magic_getsubstr
magic_gettaint
magic_getuvar
magic_getvec
magic_killbackrefs
magic_nextpack
magic_regdata_cnt
magic_regdatum_get
magic_regdatum_set
magic_scalarpack
magic_set
magic_set_all_env
magic_setarylen
magic_setcollxfrm
magic_setdbline
magic_setdebugvar
magic_setdefelem
magic_setenv
magic_setisa
magic_setlvref
magic_setmglob
magic_setnkeys
magic_setnonelem
magic_setpack
magic_setpos
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
mortal_getenv
mro_meta_dup
mro_meta_init
multiconcat_stringify
multideref_stringify
my_atof2
my_atof3
my_attrs
my_clearenv
my_lstat_flags
my_memrchr
my_mkostemp
my_mkostemp_cloexec
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
parser_free
parser_free_nexttoke_ops
path_is_searchable
peep
pmruntime
populate_isa
ptr_hash
qerror
re_exec_indentf
re_indentf
re_intuit_start
re_intuit_string
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
should_we_output_Debug_r
sighandler
sighandler1
sighandler3
skipspace_flags
softref2xv
sortsv_flags_impl
sub_crush_depth
sv_add_backref
sv_buf_to_ro
sv_del_backref
sv_free2
sv_i_ncmp
sv_i_ncmp_desc
sv_kill_backrefs
sv_len_utf8_nomg
sv_magicext_mglob
sv_ncmp
sv_ncmp_desc
sv_only_taint_gmagic
sv_or_pv_pos_u2b
sv_resetpvn
sv_sethek
sv_setsv_cow
sv_unglob
tied_method
tmps_grow_p
to_uni_fold
to_uni_lower
to_uni_title
to_uni_upper
translate_substr_offsets
try_amagic_bin
try_amagic_un
uiv_2buf
unshare_hek
utf16_to_utf8
utf16_to_utf8_reversed
utf8_to_uvchr_buf_helper
utilize
uvoffuni_to_utf8_flags_msgs
uvuni_to_utf8
valid_utf8_to_uvuni
variant_byte_number
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 Бенджамином Штулем. Документацию написали те, кто любезно удосужились задокументировать свои функции.

См. также

config.h perlapi perlapio perlcall perlclib perlfilter perlguts perlmroapi perlxs perlxstut warnings

© 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.32.0/perlintern

Spec-Zone.ru

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