从XS访问存储在perl对象(hash)中的值
我有一个像这样的perl对象(对哈希的引用)从XS访问存储在perl对象(hash)中的值,perl,xs,Perl,Xs,我有一个像这样的perl对象(对哈希的引用) sub funcname { #some code } my $o = My::Class->new(); $o->{internal_data} = \&funcname; #I know it is not nice 在XS代码中有$o引用的其他地方,我需要获取$o->{internal_data}的值 /* at some point in XS code */ SV *obj = ... /* $o value p
sub funcname {
#some code
}
my $o = My::Class->new();
$o->{internal_data} = \&funcname; #I know it is not nice
在XS代码中有$o引用的其他地方,我需要获取$o->{internal_data}
的值
/* at some point in XS code */
SV *obj = ... /* $o value passed to a XS function */
SV *func;
...
/* here I do not know how to load $o->{internal_data} value into func */
...
call_sv(func,G_SCALAR);
perl(api | xstut | guts |?)中可能有一些章节。我就是找不到
提前谢谢你的提示
--
kmx如果您使用的是“标准”对象,那么它在底层只是一个散列,因此您可以使用HV方法。参见例如(事实上,整个perlguts页面对于这个……来说都是很好的读物)
您对对象的SV*是一个引用,因此您可以使用SvRV“取消引用”该对象,将其转换为HV以传递给HV_xxx函数(例如HV_fetch)
祝你好运
SvRV
将从引用中获取散列(作为SV*
),MUTABLE\u HV
将其强制转换为anHV*
,HV\u fetchs
将从散列中获取
SV* self;
SV* obj_sv;
HV* obj_hv;
SV** callback_ptr;
SV* callback;
self = ...;
SvGETMAGIC(self);
if (!SvROK(self))
croak("Not a reference");
obj_sv = SvRV(self);
if (SvTYPE(obj_sv) != SVt_PVHV)
croak("Not a reference to a hash");
obj_hv = MUTABLE_HV(obj_sv);
callback_ptr = hv_fetchs(obj_hv, "internal_data", 0);
if (!callback_ptr)
croak("Malformed object");
callback = *callback_ptr;
@kmx,
可变_HV(sv)
基本上是(HV*)sv
,但它更安全,因为它会为常量sv*常量_sv发出错误;可变_HV(const_sv)
。只是出于兴趣:这个功能在哪里记录?我在谷歌上搜索了一下,找到了这个胎面,但我也想阅读一下关于它的文档,但“可变高压”似乎没有在perldocIt中记录,应该在perlapi中记录,但没有(尽管它在一个示例中使用)。在它们所在的源代码中有一些关于它们的文档。