如何在XS中编写Perl构造函数?

3

我正在尝试编写一个新的Perl XS模块。我已经按照XS模块编写指南进行了测试,一切都运行良好。

我不知道如何编写XS的new方法。

我有一个名为Agent的包。我想要能够像这样做:

my $agent_object = new Agent;

4
一般情况下,避免使用间接宾语符号,直接使用Agent->new - Sinan Ünür
3个回答

4
以下代码实现了一个典型的
sub new {
  my $class = shift;
  return bless {@_} => $class;
}

XS中的构造函数。它是从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));

4

0
如果您的Agent.xs包含以下内容:
class Agent {
public:
  Agent() {
    // constructor stuff
  }

当你调用Agent->new时,XS不会自动调用那个构造函数吗?


不行。但是看一下 ExtUtils::XSpp。它可以实现这个。 - tsee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接