我有一个像这样的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;