我正在尝试理解我继承的一些XS代码.我一直在尝试为调用Perl魔法的部分添加注释,但我找不到任何文档来帮助我理解这一行:
SvRMAGICAL_off((SV *) myVar);
Run Code Online (Sandbox Code Playgroud)
什么是RMAGICAL
?在使用Perl魔术变量时应该何时打开或关闭?
Perlguts Illustrated非常有趣,并且有一些关于RMAGICAL的信息('R'代表'随机'),但它没有说什么时候搞乱它:http://cpansearch.perl.org/src/ RURBAN/illguts-0.42/index.html的
它是一个标志,指示变量是否具有"清除"魔法,当变量被清除时应该调用魔法(例如,当它被破坏时).mg_clear
当一个人尝试做类似的事情时,它被用来调用
undef %hash;
delete $a[4];
etc
Run Code Online (Sandbox Code Playgroud)
它的衍生信息mg_magical
应该永远不会被触及.mg_magical
将魔法添加到变量或从变量中删除时,将调用此标志来更新标志.如果附加到标量的任何魔法在其Magic Virtual Table中具有"清除"处理程序,则标量将设置为RMAGICAL.否则,它会被关闭.实际上,这会缓存信息以防止Perl重复检查附加到标量的所有魔法以获取此信息.
使用clear magic的一个示例:当清除%SIG条目时,魔术移除该信号的信号处理程序.
这是mg_magical
:
void
Perl_mg_magical(pTHX_ SV *sv)
{
const MAGIC* mg;
PERL_ARGS_ASSERT_MG_MAGICAL;
PERL_UNUSED_CONTEXT;
SvMAGICAL_off(sv);
if ((mg = SvMAGIC(sv))) {
do {
const MGVTBL* const vtbl = mg->mg_virtual;
if (vtbl) {
if (vtbl->svt_get && !(mg->mg_flags & MGf_GSKIP))
SvGMAGICAL_on(sv);
if (vtbl->svt_set)
SvSMAGICAL_on(sv);
if (vtbl->svt_clear)
SvRMAGICAL_on(sv);
}
} while ((mg = mg->mg_moremagic));
if (!(SvFLAGS(sv) & (SVs_GMG|SVs_SMG)))
SvRMAGICAL_on(sv);
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
241 次 |
最近记录: |