perlintern - 纯粹内部 Perl 函数的自动生成文档
此文件是 Perl 解释器中函数的自动生成文档,这些函数使用 Perl 的内部文档格式进行记录,但未标记为 Perl API 的一部分。换句话说,它们不能用于扩展!
它与perlapi具有相同的节,尽管有些可能为空。
av_fetch_simple
这是 av_fetch 的简化版本,它假设数组非常简单 - 没有魔法,不可读,并且是 AvREAL - 并且 key
不是负数。此函数不能在任何这些假设可能不成立的情况下使用。
返回数组中指定索引处的 SV。key
是索引。如果 lval 为真,则保证您会获得一个真实的 SV(如果之前不是真实的),然后您可以对其进行修改。在将返回值解引用为 SV*
之前,请检查返回值是否为空。
粗略的 perl 等效项是 $myarray[$key]
。
SV ** av_fetch_simple(AV *av, SSize_t key, I32 lval)
AvFILLp
如果数组 av
为空,则返回 -1;否则返回当前在 av
中定义的所有数组元素的索引的最大值。它不处理魔法,因此其名称中包含 p
私有指示。
SSize_t AvFILLp(AV* av)
av_new_alloc
这实现了"newAV_alloc_x
" in perlapi 和 "newAV_alloc_xz
" in perlapi,它们是此功能的公共 API。
创建一个新的 AV 并分配其 SV* 数组。
这类似于,但比执行以下操作更有效
AV *av = newAV();
av_extend(av, key);
size 参数用于预先分配一个 SV* 数组,该数组足够大以容纳至少元素 0..(size-1)
。size
必须至少为 1。
zeroflag
参数控制是否对数组进行 NULL 初始化。
AV * av_new_alloc(SSize_t size, bool zeroflag)
av_store_simple
这是一个简化版的 av_store,它假设数组非常简单 - 没有魔法,不是只读的,并且是 AvREAL - 并且 key
不是负数。此函数在任何这些假设可能不成立的情况下 **绝不能** 使用。
将一个 SV 存储到数组中。数组索引由 key
指定。它可以被解引用以获取存储在那里的 SV*
(= val
)。
请注意,调用者负责在调用之前适当地增加 val
的引用计数。
近似的 Perl 等效项:splice(@myarray, $key, 1, $val)
。
SV ** av_store_simple(AV *av, SSize_t key, SV *val)
dowantarray
已弃用!
计划从未来版本的 Perl 中删除 dowantarray
。不要在新的代码中使用它;从现有代码中删除它。
实现已弃用的 "GIMME
" in perlapi.
U8 dowantarray()
leave_scope
实现 LEAVE_SCOPE
,你应该使用它代替。
void leave_scope(I32 base)
magic_freedestruct
此函数通过魔法调用来实现 mortal_destructor_sv()
和 mortal_destructor_x()
函数。它不应该直接调用,并且没有用户可维护的部分。
int magic_freedestruct(SV *sv, MAGIC *mg)
mortal_svfunc_x
此函数安排在 **当前语句结束时** 调用 C 函数引用,并提供提供的参数。它是 mortal_destructor_sv()
的包装器,它确保后一个函数被适当地调用。
请注意,当前语句结束 和 当前伪块结束 之间存在显著的时间差异。如果你正在寻找一种机制来在 **当前伪块结束时** 触发一个函数,你应该查看 SAVEDESTRUCTORX()
而不是这个函数。
void mortal_svfunc_x(SVFUNC_t f, SV *p)
pop_scope
void pop_scope()
push_scope
void push_scope()
save_adelete
实现 SAVEADELETE
。
void save_adelete(AV *av, SSize_t key)
save_freercpv
实现 SAVEFREERCPV
。
保存并释放一个引用计数的字符串。当当前伪块完成时,在参数上调用 rcpv_free()。
void save_freercpv(char *rcpv)
save_generic_pvref
实现 SAVEGENERICPV
。
类似于 save_pptr(),但如果新值与旧值不同,还会调用 Safefree()。可用于将全局 char* 恢复到其先前内容,释放新值。
void save_generic_pvref(char **str)
save_generic_svref
实现 SAVEGENERICSV
。
类似于 save_sptr(),但还会调用 SvREFCNT_dec()。可用于将全局 SV 恢复到其先前内容,释放新值。
void save_generic_svref(SV **sptr)
save_hdelete
实现 SAVEHDELETE
。
void save_hdelete(HV *hv, SV *keysv)
save_hints
实现 SAVEHINTS
。
void save_hints()
save_op
实现 SAVEOP
。
void save_op()
save_padsv_and_mortalize
实现 SAVEPADSVANDMORTALIZE
。
void save_padsv_and_mortalize(PADOFFSET off)
save_pushptr
对象 ptr
的引用计数将在当前伪块结束时递减。type
表示 ptr
的类型,以 scope.h 中以 SAVEt_
开头的常量之一表示。
这是几个宏的底层实现,例如 SAVEFREESV
。
void save_pushptr(void * const ptr, const int type)
save_rcpv
实现 SAVERCPV
。
保存和恢复引用计数字符串,类似于 save_generic_svref 对 SV* 的操作。可用于将引用计数字符串恢复到其先前状态。执行适当的引用计数,以确保不会泄漏或过早释放任何内容。
void save_rcpv(char **prcpv)
save_scalar_at
用于本地化 *sptr
引用的 SV 的辅助函数。
如果 SAVEf_KEEPOLDELEM
在 flags
中设置,则该函数将返回未修改的输入标量。
否则,它将用一个新的 undef
标量替换 *sptr
,并返回该标量。新标量将复制旧标量的魔法(如果有)。如果有这样的魔法,并且在 flags
中设置了 SAVEf_SETMAGIC
,则将在新标量上处理“设置”魔法。如果未设置,则将跳过“设置”魔法。后者通常意味着赋值将很快进行(例如,'local $x = $y'
),并且将处理魔法。
SV * save_scalar_at(SV **sptr, const U32 flags)
save_set_svflags
实现 SAVESETSVFLAGS
。
将掩码指定的 SvFLAGS 设置为 val 中的值。
void save_set_svflags(SV *sv, U32 mask, U32 val)
实现 SAVESHAREDPV
。
类似于 save_generic_pvref(),但使用 PerlMemShared_free() 而不是 Safefree()。可用于将共享全局 char* 还原到其先前内容,释放新值。
void save_shared_pvref(char **str)
save_vptr
实现 SAVEVPTR
。
void save_vptr(void *ptr)
强制转换中目前没有内部 API 项目。
字符大小写转换中目前没有内部 API 项目。
字符分类中目前没有内部 API 项目。
编译器和预处理器信息中目前没有内部 API 项目。
编译器指令中目前没有内部 API 项目。
BhkENTRY
注意:BhkENTRY
是实验性的,可能会在未经通知的情况下更改或删除。
从 BHK 结构中返回一个条目。which
是一个预处理器标记,指示要返回哪个条目。如果未设置相应的标志,则将返回 NULL
。返回值的类型取决于您请求的条目。
void * BhkENTRY(BHK *hk, token which)
BhkFLAGS
注意:BhkFLAGS
是实验性的,可能会在未经通知的情况下更改或删除。
返回 BHK 的标志。
U32 BhkFLAGS(BHK *hk)
CALL_BLOCK_HOOKS
注意:CALL_BLOCK_HOOKS
是实验性的,可能会在未经通知的情况下更改或删除。
调用所有注册的类型为 which
的块钩子。which
是一个预处理标记;arg
的类型取决于 which
。
void CALL_BLOCK_HOOKS(token which, arg)
CXt_BLOCK
CXt_EVAL
CXt_FORMAT
CXt_GIVEN
CXt_LOOP_ARY
CXt_LOOP_LAZYIV
CXt_LOOP_LAZYSV
CXt_LOOP_LIST
CXt_LOOP_PLAIN
CXt_NULL
CXt_SUB
CXt_SUBST
CXt_WHEN
在 perlguts 中描述。
my_fork
这是为了在某些平台上使用 PerlProc_fork
作为 C 库 fork(2) 的包装器,以隐藏一些平台的怪癖。除了通过 PerlProc_fork
使用外,不应使用它。
Pid_t my_fork()
目前 COP 和提示哈希中没有内部 API 项目。
core_prototype
此函数将命名核心函数的原型分配给 sv
,或者如果 sv
为 NULL
,则分配给新的 mortal SV。它返回修改后的 sv
,或者如果核心函数没有原型,则返回 NULL
。code
是由 keyword()
返回的代码。它不能等于 0。
SV * core_prototype(SV *sv, const char *name, const int code,
int * const opnum)
CvREFCOUNTED_ANYSV
如果为真,则表示 CvXSUBANY(cv).any_sv
成员包含一个 SV 指针,当 CV 本身被释放时,该指针的引用计数应该递减。此外,cv_clone()
将增加引用计数,并且如果设置了此标志,sv_dup()
将复制整个指向的 SV。
任何包装 XSUB 的 CV 都有一个 ANY
联合,XSUB 函数可以自由地将其用于自己的目的。代码可能希望在该联合的 any_sv
成员中存储一个 SV。通过设置此标志,当 CV 本身被释放或复制时,此 SV 引用将被正确回收或复制。
bool CvREFCOUNTED_ANYSV(CV *cv)
CvREFCOUNTED_ANYSV_off
辅助宏,用于关闭 CvREFCOUNTED_ANYSV
标志。
void CvREFCOUNTED_ANYSV_off(CV *cv)
CvREFCOUNTED_ANYSV_on
辅助宏,用于打开 CvREFCOUNTED_ANYSV
标志。
void CvREFCOUNTED_ANYSV_on(CV *cv)
CvWEAKOUTSIDE
每个 CV 都有一个指向其词法封闭 CV(如果有)的指针 CvOUTSIDE()
。由于指向匿名子原型指针存储在 &
填充槽中,因此有可能出现循环引用,即父级指向子级,反之亦然。为了避免由此产生的内存泄漏,我们在父级具有指向我们的 &
填充槽的 一种特定情况 中,不增加 CvOUTSIDE
指向的 CV 的引用计数。在这种情况下,我们在子级中设置 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)
docatch
在当前操作和 RUNOPS 循环中插入。
- a new JMPENV stack catch frame, and
- an inner RUNOPS loop to run all the remaining ops following the
current PL_op.
然后处理在该循环中引发的任何异常。对于在此级别捕获的 eval,使用指定的重启操作重新进入循环(即 OP_LEAVETRY 等之后的下一个操作);否则重新抛出异常。
docatch() 的预期使用方法如下
PP(pp_entertry)
{
if (CATCH_GET)
return docatch(Perl_pp_entertry);
... rest of function ...
return PL_op->op_next;
}
如果不需要新的捕获帧,则操作将正常执行。否则,它将调用 docatch(),docatch() 递归调用 pp_entertry(),这次将 CATCH_GET() 设置为 false,因此将运行 entertry 主体的其余部分。然后 docatch() 调用 CALLRUNOPS(),执行 entertry 之后的所有操作。当循环最终完成时,控制权将返回到 docatch(),docatch() 弹出 JMPENV 并返回到父 pp_entertry(),pp_entertry() 本身立即返回。请注意,*所有*后续操作都在内部 RUNOPS 循环中运行,而不仅仅是 eval 的主体。例如,在
sub TIEARRAY { eval {1}; my $x }
tie @a, "main";
执行 'my' 的时候,C 栈将看起来像
#10 main()
#9 perl_run() # JMPENV_PUSH level 1 here
#8 S_run_body()
#7 Perl_runops_standard() # main RUNOPS loop
#6 Perl_pp_tie()
#5 Perl_call_sv()
#4 Perl_runops_standard() # unguarded RUNOPS loop: no new JMPENV
#3 Perl_pp_entertry()
#2 S_docatch() # JMPENV_PUSH level 2 here
#1 Perl_runops_standard() # docatch()'s RUNOPs loop
#0 Perl_pp_padsv()
基本上,任何开始 RUNOPS 循环的 Perl 核心部分都可以承诺它将捕获任何异常并在必要时重新启动循环。如果它没有准备好这样做(例如 call_sv() 没有准备好),那么它将 CATCH_GET() 设置为 true,以便任何后续的 eval 类代码都知道要设置新的处理程序和循环(通过 docatch())。
有关更多详细信息,请参阅 "perlinterp 中的异常处理"。
OP * docatch(Perl_ppaddr_t firstpp)
comma_aDEPTH
在 DEBUGGING 模式下编译时,某些函数会接受一个额外的最终参数,名为 depth
,表示 C 栈深度。否则,该参数将被省略。此宏在 DEBUGGING 模式下扩展为 , depth
,而在非 DEBUGGING 模式下扩展为空,从而减少了代码中的 #ifdef
数量。
程序负责维护 depth
的正确值。
comma_aDEPTH
comma_pDEPTH
这用于接受 "comma_aDEPTH
" 最终参数的函数的原型声明中,类似于 pTHX_
用于接受线程上下文初始参数的函数。
debop
在 OP o
上实现 -Dt Perl 命令行选项。
I32 debop(const OP *o)
debprof
在 -DP
命令行选项下,用于指示 o
已执行,用于分析目的。
void debprof(const OP *o)
debprofdump
转储 -DP
Perl 命令行选项收集的数据内容。
void debprofdump()
debug_aDEPTH
与 "comma_aDEPTH
" 相同,但没有前导参数。适用于没有正常参数的函数,并由 "comma_aDEPTH
" 本身使用。
debug_aDEPTH
debug_pDEPTH
与 "comma_pDEPTH
" 相同,但没有前导参数。 旨在用于没有正常参数的函数,并由 "comma_pDEPTH
" 本身使用。
debug_pDEPTH
free_c_backtrace
释放从 get_c_backtrace 收到的回溯。
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)
PL_DBsingle
当 Perl 在调试模式下运行时,使用-d开关,此 SV 是一个布尔值,指示是否正在单步执行子例程。 单步执行在每一步之后自动打开。 这是对应于 Perl 的 $DB::single 变量的 C 变量。 请参阅 "PL_DBsub"
。
在多线程 Perl 中,每个线程都有此变量的独立副本;每个副本在创建时都使用创建线程副本的当前值进行初始化。
SV * PL_DBsingle
PL_DBsub
当 Perl 在调试模式下运行时,使用-d开关,此 GV 包含保存正在调试的子例程名称的 SV。 这是对应于 Perl 的 $DB::sub 变量的 C 变量。 请参阅 "PL_DBsingle"
。
在多线程 Perl 中,每个线程都有此变量的独立副本;每个副本在创建时都使用创建线程副本的当前值进行初始化。
GV * PL_DBsub
PL_DBtrace
当 Perl 在调试模式下运行时使用的跟踪变量,使用-d开关。 这是对应于 Perl 的 $DB::trace 变量的 C 变量。 请参阅 "PL_DBsingle"
。
在多线程 Perl 中,每个线程都有此变量的独立副本;每个副本在创建时都使用创建线程副本的当前值进行初始化。
SV * PL_DBtrace
sv_peek
实现 SvPEEK
char * sv_peek(SV *sv)
cv_dump
转储 CV 的内容
void cv_dump(const CV *cv, const char *title)
cv_forget_slab
当 CV 在其 slab 上有引用计数(CvSLABBED
)时,它负责确保它被释放。(因此,没有两个 CV 应该在同一个 slab 上有引用计数。)CV 仅在编译期间需要引用 slab。 一旦它被编译并且 CvROOT
附加,它就完成了它的工作,因此它可以忘记 slab。
void cv_forget_slab(CV *cv)
do_dump_pad
转储 padlist 的内容
void do_dump_pad(I32 level, PerlIO *file, PADLIST *padlist,
int full)
get_context
实现 "PERL_GET_CONTEXT
" in perlapi,您应该使用它。
void * get_context()
pad_alloc_name
在当前正在编译的 pad 中分配一个位置(通过 "pad_alloc" in perlapi),然后为该条目存储一个名称。 name
被采用并成为名称条目;它必须已经包含名称字符串。 typestash
和 ourstash
以及 padadd_STATE
标志被添加到 name
中。 没有执行 "pad_add_name_pvn" in perlapi 的其他处理。 返回分配的 pad 槽的偏移量。
PADOFFSET pad_alloc_name(PADNAME *name, U32 flags, HV *typestash,
HV *ourstash)
pad_block_start
在进入新块时更新 pad 编译状态变量。
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
在嵌套 pad 链中查找命名词法。如果在外部 pad 中找到,则在内部 pad 中添加伪条目。
返回词法或伪词法在底部 pad 中的偏移量。cv
是开始搜索的 CV,seq 是要匹配的当前 cop_seq
。如果 warn
为真,则打印相应的警告。out_
* 变量返回的值,因此是指向应存储返回值的位置的指针。out_capture
(如果非空)请求捕获词法的最内层实例;out_name
设置为匹配的最内层 pad 名称或伪 pad 名称;out_flags
返回通常与伪 pad 名称的 PARENT_FAKELEX_FLAGS
字段关联的标志。
请注意,pad_findlex()
是递归的;它递归地向上遍历 CV 链,然后向下返回,在返回时添加伪条目。它必须这样做,因为匿名原型中的伪名称必须在 xpadn_low
中存储到父 pad 的索引。
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
对于 pad 中的任何匿名 CV,如果需要,将该 CV 的 CvOUTSIDE
从 old_cv
更改为 new_cv
。当新编译的 CV 必须移动到预先存在的 CV 结构时需要这样做。
void pad_fixup_inner_anons(PADLIST *padlist, CV *old_cv,
CV *new_cv)
pad_free
释放当前 pad 中偏移量为 po 的 SV。
void pad_free(PADOFFSET po)
pad_leavemy
在编译期间作用域结束时的清理:设置此作用域中词法的最大 seq 编号,并警告任何从未引入的词法。
OP * pad_leavemy()
padlist_dup
复制一个 pad。
PADLIST * padlist_dup(PADLIST *srcpad, CLONE_PARAMS *param)
padname_dup
复制一个 pad 名称。
PADNAME * padname_dup(PADNAME *src, CLONE_PARAMS *param)
padnamelist_dup
复制一个 pad 名称列表。
PADNAMELIST * padnamelist_dup(PADNAMELIST *srcpad,
CLONE_PARAMS *param)
pad_push
将一个新的 pad 帧推入 padlist,除非在该深度已经存在一个 pad,在这种情况下,不要费心创建新的 pad。然后在槽 0 中给新 pad 一个 @_
。
void pad_push(PADLIST *padlist, int depth)
pad_reset
标记所有当前临时变量以供重用
void pad_reset()
pad_setsv
在当前(编译或执行)填充区中偏移量为 po
的位置设置值。使用宏 PAD_SETSV()
而不是直接调用此函数。
void pad_setsv(PADOFFSET po, SV *sv)
pad_sv
获取当前(编译或执行)填充区中偏移量为 po
的位置的值。使用宏 PAD_SV
而不是直接调用此函数。
SV * pad_sv(PADOFFSET po)
pad_swipe
放弃当前填充区中偏移量为 po
的位置的临时变量,并用新的临时变量替换。
void pad_swipe(PADOFFSET po, bool refadjust)
set_context
实现 "PERL_SET_CONTEXT
" in perlapi,您应该使用它。
void set_context(void *t)
si_dup
复制堆栈信息结构,返回指向克隆对象的指针。
PERL_SI * si_dup(PERL_SI *si, CLONE_PARAMS *param)
ss_dup
复制保存堆栈,返回指向克隆对象的指针。
ANY * ss_dup(PerlInterpreter *proto_perl, CLONE_PARAMS *param)
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)
异常处理(简单)宏中目前没有内部 API 项目
文件系统配置值中目前没有内部 API 项目
浮点数目前没有内部 API 项目。
通用配置目前没有内部 API 项目。
全局变量目前没有内部 API 项目。
amagic_applies
检查 sv
以查看重载(活动魔术)操作 method
是否适用于它。如果 sv
不是 SvROK 或不是对象,则返回 false,否则检查对象是否被祝福到支持重载操作的类中,如果使用此 SV 和给定方法调用 amagic_call() 将触发 amagic 操作,则返回 true,包括通过重载回退规则或通过 nomethod。因此,类似于
amagic_applies(sv, string_amg, AMG_unary)
对于以以下任何方式设置重载的对象,将返回 true
use overload q("") => sub { ... };
use overload q(0+) => sub { ... }, fallback => 1;
并且可以用来判断给定对象是否会字符串化为除正常默认引用字符串化之外的其他内容。
请注意,此函数返回 TRUE 并不意味着您可以使用 amagic_call() 成功执行操作,例如任何重载方法都可能抛出致命异常,但是如果此函数返回 FALSE,您可以确信它不会执行给定的重载操作。
method
是一个整数枚举,是 overload.h 中找到的值之一,例如 string_amg
。
对于一元操作,flags
应设置为 AMG_unary。
bool amagic_applies(SV *sv, int method, int flags)
gp_dup
复制一个 typeglob,返回指向克隆对象的指针。
GP * gp_dup(GP * const gp, CLONE_PARAMS * const param)
gv_handler
实现 StashHANDLER
,您应该使用它而不是 gv_handler
。
CV * gv_handler(HV *stash, I32 id)
gv_stashsvpvn_cached
返回指定包的存储的指针,可能已缓存。实现 "perlapi 中的 gv_stashpvn
" 和 "perlapi 中的 gv_stashsv
"。
需要 namesv
或 namepv
之一非空。
如果设置了标志 GV_CACHE_ONLY
,则仅在缓存中找到时返回存储;有关其他 flags
的详细信息,请参阅 "perlapi 中的 gv_stashpvn
"。
请注意,出于性能原因,强烈建议 namesv
非空。
HV * gv_stashsvpvn_cached(SV *namesv, const char *name,
U32 namelen, I32 flags)
gv_try_downgrade
注意:gv_try_downgrade
是实验性的,可能会在未经通知的情况下更改或删除。
如果类型 glob gv
可以通过在存储区中用真实 GV 以外的东西替换它来更简洁地表达,则用优化后的形式替换它。对此的基本要求是 gv
是一个真实的类型 glob,足够普通,并且只从其包中引用。此函数旨在用于在部分查找 GV 以查看其中有什么时,导致升级,但根据找到的内容,事实证明最终不需要真实的 GV。
如果 gv
是一个完全空的类型 glob,则将其从存储区中删除。
如果 gv
是一个仅包含足够普通的常量子类型的类型 glob,则该类型 glob 将被替换为一个标量引用占位符,该占位符更紧凑地表示相同的内容。
void gv_try_downgrade(GV *gv)
目前钩子操作中没有内部 API 项目。
hv_eiter_p
实现 HvEITER
,您应该使用它。
注意:hv_eiter_p
必须显式调用为 Perl_hv_eiter_p
,并带有 aTHX_
参数。
HE ** Perl_hv_eiter_p(pTHX_ HV *hv)
hv_eiter_set
实现 HvEITER_set
,您应该使用它。
注意:hv_eiter_set
必须显式调用为 Perl_hv_eiter_set
,并带有 aTHX_
参数。
void Perl_hv_eiter_set(pTHX_ HV *hv, HE *eiter)
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)
hv_fill
返回正在使用的哈希桶的数量。
此函数实现 HvFILL
宏,您应该使用它。
从 perl 5.25 开始,此函数仅用于调试目的,并且正在使用的哈希桶数量不会以任何方式缓存,因此此函数的执行成本可能很高,因为它必须遍历哈希中的所有桶。
注意:hv_fill
必须显式调用为 Perl_hv_fill
,并带有 aTHX_
参数。
STRLEN Perl_hv_fill(pTHX_ HV * const hv)
hv_placeholders_get
实现 HvPLACEHOLDERS_get
,您应该使用它代替。
注意:hv_placeholders_get
必须显式调用为 Perl_hv_placeholders_get
,并带有 aTHX_
参数。
I32 Perl_hv_placeholders_get(pTHX_ const HV *hv)
hv_placeholders_set
实现 HvPLACEHOLDERS_set
,您应该使用它代替。
注意:hv_placeholders_set
必须显式调用为 Perl_hv_placeholders_set
,并带有 aTHX_
参数。
void Perl_hv_placeholders_set(pTHX_ HV *hv, I32 ph)
hv_riter_p
实现 HvRITER
,您应该使用它代替。
注意:hv_riter_p
必须显式调用为 Perl_hv_riter_p
,并带有 aTHX_
参数。
I32 * Perl_hv_riter_p(pTHX_ HV *hv)
hv_riter_set
实现 HvRITER_set
,您应该使用它代替。
注意:hv_riter_set
必须显式调用为 Perl_hv_riter_set
,并带有 aTHX_
参数。
void Perl_hv_riter_set(pTHX_ HV *hv, I32 riter)
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
是键字符串的预计算哈希值,如果它没有被预计算,则为零。返回一个表示与键关联的值的 mortal 标量,如果与键没有关联的值,则返回 &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
的引用计数减少。将空指针传递给此函数是安全的:在这种情况下不会执行任何操作。
void refcounted_he_free(struct refcounted_he *he)
refcounted_he_inc
增加 refcounted_he
的引用计数。refcounted_he
的指针也会被返回。传递空指针到这个函数是安全的:不会有任何操作发生,并且会返回一个空指针。
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)
如果没有人访问长度为 len
的共享字符串 str
,则释放它。
len
和 hash
必须对 str
有效。
void unsharepvn(const char *sv, I32 len, U32 hash)
dirp_dup
复制目录句柄,返回指向克隆对象的指针。
DIR * dirp_dup(DIR * const dp, CLONE_PARAMS * const param)
fp_dup
复制文件句柄,返回指向克隆对象的指针。
PerlIO * fp_dup(PerlIO * const fp, const char type,
CLONE_PARAMS * const param)
my_fflush_all
在某些平台上实现 PERL_FLUSHALL_FOR_CHILD
。
I32 my_fflush_all()
my_mkostemp
如果可用,则使用 C 库 mkostemp(3)
,否则使用 Perl 实现。
注意:my_mkostemp
必须显式调用为 Perl_my_mkostemp
。
int Perl_my_mkostemp(char *templte, int flags)
my_mkstemp
如果可用,则使用 C 库 mkstemp(3)
,否则使用 Perl 实现。
注意:my_mkstemp
必须显式调用为 Perl_my_mkstemp
。
int Perl_my_mkstemp(char *templte)
PL_last_in_gv
最后用于文件句柄输入操作的 GV。(<FH>
)
在多线程 Perl 中,每个线程都有此变量的独立副本;每个副本在创建时都使用创建线程副本的当前值进行初始化。
GV* PL_last_in_gv
PL_ofsgv
包含输出字段分隔符的全局变量 - Perl 空间中的 *,
。
在多线程 Perl 中,每个线程都有此变量的独立副本;每个副本在创建时都使用创建线程副本的当前值进行初始化。
GV* PL_ofsgv
PL_rs
输入记录分隔符 - Perl 空间中的 $/
。
在多线程 Perl 中,每个线程都有此变量的独立副本;每个副本在创建时都使用创建线程副本的当前值进行初始化。
SV* PL_rs
start_glob
注意:start_glob
是实验性的,可能会在不通知的情况下更改或删除。
由 do_readline
调用以生成全局变量(或在 VMS 上在 perl 中执行全局变量)。此代码以前是内联的,但现在 perl 使用 File::Glob
,此全局变量启动器仅在构建过程中由 miniperl 使用,或者在定义了 PERL_EXTERNAL_GLOB 时使用。将其移开缩小了 pp_hot.c;缩小 pp_hot.c 有助于加速 perl。
注意:start_glob
必须显式调用为 Perl_start_glob
,并带有 aTHX_
参数。
PerlIO * Perl_start_glob(pTHX_ SV *tmpglob, IO *io)
整数目前没有内部 API 项目。
目前 I/O 格式中没有内部 API 项目。
resume_compcv_and_save
恢复之前由 suspend_compcv
函数挂起的缓冲区,以在作用域结束时重新挂起的方式,以便稍后再次使用。这应该在 ENTER
/LEAVE
作用域对中使用。
void resume_compcv_and_save(struct suspended_compcv *buffer)
resume_compcv_final
在编译成完整的 CV 之前,最后一次恢复之前使用 suspend_compcv
函数保存的解析器状态。这应该在 ENTER
/LEAVE
作用域对中使用。
void resume_compcv_final(struct suspended_compcv *buffer)
validate_proto
注意: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)
目前区域设置中没有内部 API 项目。
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
。
注意:magic_methcall
必须显式地调用为 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_dup
复制一个魔法链,返回指向克隆对象的指针。
MAGIC * mg_dup(MAGIC *mg, CLONE_PARAMS * const param)
mg_localize
将现有 SV 中的一些魔法复制到该 SV 的新本地化版本。容器魔法(例如 %ENV
、$1
、tie
)会被复制,值魔法不会(例如 taint
、pos
)。
如果 setmagic
为假,则不会在新(空)SV 上调用任何设置魔法。这通常意味着赋值将很快随之而来(例如 'local $x = $y'
),并且将处理魔法。
void mg_localize(SV *sv, SV *nsv, bool setmagic)
calloc
实现 "Newxz
" 在 perlapi 中,您应该使用它。
注意:calloc
必须显式调用为 Perl_calloc
。
Malloc_t Perl_calloc(MEM_SIZE elements, MEM_SIZE size)
malloc
实现 "Newx
" 在 perlapi 中,您应该使用它。
注意:malloc
必须显式调用为 Perl_malloc
。
Malloc_t Perl_malloc(MEM_SIZE nbytes)
mfree
实现 "Safefree
" 在 perlapi 中,您应该使用它。
注意:mfree
必须显式调用为 Perl_mfree
。
Free_t Perl_mfree(Malloc_t where)
realloc
实现 "Renew
" 在 perlapi 中,您应该使用它。
注意:realloc
必须显式调用为 Perl_realloc
。
Malloc_t Perl_realloc(Malloc_t where, MEM_SIZE nbytes)
mro_get_linear_isa_dfs
返回给定存储区的 @ISA
的深度优先搜索线性化。返回值是一个只读 AV*,其元素是字符串 SV,表示类名。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)
目前多重调用函数中没有内部 API 项目。
isinfnansv
检查参数在用作数字时是否为无穷大或 NaN
,但小心避免触发非数字或未初始化警告。它假设调用者已经执行了 SvGETMAGIC(sv)
。
请注意,这始终接受尾部垃圾(类似于带有 PERL_SCAN_TRAILING
的 grok_number_flags
),因此 "inferior"
和 "NAND gates"
将返回 true。
bool isinfnansv(SV *sv)
newATTRSUB_x
构造一个 Perl 子例程,并执行一些周围的任务。
此函数预计在 Perl 编译上下文中调用,子例程的某些方面取自与编译相关的全局变量。特别是,PL_compcv
代表当前正在编译的子例程。在调用此函数时,它必须非空,并且正在构造的子例程的某些方面取自它。构造的子例程实际上可能是 PL_compcv
对象的重用,但并非一定如此。
如果 block
为空,则子例程将没有主体,并且暂时调用它将是错误的。这表示一个向前子例程声明,例如 sub foo ($$);
。如果 block
非空,则它提供子例程主体的 Perl 代码,该代码将在调用子例程时执行。此主体包括由子例程签名或类似内容产生的任何参数解包代码。代码的填充使用必须与附加到 PL_compcv
的填充相对应。代码预计不包含 leavesub
或 leavesublv
操作;此函数将添加此类操作。block
被此函数消耗,并将成为构造的子例程的一部分。
proto
指定子例程的原型,除非作为属性提供了一个原型(见下文)。如果 proto
为空,则子例程将没有原型。如果 proto
非空,则它必须指向一个值为字符串的 const
操作,并且子例程将具有该字符串作为其原型。如果作为属性提供了一个原型,则属性优先于 proto
,但在这种情况下,proto
最好为空。无论哪种情况,proto
都被此函数消耗。
attrs
提供要应用于子例程的属性。一些属性通过内置方式生效,在看到时立即应用于 PL_compcv
。其他属性会被收集起来,并通过此途径附加到子例程。attrs
可以为 null,表示不提供任何属性,也可以指向一个 const
操作,表示单个属性,或者指向一个 list
操作,其子节点(除了 pushmark
之外)都是表示一个或多个属性的 const
操作。每个 const
操作必须是一个字符串,表示属性名称,可以选择后跟括号括起来的参数,与 Perl 源代码中属性的出现方式相同。这些属性将由此函数应用于子例程。attrs
会被此函数消耗。
如果 o_is_gv
为假且 o
为 null,则子例程将是匿名的。如果 o_is_gv
为假且 o
不为 null,则 o
必须指向一个 const
操作,该操作将被此函数消耗,其字符串值提供子例程的名称。名称可以是限定的或非限定的,如果是非限定的,则将以某种方式选择默认的 stash。如果 o_is_gv
为真,则 o
根本不指向 OP
,而是指向一个 GV
的强制转换指针,子例程将以此命名。
如果已经存在具有指定名称的子例程,则新子例程将替换 glob 中的现有子例程,或者与现有子例程合并。可能会生成关于重新定义的警告。
如果子例程具有几个特殊名称中的一个,例如 BEGIN
或 END
,则它将被相应的队列声明,用于自动运行与阶段相关的子例程。在这种情况下,相关的 glob 将不再包含任何子例程,即使它之前包含过。在 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` 为空则没有原型。原型字符串将被复制;调用者可以在之后修改提供的字符串。如果 `filename` 不为空,则它必须是以空字符结尾的文件名,并且该子例程的 `CvFILE` 将相应地设置。默认情况下,`CvFILE` 被设置为直接指向提供的字符串,该字符串必须是静态的。如果 `flags` 设置了 `XS_DYNAMIC_FILENAME` 位,则将复制该字符串。
子例程的其他方面将保留其默认状态。如果需要对子例程执行其他操作才能使其正常工作,则调用者有责任在该函数构造完子例程之后执行这些操作。但是,请注意,子例程可能在该函数返回之前被销毁,如以下所述。
如果name
为 null,则子例程将是匿名的,其CvGV
将引用一个__ANON__
全局变量。如果name
不为 null,则子例程将相应地命名,并由相应的全局变量引用。name
是一个长度为len
字节的字符串,表示一个无符号的符号名称,如果flags
设置了SVf_UTF8
位,则为 UTF-8 编码,否则为 Latin-1 编码。该名称可以是限定的或非限定的,其 stash 默认值与gv_fetchpvn_flags
相同。flags
可以包含gv_fetchpvn_flags
理解的标志位,其含义与在那里相同,例如GV_ADDWARN
。如果需要,该符号始终会被添加到 stash 中,并使用GV_ADDMULTI
语义。
如果已经存在一个指定名称的子例程,则新的子例程将替换全局变量中的现有子例程。可能会生成关于重新定义的警告。如果旧的子例程是CvCONST
,则是否发出警告的决定会受到对新子例程是否会成为具有类似值的常量的期望的影响。该期望由const_svp
决定。(注意,调用此函数不会使新的子例程在任何情况下都成为CvCONST
;这留给调用者处理。)如果const_svp
为 null,则表示新的子例程不会成为常量。如果const_svp
不为 null,则表示新的子例程将成为常量,并且它指向一个SV*
,该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)
op_refcnt_lock
实现OP_REFCNT_LOCK
宏,您应该使用它。
void op_refcnt_lock()
op_refcnt_unlock
实现OP_REFCNT_UNLOCK
宏,您应该使用它。
void op_refcnt_unlock()
traverse_op_tree
以深度优先遍历的方式返回操作树中的下一个操作,遍历完成后返回 NULL。
初始调用必须将树的根节点作为 top 和 o 提供。
目前它是静态的,但将来可能会暴露给 API。
OP * traverse_op_tree(OP *top, OP *o)
打包和解包中目前没有内部 API 项目。
CX_CURPAD_SAVE
在给定的上下文块结构中保存当前填充。
void CX_CURPAD_SAVE(struct context)
CX_CURPAD_SV
访问给定上下文块结构中保存的当前填充中偏移量为po
的 SV(可以用作左值)。
SV * CX_CURPAD_SV(struct context, PADOFFSET po)
PAD_BASE_SV
获取填充列表中基础(DEPTH=1)填充中槽位po
的值。
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
的名称的生成号(左值)。
STRLEN PAD_COMPNAME_GEN(PADOFFSET po)
PAD_COMPNAME_GEN_set
将当前 ling 填充中偏移量为po
的名称的生成号(左值)设置为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
返回当前编译的 pad 名称在偏移量 po
处的类型(stash)。必须是有效的名称。如果未类型化,则返回 null。
HV * PAD_COMPNAME_TYPE(PADOFFSET po)
PadnameIsFIELD
是否为“字段”变量。对于此值为 true 的 PADNAME,可以通过 PadnameFIELDINFO
获取更多信息。
bool PadnameIsFIELD(PADNAME * pn)
PadnameIsOUR
是否为“our”变量。
bool PadnameIsOUR(PADNAME * pn)
PadnameIsSTATE
是否为“state”变量。
bool PadnameIsSTATE(PADNAME * pn)
PadnameOURSTASH
声明此“our”变量的 stash。
HV * PadnameOURSTASH(PADNAME * pn)
PadnameOUTER
此条目是否属于外部 pad。对于此值为 true 的条目,通常称为“伪造”。
bool PadnameOUTER(PADNAME * pn)
PadnameTYPE
与类型化词法相关的 stash。这将返回 my Foo $bar
的 %Foo::
哈希。
HV * PadnameTYPE(PADNAME * pn)
PAD_RESTORE_LOCAL
将 PAD_SAVE_LOCAL()
保存到局部变量 opad
中的旧 pad 还原。
void PAD_RESTORE_LOCAL(PAD *opad)
PAD_SAVE_LOCAL
将当前 pad 保存到局部变量 opad
中,然后将当前 pad 设置为 npad
。
void PAD_SAVE_LOCAL(PAD *opad, PAD *npad)
PAD_SAVE_SETNULLPAD
保存当前 pad,然后将其设置为 null。
void PAD_SAVE_SETNULLPAD()
PAD_SET_CUR
将当前 pad 设置为 pad 列表中的 pad n
,保存之前的当前 pad。注意,当前此宏展开的字符串对于某些编译器来说太长了,因此最好将其替换为
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_SETSV
将当前 pad 中偏移量为 po
的槽设置为 sv
。
SV * PAD_SETSV(PADOFFSET po, SV* sv)
PAD_SV
获取当前 pad 中偏移量为 po
的值。
SV * PAD_SV(PADOFFSET po)
PAD_SVl
PAD_SV
的轻量级 lvalue 版本。获取或设置当前 pad 中偏移量为 po
的值。与 PAD_SV
不同,它不会在 -DX 下打印诊断信息。仅供内部使用。
SV * PAD_SVl(PADOFFSET po)
SAVECLEARSV
在作用域退出时清除指向的 pad 值。(即 my
的运行时操作)
void SAVECLEARSV(SV **svp)
SAVECOMPPAD
保存 PL_comppad
和 PL_curpad
。
void SAVECOMPPAD()
SAVEPADSV
保存一个垫片槽(用于在迭代后恢复)
void SAVEPADSV(PADOFFSET po)
目前密码和组访问中没有内部 API 项目
目前系统命令路径中没有内部 API 项目
目前原型信息中没有内部 API 项目
regnode
在 perlreguts 中描述。
目前报告和格式中没有内部 API 项目
目前信号中没有内部 API 项目
目前站点配置中没有内部 API 项目
目前套接字配置值中没有内部 API 项目
目前源过滤器中没有内部 API 项目
djSP
声明 Just SP
。这实际上与 dSP
相同,并声明了 Perl 堆栈指针的本地副本,可以通过 SP
宏访问。参见 "SP" in perlapi
。(可用于与旧(Perl 5.005)线程模型的向后源代码兼容性。)
djSP();
LVRET
如果此操作将是左值子例程的返回值,则为真
save_alloc
实现 "SSNEW
" in perlapi 及其同类,应使用此函数代替。
SSize_t save_alloc(SSize_t size, I32 pad)
delimcpy_no_escape
将源缓冲区复制到目标缓冲区,在(但不包括)源中第一个出现的定界符字节 delim
处停止。源是 from
和 from_end
- 1 之间的字节。类似地,目标是 to
到 to_end
。
复制的字节数写入 *retlen
。
返回delim
在from
缓冲区中的位置,但如果在from_end
之前没有这样的出现,则返回from_end
,并将整个缓冲区from
.. from_end
- 1复制。
如果在复制后目标中有可用空间,则会附加一个额外的终止安全NUL
字节(不包含在返回的长度中)。
错误情况是目标缓冲区不足以容纳所有应复制的内容。在这种情况下,将写入*retlen
的值大于to_end
- to
,并且将尽可能多地将源写入目标。没有足够的空间容纳安全NUL
不被视为错误。
char * delimcpy_no_escape(char *to, const char *to_end,
const char *from, const char *from_end,
const int delim, I32 *retlen)
my_cxt_init
实现"MY_CXT_INIT
" in perlxs宏,您应该使用它。
模块第一次加载时,全局PL_my_cxt_index
会递增,并将该值分配给该模块的静态my_cxt_index
(其地址作为参数传递)。然后,对于调用此函数的每个解释器,它确保有一个void*
插槽可用于挂载静态数据,方法是分配或扩展解释器的PL_my_cxt_list
数组
注意:my_cxt_init
必须显式调用为Perl_my_cxt_init
,并带有一个aTHX_
参数。
void * Perl_my_cxt_init(pTHX_ int *indexp, size_t size)
quadmath_format_needed
如果format
字符串似乎包含至少一个非 Q 前缀的%[efgaEFGA]
格式说明符,则quadmath_format_needed()
返回 true,否则返回 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)
SVt_INVLIST
标量类型标志。参见 "perlapi 中的 svtype"。
PL_Sv
一个用于任何临时用途的临时 SV。主要用作宏在 "perlapi 中的 PERL_USE_GCC_BRACE_GROUPS"> 不可用且否则会多次评估其 SV 参数的平台上的后备方案。
但请注意,如果在使用它的东西在调用堆栈中与使用它的其他东西一起使用的情况下使用它,则此变量将被清除,从而导致难以诊断的错误。
PL_Sv
sv_add_arena
给定一块内存,将其链接到竞技场列表的头部,并将其拆分为一个空闲 SV 列表。
void sv_add_arena(char * const ptr, const U32 size,
const U32 flags)
sv_2bool
此宏仅由 sv_true()
或其宏等效项使用,并且仅当后者的参数既不是 SvPOK
、SvIOK
也不 SvNOK
时使用。它使用 SV_GMAGIC
标志调用 sv_2bool_flags
。
bool sv_2bool(SV * const sv)
sv_2bool_flags
此函数仅由 sv_true()
及其朋友使用,并且仅当后者的参数既不是 SvPOK
、SvIOK
也不 SvNOK
时使用。如果标志包含 SV_GMAGIC
,则它首先执行 mg_get()
。
bool sv_2bool_flags(SV *sv, I32 flags)
sv_clean_all
递减每个剩余 SV 的 refcnt,可能触发清理。此函数可能需要多次调用才能释放处于复杂自引用层次结构中的 SV。
I32 sv_clean_all()
sv_clean_objs
尝试销毁所有尚未释放的对象。
void sv_clean_objs()
sv_free_arenas
释放所有竞技场使用的内存。请注意,竞技场内的所有单个 SV 头部和主体都必须已释放。
void sv_free_arenas()
sv_grow
扩展 SV 中的字符缓冲区。如果需要,使用 sv_unref
并将 SV 升级到 SVt_PV
。返回指向字符缓冲区的指针。使用 SvGROW
包装器代替。
char * sv_grow(SV * const sv, STRLEN newlen)
sv_grow_fresh
sv_grow 的简化版本,仅用于 sv 是新创建的 SVt_PV、SVt_PVIV、SVt_PVNV 或 SVt_PVMG 时。即 sv 具有默认标志,从未是任何其他类型,并且没有现有的字符串。基本上,只需分配一个字符缓冲区并返回指向它的指针。
char * sv_grow_fresh(SV * const sv, STRLEN newlen)
sv_newref
增加 SV 的引用计数。请使用 SvREFCNT_inc()
包装器。
SV * sv_newref(SV * const sv)
sv_2num
注意:sv_2num
处于实验阶段,可能会在未经通知的情况下更改或删除。
返回一个包含源 SV 数值 SV,执行任何必要的引用或重载转换。调用者应已处理 get-magic。
SV * sv_2num(SV * const sv)
sv_pv
请使用 SvPV_nolen
宏。
char * sv_pv(SV *sv)
sv_pvbyte
请使用 SvPVbyte_nolen
。
char * sv_pvbyte(SV *sv)
sv_pvbyten_force
SvPVbytex_force
宏的后端。始终使用宏。如果 SV 无法从 UTF-8 降级,则会抛出异常。
char * sv_pvbyten_force(SV * const sv, STRLEN * const lp)
sv_2pvbyte_nolen
返回指向 SV 的字节编码表示的指针。可能会导致 SV 作为副作用从 UTF-8 降级。
通常通过 SvPVbyte_nolen
宏访问。
char * sv_2pvbyte_nolen(SV *sv)
sv_pvn_force
以某种方式从 SV 中获取一个合理的字符串。SvPV_force
宏的私有实现,用于无法处理复杂宏表达式的编译器。始终使用宏。
char * sv_pvn_force(SV *sv, STRLEN *lp)
sv_2pv_nolen
类似于 sv_2pv()
,但不会返回长度。通常应使用宏包装器 SvPV_nolen(sv)
。
char * sv_2pv_nolen(SV *sv)
sv_pvutf8n_force
SvPVutf8x_force
宏的后端。始终使用宏。
char * sv_pvutf8n_force(SV * const sv, STRLEN * const lp)
sv_2pvutf8_nolen
返回指向 SV 的 UTF-8 编码表示的指针。可能会导致 SV 作为副作用升级到 UTF-8。
通常通过 SvPVutf8_nolen
宏访问。
char * sv_2pvutf8_nolen(SV *sv)
sv_pvutf8
请使用 SvPVutf8_nolen
宏。
char * sv_pvutf8(SV *sv)
sv_tainted
测试 SV 是否被污染。请使用 SvTAINTED
。
bool sv_tainted(SV * const sv)
SvTHINKFIRST
一个快速标志检查,用于查看是否应将 sv
传递给 sv_force_normal
以在直接修改 SvIVX
或 SvPVX
之前“降级”。
例如,如果您的标量是引用,并且您想修改 SvIVX
槽,您不能只执行 SvROK_off
,因为这会导致引用泄漏。
这在内部由各种修改 sv 的函数使用,例如 sv_setsv
、sv_setiv
和 sv_pvn_force
。
此方法无法处理的一种情况是未设置 SvFAKE 的 gv。在
if (SvTHINKFIRST(gv)) sv_force_normal(gv);
之后,它仍然是 gv。
SvTHINKFIRST
有时会产生误报。在这些情况下,sv_force_normal
不会执行任何操作。
U32 SvTHINKFIRST(SV *sv)
sv_true
如果 SV 根据 Perl 的规则具有真值,则返回真值。使用 SvTRUE
宏代替,它可能调用 sv_true()
,也可能使用内联版本。
I32 sv_true(SV * const sv)
sv_untaint
取消 SV 的污染。使用 SvTAINTED_off
代替。
void sv_untaint(SV * const sv)
sv_taint
污染 SV。使用 SvTAINTED_on
代替。
void sv_taint(SV *sv)
TAINT
如果我们不在污染检查模式下,则不执行任何操作;否则,指示 "TAINT_set
" 和 "TAINT_PROPER
" 某个未指定元素被污染。
void TAINT()
TAINT_ENV
查看 %ENV
的几个组件是否被污染,如果任何组件被污染,则调用 "taint_proper
"。它搜索的组件包括 $PATH
等。
void TAINT_ENV
taint_env
实现 "TAINT_ENV" 宏,您通常应该使用它。
void taint_env()
TAINT_get
返回一个布尔值,表示某个元素是否被污染。
bool TAINT_get()
TAINTING_get
返回一个布尔值,表示污染检查是否已启用。
bool TAINTING_get()
TAINTING_set
关闭/打开污染检查模式
void TAINTING_set(bool s)
TAINT_NOT
删除之前由 例如 TAINT
设置的任何污染。
void TAINT_NOT()
TAINT_PROPER
如果没有任何元素被污染,则不执行任何操作;否则,输出一条消息(包含 s
),指示存在污染违规。如果此类违规是致命的,它将崩溃。
void TAINT_PROPER(const char * s)
taint_proper
实现 "TAINT_PROPER" 宏,您通常应该使用它。
void taint_proper(const char *f, const char * const s)
TAINT_set
如果 s
为真,则 "TAINT_get
" 返回真值;如果 s
为假,则 "TAINT_get
" 返回假值;
void TAINT_set(bool s)
TAINT_WARN_get
如果污染违规是致命的,则返回假值;如果它们只是警告,则返回真值
bool TAINT_WARN_get()
TAINT_WARN_set
s
为真表示 "TAINT_WARN_get
" 应该返回污染违规只是警告。
s
为假表示 "TAINT_WARN_get
" 应该返回污染违规是致命的。
void TAINT_WARN_set(bool s)
目前时间中没有内部 API 项目。
目前类型定义名称中没有内部 API 项目。
bytes_from_utf8_loc
注意:bytes_from_utf8_loc
是实验性的,可能会在未经通知的情况下更改或删除。
与 "perlapi 中的 bytes_from_utf8"()
相似,但它接受一个额外的参数,一个指向存储 "s"
中无法转换为非 UTF-8 的第一个字符位置的指针。
如果该参数为 NULL
,则此函数的行为与 bytes_from_utf8
相同。
否则,如果 *is_utf8p
在输入时为 0,则该函数的行为与 bytes_from_utf8
相同,只是它还将 *first_non_downgradable
设置为 NULL
。
否则,该函数将返回一个新创建的以 NUL
结尾的字符串,其中包含 "s"
的可转换第一部分的非 UTF-8 等效项。*lenp
设置为其长度,不包括结尾的 NUL
。如果整个输入字符串都被转换,则 *is_utf8p
设置为 FALSE 值,并且 *first_non_downgradable
设置为 NULL
。
否则,*first_non_downgradable
将设置为指向原始字符串中第一个未转换字符的第一个字节。*is_utf8p
保持不变。请注意,新字符串的长度可能为 0。
另一种看待它的方式是,如果 *first_non_downgradable
非 NULL
且 *is_utf8p
为 TRUE,则此函数从 "s"
的开头开始,尽可能多地转换其中的字符,直到找到第一个无法转换为非 UTF-8 的字符为止。*first_non_downgradable
将设置为指向该字符。该函数返回可以在新创建的以 NUL
结尾的字符串中转换的部分,并且 *lenp
设置为其长度,不包括结尾的 NUL
。如果原始字符串中的第一个字符无法转换,则 *lenp
将为 0,并且新字符串将只包含一个 NUL
。如果整个输入字符串都被转换,则 *is_utf8p
设置为 FALSE,并且 *first_non_downgradable
设置为 NULL
。
成功返回后,可以通过在调用之前保存 *lenp
的值,并将调用后的 *lenp
值从该值中减去,来计算字符串转换部分中的变体数量。
U8 * bytes_from_utf8_loc(const U8 *s, STRLEN *lenp,
bool *is_utf8p,
const U8 **first_unconverted)
find_uninit_var
注意:find_uninit_var
处于实验阶段,可能会在未经通知的情况下更改或删除。
查找导致运算符发出“使用未初始化的值”警告的未定义变量的名称(如果有)。如果 match 为真,则仅在变量的值与 uninit_sv
匹配时才返回名称。因此,粗略地说,如果一元运算符(例如 OP_COS
)生成警告,则沿着运算符的直接子节点可能会产生一个 OP_PADSV
或 OP_GV
,它给出未定义变量的名称。另一方面,对于 OP_ADD
,有两个分支需要跟踪,因此只有在我们获得完全匹配时才打印变量名。desc_p
指向一个字符串指针,该指针保存运算符的描述。如果需要,可以更新它。
名称以一个临时的 SV 返回。
假设 PL_op
是最初触发错误的 OP,并且 PL_comppad
/PL_curpad
指向当前正在执行的 pad。
SV * find_uninit_var(const OP * const obase,
const SV * const uninit_sv, bool match,
const char **desc_p)
isSCRIPT_RUN
返回一个布尔值,表示从 s
到 send
(不包括 send
)的字节序列是否构成“脚本运行”。utf8_target
为 TRUE 当且仅当从 s
开始的序列被视为 UTF-8 时。准确地说,除了下面给出的两个退化情况外,此函数返回 TRUE 当且仅当其中的所有代码点来自 Unicode “脚本扩展”属性给出的三个“脚本”的任意组合:通用、继承,以及可能还有另一个。此外,所有十进制数字必须来自同一个连续的 10 个数字序列。
例如,如果序列中的所有字符都是希腊语、通用语或继承语,则此函数将返回 TRUE,前提是其中的任何十进制数字都来自通用语中的相同数字块。(这些是 ASCII 数字“0”到“9”,另外还有一个块用于这些数字的全角形式,以及在数学符号中使用的其他几个数字。)对于(不像希腊语)有自己定义的数字的脚本,这将接受来自该集合或来自通用数字集合之一的任何数字,但不能接受两者的组合。某些脚本,例如阿拉伯语,具有多个数字集。所有数字必须来自同一个集合,此函数才能返回 TRUE。
*ret_script
,如果 ret_script
不为 NULL,则在返回 TRUE 时将包含找到的脚本,使用 SCX_enum
typedef。如果函数返回 FALSE,则其值为 SCX_INVALID
。
如果序列为空,则返回 TRUE,但 *ret_script
(如果需要)将为 SCX_INVALID
。
如果序列包含一个代码点,该代码点在所用 Unicode 版本中未分配给字符,则该函数将返回 TRUE,并且脚本将为 SCX_Unknown
。输入序列中任何其他组合的未分配代码点将导致函数将输入视为不是脚本运行。
返回的脚本将为 SCX_Inherited
,当且仅当其中的所有代码点都来自继承脚本。
否则,返回的脚本将为 SCX_Common
,当且仅当其中的所有代码点都来自继承脚本或通用脚本。
bool isSCRIPT_RUN(const U8 *s, const U8 *send,
const bool utf8_target)
is_utf8_non_invariant_string
如果 "perlapi 中的 is_utf8_invariant_string" 对字符串 s
的前 len
个字节返回 FALSE,但它们仍然是合法的 Perl 扩展 UTF-8,则返回 TRUE;否则返回 FALSE。
TRUE 返回意味着序列表示的至少一个代码点要么是不能表示为单个字节的宽字符,要么其表示方式取决于序列是使用 UTF-8 编码还是未编码。
另请参见 "perlapi 中的 is_utf8_invariant_string"
、"perlapi 中的 is_utf8_string"
bool is_utf8_non_invariant_string(const U8 * const s, STRLEN len)
utf8n_to_uvuni
已弃用!
计划在 Perl 的未来版本中移除 utf8n_to_uvuni
。不要在新代码中使用它;从现有代码中移除它。
请改用 "perlapi 中的 utf8_to_uvchr_buf",或在极少数情况下,使用 "perlapi 中的 utf8n_to_uvchr"。
此函数对于希望处理 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 的未来版本中移除 utf8_to_uvuni
。不要在新代码中使用它;从现有代码中移除它。
返回字符串 s
中第一个字符的 Unicode 代码点,该字符串被认为是 UTF-8 编码;retlen
将被设置为该字符的字节长度。
某些(但并非全部)UTF-8 畸形会被检测到,实际上,某些畸形输入会导致读取超出输入缓冲区的末尾,这是此函数被弃用的原因之一。另一个原因是,只有在极少数情况下,Unicode 与本机代码点才与您相关。
如果 s
指向检测到的畸形之一,并且启用了 UTF8 警告,则返回零,并且 *retlen
被设置为(如果 retlen
不指向 NULL) -1。如果这些警告被关闭,则计算出的值(如果定义良好,否则为 Unicode 替换字符)将被静默返回,并且 *retlen
被设置为(如果 retlen
不为 NULL)以便 (s
+ *retlen
) 是 s
中可能开始非畸形字符的下一个位置。有关何时返回替换字符的详细信息,请参阅 "perlapi 中的 utf8n_to_uvchr"。
UV utf8_to_uvuni(const U8 *s, STRLEN *retlen)
uvoffuni_to_utf8_flags
此函数仅应在非常特殊的情况下使用。相反,几乎所有代码都应该使用 "perlapi 中的 uvchr_to_utf8" 或 "perlapi 中的 uvchr_to_utf8_flags"。
此函数类似于它们,但输入是严格的 Unicode(而不是本机)代码点。只有在极少数情况下,代码才不应该使用本机代码点。
有关详细信息,请参阅 "perlapi 中的 uvchr_to_utf8_flags" 的描述。
U8 * uvoffuni_to_utf8_flags(U8 *d, UV uv, UV flags)
valid_utf8_to_uvchr
类似于 "perlapi 中的 utf8_to_uvchr_buf",但仅应在已知输入 UTF-8 字符串 s
中的下一个字符格式良好时调用(例如,它通过了 "perlapi 中的 isUTF8_CHAR")。允许使用代理、非字符代码点和非 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 代码可能运行得过于接近内部。提供有效的用例可能会改变这一点。
另请参阅 "perlapi 中的 is_utf8_invariant_string" 和 "perlapi 中的 is_utf8_invariant_string_loc"。
Size_t variant_under_utf8_count(const U8 * const s,
const U8 * const e)
my_popen_list
在某些系统上为 PerlProc_popen_list() 实现函数
PerlIO * my_popen_list(const char *mode, int n, SV **args)
my_socketpair
在没有 socketpair(2) 的系统上模拟它,但这些系统具有足够的模拟功能。
int my_socketpair(int family, int type, int protocol, int fd[2])
版本控制中目前没有内部 API 项目
deprecate
Perl_ck_warner_d() 的包装器,用于在给定类别中生成弃用警告,并附带适当的消息。message
参数必须是 C 字符串。字符串 " is deprecated" 将自动添加到 message
的末尾。
deprecate(U32 category, "message")
deprecate_disappears_in
这是 Perl_ck_warner_d() 的包装器,用于在给定类别中生成弃用警告,并提供一条适当的消息,指出该消息所指代的结构将在特定版本中消失。when
和 message
参数必须是 C 字符串。when
字符串应采用 "5.40" 的形式,版本号中没有次要元素。实际输出的消息将是以下表达式的结果:message " is deprecated, and will disappear in Perl " when
,这就是为什么 message
和 when
必须是文字 C 字符串的原因。
deprecate_disappears_in(U32 category, "when", "message")
deprecate_fatal_in
这是 Perl_ck_warner_d() 的包装器,用于在给定类别中生成弃用警告,并提供一条适当的消息,指出该消息所指代的结构将在特定版本中变为致命错误。when
和 message
参数必须是 C 字符串。when
字符串应采用 "5.40" 的形式,版本号中没有次要元素。实际输出的消息将是以下表达式的结果:message " is deprecated, and will become fatal in Perl " when
,这就是为什么 message
和 when
必须是文字 C 字符串的原因。
deprecate_fatal_in(U32 category, "when", "message")
PL_dowarn
该 C 变量大致对应于 Perl 的 $^W
警告变量。但是,$^W
被视为布尔值,而 PL_dowarn
是一个标志位集合。
在多线程 Perl 中,每个线程都有此变量的独立副本;每个副本在创建时都使用创建线程副本的当前值进行初始化。
U8 PL_dowarn
report_uninit
打印适当的 "使用未初始化变量" 警告。
void report_uninit(const SV *uninit_sv)
目前 XS 中没有内部 API 项目。
本节列出了未记录的元素。如果您使用其中任何一个,请考虑创建并提交其文档。
实验性和已弃用的未记录元素在最后单独列出。
abort_execution
add_above_Latin1_folds
add_cp_to_invlist
_add_range_to_invlist
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
any_dup
append_utf8_from_native_byte
apply
atfork_lock
atfork_unlock
av_arylen_p
av_extend_guts
av_iter_p
av_nonelem
av_reify
bind_match
block_gimme
boot_core_builtin
boot_core_mro
boot_core_PerlIO
boot_core_UNIVERSAL
build_infix_plugin
_byte_dump_string
call_list
cando
capture_clear
cast_iv
cast_i32
cast_ulong
cast_uv
check_hash_fields_and_hekify
check_regnode_after
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_helemexistsor
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
ck_trycatch
ckwarn
ckwarn_d
class_add_ADJUST
class_add_field
class_apply_attributes
class_apply_field_attributes
class_prepare_initfield_parse
class_prepare_method_parse
class_seal_stash
class_set_field_defop
class_setup_stash
class_wrap_method_body
clear_defarray
closest_cop
cmpchain_extend
cmpchain_finish
cmpchain_start
cmp_desc
cmp_locale_desc
cntrl_to_mnemonic
construct_ahocorasick_from_trie
cop_file_avn
coresub_op
croak_caller
croak_kw_unless_class
croak_memory_wrap
croak_no_mem
croak_popstack
csighandler
csighandler1
csighandler3
current_re_engine
custom_op_get_field
cv_clone_into
cv_const_sv_or_av
cvgv_from_hek
cvgv_set
cvstash_set
cv_undef_flags
cx_dump
cx_dup
cxinc
deb_stack_all
debstackptrs
debug_hash_seed
debug_peep
debug_show_study_flags
debug_studydata
defelem_target
despatch_signals
die_unwind
do_aexec
do_aexec5
do_aspawn
do_eof
does_utf8_overflow
do_exec
do_exec3
dofile
do_gv_dump
do_gvgv_dump
do_hv_dump
doing_taint
do_ipcctl
do_ipcget
do_magic_dump
do_msgrcv
do_msgsnd
do_ncmp
do_op_dump
do_pmop_dump
do_print
do_readline
doref
do_seek
do_semop
do_shmio
do_spawn
do_spawn_nowait
do_sv_dump
do_sysseek
do_tell
do_trans
do_uniprop_match
do_vecget
do_vecset
do_vop
drand48_init_r
drand48_r
dtrace_probe_call
dtrace_probe_load
dtrace_probe_op
dtrace_probe_phase
dump_all_perl
dump_indent
dump_packsubs_perl
dump_sub_perl
dump_sv_child
dumpuntil
dump_vindent
dup_warnings
find_first_differing_byte_pos
find_lexical_cv
find_runcv_where
find_script
foldEQ_latin1_s2_folded
foldEQ_latin1
foldEQ_utf8_flags
force_locale_unlock
_force_out_malformed_utf8_message
form_alien_digit_msg
form_cp_too_large_msg
free_tied_hv_pool
free_tmps
get_and_check_backslash_N_name
get_ANYOFHbbm_contents
get_ANYOFM_contents
get_db_sub
get_debug_opts
get_deprecated_property_msg
getenv_len
get_extended_os_errno
get_hash_seed
get_invlist_iter_addr
get_invlist_offset_addr
get_invlist_previous_index_addr
get_mstats
get_prop_definition
get_prop_values
get_regclass_aux_data
get_re_gclass_aux_data
get_regex_charset_name
get_win32_message_utf8ness
gp_free
gp_ref
grok_bin_oct_hex
grok_bslash_c
grok_bslash_o
grok_bslash_x
gv_check
gv_fetchmeth_internal
gv_override
gv_setref
gv_stashpvn_internal
he_dup
hek_dup
hfree_next_entry
hv_auxalloc
hv_common
hv_common_key_len
hv_delayfree_ent
hv_free_ent
hv_placeholders_p
hv_pushkv
hv_rand_set
hv_undef_flags
infix_plugin_standard
init_argv_symbols
init_constants
init_dbargs
init_debugger
init_i18nl10n
init_named_cv
init_stacks
init_tm
init_uniprops
_inverse_folds
invert
invlist_array
_invlist_array_init
invlist_clear
invlist_clone
_invlist_contains_cp
invlist_contents
_invlist_dump
_invlistEQ
invlist_extend
invlist_highest
_invlist_intersection
_invlist_intersection_maybe_complement_2nd
_invlist_invert
invlist_is_iterating
invlist_iterfinish
invlist_iterinit
invlist_iternext
_invlist_len
invlist_max
invlist_previous_index
_invlist_search
invlist_set_len
invlist_set_previous_index
_invlist_subtract
invlist_trim
_invlist_union
_invlist_union_maybe_complement_2nd
invmap_dump
invoke_exception_hook
io_close
isFF_overlong
is_grapheme
_is_in_locale_category
is_invlist
is_ssc_worth_it
_is_uni_FOO
_is_uni_perl_idcont
_is_uni_perl_idstart
is_utf8_char_helper_
is_utf8_common
is_utf8_FF_helper_
_is_utf8_FOO
is_utf8_overlong
_is_utf8_perl_idcont
_is_utf8_perl_idstart
jmaybe
join_exact
keyword
keyword_plugin_standard
list
load_charnames
locale_panic
localize
lossless_NV_to_IV
lsbit_pos32
lsbit_pos64
magic_clear_all_env
magic_cleararylen_p
magic_clearenv
magic_clearhook
magic_clearhookall
magic_clearisa
magic_clearpack
magic_clearsig
magic_copycallchecker
magic_existspack
magic_freearylen_p
magic_freecollxfrm
magic_freemglob
magic_freeovrld
magic_freeutf8
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_sethook
magic_sethookall
magic_setisa
magic_setlvref
magic_setmglob
magic_setnkeys
magic_setnonelem
magic_setpack
magic_setpos
magic_setregexp
magic_setsig
magic_setsigall
magic_setsubstr
magic_settaint
magic_setutf8
magic_setuvar
magic_setvec
magic_sizepack
magic_wipepack
make_trie
malloced_size
malloc_good_size
markstack_grow
mbtowc_
mem_collxfrm_
mem_log_alloc
mem_log_del_sv
mem_log_free
mem_log_new_sv
mem_log_realloc
mg_find_mglob
mg_size
mode_from_discipline
more_bodies
more_sv
moreswitches
mortal_getenv
mortalized_pv_copy
mro_get_private_data
mro_meta_dup
mro_meta_init
msbit_pos32
msbit_pos64
multiconcat_stringify
multideref_stringify
my_atof2
my_atof3
my_attrs
my_clearenv
my_lstat
my_lstat_flags
my_memrchr
my_mkostemp_cloexec
my_mkstemp_cloexec
my_stat
my_stat_flags
my_strerror
my_strftime8_temp
my_unexec
newFORM
_new_invlist
_new_invlist_C_array
newMETHOP_internal
newMYSUB
newPROG
new_stackinfo
newSTUB
newSVavdefelem
newXS_deffile
nextargv
no_bareword_allowed
no_bareword_filehandle
noperl_die
notify_parser_that_changed_to_utf8
oopsAV
oopsHV
op_clear
op_integerize
op_lvalue_flags
opmethod_stash
op_prune_chain_head
op_relocate_sv
opslab_force_free
opslab_free
opslab_free_nopad
op_std_init
op_varname
package
package_version
pad_add_weakref
padlist_store
padname_free
PadnameIN_SCOPE
padnamelist_free
parser_dup
parser_free
parser_free_nexttoke_ops
parse_unicode_opts
path_is_searchable
peep
perl_alloc_using
perl_clone_using
PerlEnv_putenv
PerlIO_context_layers
PerlIO_restore_errno
PerlIO_save_errno
PerlLIO_dup_cloexec
PerlLIO_dup2_cloexec
PerlLIO_open_cloexec
PerlLIO_open3_cloexec
PerlProc_pipe_cloexec
PerlSock_accept_cloexec
PerlSock_socket_cloexec
PerlSock_socketpair_cloexec
perly_sighandler
pmruntime
POPMARK
populate_anyof_bitmap_from_invlist
populate_bitmap_from_invlist
populate_invlist_from_bitmap
populate_isa
pregfree
pregfree2
ptr_hash
qerror
ReANY
reentrant_free
reentrant_init
reentrant_retry
reentrant_size
re_exec_indentf
ref
reg_add_data
regcurly
regdump
regdupe_internal
regexec_flags
regfree_internal
reginitcolors
reg_named_buff
reg_named_buff_all
reg_named_buff_exists
reg_named_buff_fetch
reg_named_buff_firstkey
reg_named_buff_iter
reg_named_buff_nextkey
reg_named_buff_scalar
regnext
regnode_after
reg_numbered_buff_fetch
reg_numbered_buff_fetch_flags
reg_numbered_buff_length
reg_numbered_buff_store
regprop
reg_qr_package
reg_skipcomment
reg_temp_copy
re_indentf
re_intuit_start
re_intuit_string
re_op_compile
report_evil_fh
report_redefined_cv
report_wrongway_fh
re_printf
rpeep
rsignal_restore
rsignal_save
rvpv_dup
rxres_save
same_dirent
save_bool
save_clearsv
save_delete
save_destructor
save_destructor_x
save_freeop
save_freepv
save_freesv
save_int
save_iv
save_I8
save_I16
save_I32
save_mortalizesv
save_pptr
save_pushi32ptr
save_pushptrptr
save_re_context
save_sptr
savestack_grow
savestack_grow_cnt
save_strlen
sawparens
scalar
scalarvoid
scan_commit
scan_num
seed
set_ANYOF_arg
set_caret_X
setfd_cloexec
setfd_cloexec_for_nonsysfd
setfd_cloexec_or_inhexec_by_sysfdness
setfd_inhexec
setfd_inhexec_for_sysfd
set_numeric_standard
set_numeric_underlying
set_padlist
_setup_canned_invlist
share_hek
should_warn_nl
should_we_output_Debug_r
sighandler
sighandler1
sighandler3
single_1bit_pos32
single_1bit_pos64
Slab_Alloc
Slab_Free
Slab_to_ro
Slab_to_rw
softref2xv
sortsv_flags_impl
ssc_finalize
ssc_init
stack_grow
str_to_version
strxfrm
study_chunk
sub_crush_depth
sv_add_backref
sv_buf_to_ro
sv_del_backref
sv_i_ncmp
sv_i_ncmp_desc
sv_2iv
sv_magicext_mglob
sv_ncmp
sv_ncmp_desc
sv_only_taint_gmagic
sv_or_pv_pos_u2b
sv_pvbyten_force_wrapper
sv_pvutf8n_force_wrapper
sv_resetpvn
sv_sethek
SvTRUE_common
sv_unglob
sv_2uv
switch_locale_context
sys_init
sys_init3
sys_intern_clear
sys_intern_dup
sys_intern_init
sys_term
tied_method
tmps_grow_p
_to_fold_latin1
TOPMARK
to_uni_fold
_to_uni_fold_flags
to_uni_lower
to_uni_title
to_uni_upper
_to_upper_title_latin1
_to_utf8_fold_flags
_to_utf8_lower_flags
_to_utf8_title_flags
_to_utf8_upper_flags
translate_substr_offsets
try_amagic_bin
try_amagic_un
uiv_2buf
unlnk
unshare_hek
unwind_paren
_utf8n_to_uvchr_msgs_helper
utf16_to_utf8_base
utf16_to_utf8_reversed
utf16_to_utf8
utf8_to_uvchr_buf_helper
utilize
uvoffuni_to_utf8_flags_msgs
uvuni_to_utf8
variant_byte_number
varname
vivify_defelem
vivify_ref
wait4pid
warn_elem_scalar_context
_warn_problematic_locale
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
以下是实验性的未记录元素
alloc_LOGOP cx_pushloop_for invlist_lowest
create_eval_scope cx_pushloop_plain newGP
cv_ckproto_len_flags cx_pushsub new_warnings_bitfield
cx_popblock cx_pushtry op_refcnt_dec
cx_popeval cx_pushwhen op_refcnt_inc
cx_popformat cx_topblock op_unscope
cx_popgiven delete_eval_scope scan_str
cx_poploop do_open_raw scan_word
cx_popsub do_open6 scan_word6
cx_popsub_args emulate_cop_io skipspace_flags
cx_popsub_common get_re_arg sv_free2
cx_popwhen get_vtbl sv_kill_backrefs
cx_pushblock gimme_V sv_setpv_freshbuf
cx_pusheval hv_backreferences_p sv_setsv_cow
cx_pushformat hv_kill_backrefs utf8_to_utf16_base
cx_pushgiven invlist_highest_range_start
最后是已弃用的未记录元素。不要在任何新代码中使用它们;从现有代码中删除所有这些元素的所有出现。
get_no_modify get_opargs get_ppaddr
自动文档系统最初是由 Benjamin Stuhl 添加到 Perl 核心中的。文档由任何愿意为其函数编写文档的人提供。
config.h, perlapi, perlapio, perlcall, perlclib, perlembed, perlfilter, perlguts, perlhacktips, perlinterp, perliol, perlmroapi, perlreapi, perlreguts, perlxs