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, если это не так, независимо от того, было ли значениеwarntrueили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_curpadvoid 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 perlapibool 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-8sправильно сформирован (например, он проходит"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
- 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
- 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