Wie schreibe ich ein Perl-Konstruktor in XS?
Frage
Ich versuche, neues XS-Modul für Perl zu schreiben. Ich habe durch folgende XS-Modul Schreibbefehl getestet und es funktioniert gut.
Ich bin nicht in der Lage zu verstehen, wie ich new
Methode für XS
Ich habe ein Paket namens Agent
. Ich möchte so etwas wie dies zu:
my $agent_object = new Agent;
Lösung
Ich habe die Antwort von XS Mechanik .
Danke für Ihre Hilfe
Andere Tipps
Der folgende Code implementiert eine typische
sub new {
my $class = shift;
return bless {@_} => $class;
}
Konstruktor in XS. Es kopiert wörtlich aus Class :: XSAccessor . Ich würde vorschlagen, Sie Class :: XSAccessor für die Fälle untersuchen, wenn Sie ein gewöhnliches Hash-basiertes Objekt verwenden. Keine Notwendigkeit, dieses Rad neu zu erfinden.
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));
Wenn Ihr Agent.xs enthält:
class Agent {
public:
Agent() {
// constructor stuff
}
nicht XS so nennen Konstruktor automatisch, wenn Sie sagen, Agenten-> neu?