什么是RMAGICAL?

Nat*_*enn 9 perl xs

我正在尝试理解我继承的一些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的

ike*_*ami 6

它是一个标志,指示变量是否具有"清除"魔法,当变量被清除时应该调用魔法(例如,当它被破坏时).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)