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

时间:2009-09-30 12:35:43

标签: perl perl-xs

我正在尝试为Perl编写新的XS模块。我已经通过遵循XS模块编写指令进行了测试,并且工作正常。

我无法理解如何为XS编写new方法

我有一个名为Agent的包。我想能够做到这样的事情:

my $agent_object = new Agent;

3 个答案:

答案 0 :(得分:3)

我从XS Mechanics得到了答案。

感谢您的帮助

答案 1 :(得分:3)

以下代码实现了典型的

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

答案 2 :(得分:0)

如果您的Agent.xs包含:

class Agent {
public:
  Agent() {
    // constructor stuff
  }
当你说Agent-&gt; new?

时,

不会自动调用该构造函数