4

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

4

2 回答 2

5

SvRVSV*将从引用中获取哈希(作为 an ),MUTABLE_HV将其转换为 an 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;
于 2011-04-06T21:28:17.700 回答
1

如果您使用的是“标准”对象,它实际上只是一个哈希,因此您可以使用 HV 方法。参见例如http://perldoc.perl.org/perlguts.html#Working-with-HVs (实际上,整个 perlguts 页面都可以很好地阅读...)

您对对象的 SV * 是一个引用,因此您可以使用 SvRV 来“取消引用”它,将其转换为 HV 以传递给 hv_xxx 函数(例如 hv_fetch)。

祝你好运!

于 2011-04-06T21:26:43.520 回答