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

schreiben

Ich habe ein Paket namens Agent. Ich möchte so etwas wie dies zu:

my $agent_object = new Agent;
War es hilfreich?

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?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top