我想在一个c ++应用程序中嵌入Perl,并且正在寻找一种通过newXS()从perl调用c ++的方法.除了函数指针之外,我还需要一个自定义指针,指向newXS()创建的CV.指针包含C++上下文.我不想为此使用全局变量.有一个共同的方法来做到这一点?
在更广泛的范围内,问题可能是天气,有可能在newXS()创建的CV中添加闭包,以及在调用c函数时如何引用它.CvPADLIST()似乎是一个完美的地方,但是对于XSubs,当设置PERL_IMPLICIT_CONTEXT时使用它似乎是无效的(在perl的pad.c开头注释.它可以被忽略吗?).还有其他地方我可以放置CV本地数据吗?
一种可能性是将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)
其中有一个ANY插槽CV可用于自定义数据并通过CvXSUBANY(cv). 例如:
CvXSUBANY(cv).any_ptr = my_ptr;
Run Code Online (Sandbox Code Playgroud)
该槽通常用于存储XS ALIAS的索引和XS INTERFACE的函数指针。