どのように私はXSでPerlのコンストラクタを書くのですか?

StackOverflow https://stackoverflow.com/questions/1497836

  •  19-09-2019
  •  | 
  •  

質問

私はPerlのための新たなXSモジュールを記述しようとしています。私はXSモジュールの書き込み命令に従い、それが正常に動作していることでテストしています。

私はXSためnew方法を書く方法を理解することはできませんよ。

私はAgentというパッケージを持っています。私はこのようなものにできるようにしたい。

my $agent_object = new Agent;

他のヒント

次のコードは、典型的な実装

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

XSでコンストラクタ。これはクラス:: XSAccessorするからそのままコピーです。私はあなたが通常のハッシュベースのオブジェクトを使用しているときに、例のためにクラス:: 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));

あなたのAgent.xsが含まれている場合:

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

XSは、剤 - >新?

あなたが言う時に自動的にそのコンストラクタを呼び出すことはありません。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top