Question

Je suis en train d'écrire le nouveau module XS pour Perl. Je l'ai testé en suivant l'instruction d'écriture du module XS et il fonctionne très bien.

Je ne suis pas en mesure de comprendre comment j'écrire méthode new pour XS

J'ai un paquet appelé Agent. Je veux être en mesure de quelque chose comme ceci:

my $agent_object = new Agent;
Était-ce utile?

La solution

Je suis la réponse de Mécanique XS .

Merci pour votre aide

Autres conseils

Le code suivant implémente un type

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

constructeur dans XS. Il est copié mot pour mot de Class :: XSAccessor . Je vous suggère de enquêtez Class :: XSAccessor pour les cas lorsque vous utilisez un objet en fonction de hachage ordinaire. Pas besoin de réinventer cette roue.

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));

Si votre Agent.xs contient:

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

ne pas XS appeler ce constructeur automatiquement lorsque vous dites Agent-> nouveau?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top