我试图了解我继承的一些XS代码。我一直在尝试向调用Perl魔术内容的部分添加注释,但是找不到任何文档来帮助我理解这一行:
SvRMAGICAL_off((SV *) myVar);
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
它是由
mg_magical
计算得出的信息,永远不要被触摸。当将魔术添加到变量或从变量中删除魔术时,将调用mg_magical
来更新标志。如果附加在标量上的任何魔术在其Magic Virtual Table中具有“清除”处理程序,则标量将设置为RMAGICAL。否则,它将关闭。有效地,这可以缓存信息,以免Perl反复检查与标量相关的所有魔术以获取此信息。清除魔术的一个示例用法:清除%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);
}
}
关于perl - 什么是RMAGICAL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16527842/