perl - 什么是RMAGICAL?

标签 perl xs

我试图了解我继承的一些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/

相关文章:

perl - 为什么在警报信号处理程序中没有死亡杀死进程?

perl - 定义和转换 Moose 属性类型的正确方法

perl - 测试使用 Dist::Zilla 的 XS 模块

perl - 您如何检查对象是否重载了 XS 中的运算符?

c - 如何在 Perl API 中内省(introspection)正则表达式

perl - 如何在 emacs 中使用 cscope 导航 perl 代码?

perl - 扩展 Moose 对象类的构造顺序是什么?

html - 远程 IP 地址

perl - 使用 Perl XS 和 PerlIO 使旧库工作