2009-09-30 41 views
3

我正在嘗試爲Perl編寫新的XS模塊。我已經通過以下XS模塊寫入說明進行了測試,並且工作正常。如何在XS中編寫Perl構造函數?

我不能夠理解我如何編寫XS

new方法我有一個名爲Agent包。我希望能是這樣的:

my $agent_object = new Agent; 
+3

一般情況下,避免使用間接對象符號,只需使用'Agent-> new'。 –

回答

0

如果您Agent.xs包含:

class Agent { 
public: 
    Agent() { 
    // constructor stuff 
    } 

不XS自動調用構造函數時,你說代理 - >新?

+0

不是。但看看ExtUtils :: XSpp。這可以做到。 – tsee

3

下面的代碼實現了XS典型

sub new { 
    my $class = shift; 
    return bless {@_} => $class; 
} 

構造。它是從Class::XSAccessor逐字複製的。我建議你調查Class :: XSAccessor的情況下,當您使用普通的基於散列的對象。沒有必要重新發明這個輪子。

void 
new(class, ...) 
    SV* class; 
    PREINIT: 
    unsigned int iStack; 
    HV* hash; 
    SV* obj; 
    const char* classname; 
    PPCODE: 
    if (sv_isobject(class)) { 
     classname = sv_reftype(SvRV(class), 1); 
    } 
    else { 
     if (!SvPOK(class)) 
     croak("Need an object or class name as first argument to the constructor."); 
     classname = SvPV_nolen(class); 
    } 

    hash = (HV *)sv_2mortal((SV *)newHV()); 
    obj = sv_bless(newRV((SV*)hash), gv_stashpv(classname, 1)); 

    if (items > 1) { 
     if (!(items % 2)) 
     croak("Uneven number of argument to constructor."); 

     for (iStack = 1; iStack < items; iStack += 2) { 
     hv_store_ent(hash, ST(iStack), newSVsv(ST(iStack+1)), 0); 
     } 
    } 
    XPUSHs(sv_2mortal(obj));