从XS访问存储在perl对象(祝福散列)中的值

我有一个像这样的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 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     
已邀请:
SvRV
将从参考中获取哈希值(如
SV*
),
MUTABLE_HV
将其转换为
HV*
hv_fetch
/
hv_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;
    
如果您使用的是“标准”对象,那么它只是一个哈希值,因此您可以使用HV方法。参见例如http://perldoc.perl.org/perlguts.html#Working-with-HVs(实际上,整个perlguts页面对此很好读...) 您对该对象的SV *是一个引用,因此您可以使用SvRV“取消引用”它,将其转换为HV以传递给hv_xxx函数(例如hv_fetch)。 祝你好运!     

要回复问题请先登录注册