4

このような perl オブジェクト (ハッシュへの祝福された参照) があります。

sub funcname {
  #some code
}

my $o = My::Class->new();
$o->{internal_data} = \&funcname; #I know it is not nice

$o 参照がある XS コードの別の場所で、 の値を取得する必要があります$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*参照からハッシュを ( として) 取得し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 に答える