Perl newXS()添加了闭包

Kon*_*ele 7 c++ perl xs

我想在一个c ++应用程序中嵌入Perl,并且正在寻找一种通过newXS()从perl调用c ++的方法.除了函数指针之外,我还需要一个自定义指针,指向newXS()创建的CV.指针包含C++上下文.我不想为此使用全局变量.有一个共同的方法来做到这一点?

在更广泛的范围内,问题可能是天气,有可能在newXS()创建的CV中添加闭包,以及在调用c函数时如何引用它.CvPADLIST()似乎是一个完美的地方,但是对于XSubs,当设置PERL_IMPLICIT_CONTEXT时使用它似乎是无效的(在perl的pad.c开头注释.它可以被忽略吗?).还有其他地方我可以放置CV本地数据吗?

Kon*_*ele 5

一种可能性是将PERL_MAGIC_ext魔法附加到SV,如perlguts中所述:

int  m_free (pTHX_ SV *sv, MAGIC* mg){ ... }
STATIC MGVTBL my_vtbl = { 0, 0, 0, 0, m_free, 0, 0, 0 };
struct ctx;

XS(XS_some_func)
{
    ...
    MAGIC *mg;
    if ((mg = mg_findext((SV*)cv, PERL_MAGIC_ext, &my_vtbl))) {
        ctx *priv = (ctx *)mg->mg_ptr;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

通过newXS()创建CV时分配魔法:

   ctx c;
   ...
   CV *cv = newXS(index, XS_some_func, __FILE__);
   MAGIC *mg = sv_magicext((SV *)cv,
                            0,
                            PERL_MAGIC_ext,
                            &my_vtbl,
                            (const char*)&c,
                            sizeof(c));
Run Code Online (Sandbox Code Playgroud)


nwe*_*hof 3

其中有一个ANY插槽CV可用于自定义数据并通过CvXSUBANY(cv). 例如:

CvXSUBANY(cv).any_ptr = my_ptr;
Run Code Online (Sandbox Code Playgroud)

该槽通常用于存储XS ALIAS的索引和XS INTERFACE的函数指针。