我正在尝试为Perl编写新的XS模块。我已经通过遵循XS模块编写指令进行了测试,并且工作正常。
我无法理解如何为XS编写new
方法
我有一个名为Agent
的包。我想能够做到这样的事情:
my $agent_object = new Agent;
答案 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?时,不会自动调用该构造函数