2011-04-06 49 views
3

我有一個像這樣的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 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

SvRV將讓你從參考的哈希(爲SV*),MUTABLE_HV將其轉換爲一個HV*hv_fetch/hv_fetchs將哈希取。

SV* obj; 
HV* obj_hash; 
SV** callback_ptr; 
SV* callback; 

obj = ...; 
obj_hash = MUTABLE_HV(SvRV(obj)); 
callback_ptr = hv_fetchs(obj_hash, "internal_data", 0); 
if (!callback_ptr) 
    croak("..."); 
callback = *callback_ptr; 

更新:現在用的codeY善良。

+0

非常感謝MUTABLE_HV訣竅 – kmx 2011-04-06 21:57:52

+0

@ kmx,'MUTABLE_HV(sv)'基本上是'(HV *)sv',除非它更安全,因爲它會爲'const SV * const_sv; MUTABLE_HV(const_sv)'。 – ikegami 2011-04-07 06:09:53

+0

@ kmx,請記住,AsV和HV是SV的「子類」。 – ikegami 2011-04-07 06:10:59

1

如果您正在使用「標準」的對象,它是underlyingly只是一個哈希,所以你可以使用高壓方法。見例如(實際上,整個perlguts頁面會很好的讀取...)

你的SV *對象是一個引用,所以你可以使用SvRV來「解引用」它,將它轉換爲一個HV來傳遞到hv_xxx函數(例如hv_fetch)。

祝你好運!