如何使用PerlXS代码中的绑定文件句柄?
下面的最小示例定义了如何使用PerlXS代码中的绑定文件句柄?,perl,io,xs,Perl,Io,Xs,下面的最小示例定义了PerlIO_write的包装器: MODULE = My::FH PACKAGE = My::FH INCLUDE: const-xs.inc int write_fh (SV* fh, SV* str) CODE: STRLEN len char* buf = SvPV(str, len); PerlIO* io = IoIFP(sv_2io(fh)); if (io) { RETVAL = PerlIO_write(io, buf, len); }
PerlIO_write
的包装器:
MODULE = My::FH PACKAGE = My::FH
INCLUDE: const-xs.inc
int
write_fh (SV* fh, SV* str)
CODE:
STRLEN len
char* buf = SvPV(str, len);
PerlIO* io = IoIFP(sv_2io(fh));
if (io) {
RETVAL = PerlIO_write(io, buf, len);
} else {
croak("cannot use fh as a PerlIO handle");
}
OUTPUT:
RETVAL
在已创建的文件句柄上使用write\u fh
函数
使用
open$fh,print
在
io && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar)))
这是真的。要放在堆栈上的祝福对象是
SvTIED_obj(MUTABLE_SV(io), mg)
顺便说一下,XS编译器可以将非声明代码放在code
的内容之前,因此code
的内容不能以声明开头
CODE:
STRLEN len
char* buf = SvPV(str, len);
PerlIO* io = IoIFP(sv_2io(fh));
if (io) {
...
应该是
CODE:
{
STRLEN len
char* buf = SvPV(str, len);
PerlIO* io = IoIFP(sv_2io(fh));
if (io) {
...
}
或
print
使用call\u方法
在
io && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar)))
这是真的。要放在堆栈上的祝福对象是
SvTIED_obj(MUTABLE_SV(io), mg)
顺便说一下,XS编译器可以将非声明代码放在code
的内容之前,因此code
的内容不能以声明开头
CODE:
STRLEN len
char* buf = SvPV(str, len);
PerlIO* io = IoIFP(sv_2io(fh));
if (io) {
...
应该是
CODE:
{
STRLEN len
char* buf = SvPV(str, len);
PerlIO* io = IoIFP(sv_2io(fh));
if (io) {
...
}
或
在尝试理解pp_hot.c
在阅读《perlcall(3)
》一文时,我想到了以下几点:
代码。这有意义吗
MODULE = My::FH PACKAGE = My::FH
INCLUDE: const-xs.inc
int
write_fh (SV* fh, SV* str)
INIT:
STRLEN len;
char* buf = SvPV(str, len);
PerlIO* pio = IoIFP(sv_2io(fh));
CODE:
if (pio) {
RETVAL = PerlIO_write(pio, buf, len);
} else {
if (!SvROK(fh))
croak("fh is not a reference");
IO* io = GvIO(SvRV(fh));
if (io == NULL)
croak("fh is not a GLOB reference");
MAGIC* mg = SvTIED_mg((const SV*)io, PERL_MAGIC_tiedscalar);
if (mg == NULL)
croak("fh is not a tied filehandle");
SV* obj = SvTIED_obj(MUTABLE_SV(io), mg);
if (obj == NULL)
croak("???");
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSHs(obj);
XPUSHs(str);
PUTBACK;
RETVAL = call_method("PRINT", G_SCALAR);
if (i != 1)
croak("wrong number of return values (%i)", RETVAL);
SPAGAIN;
RETVAL=POPi;
PUTBACK;
FREETEMPS;
LEAVE;
}
OUTPUT:
RETVAL
在尝试理解
pp_hot.c
在阅读《perlcall(3)》一文时,我想到了以下几点:
代码。这有意义吗
MODULE = My::FH PACKAGE = My::FH
INCLUDE: const-xs.inc
int
write_fh (SV* fh, SV* str)
INIT:
STRLEN len;
char* buf = SvPV(str, len);
PerlIO* pio = IoIFP(sv_2io(fh));
CODE:
if (pio) {
RETVAL = PerlIO_write(pio, buf, len);
} else {
if (!SvROK(fh))
croak("fh is not a reference");
IO* io = GvIO(SvRV(fh));
if (io == NULL)
croak("fh is not a GLOB reference");
MAGIC* mg = SvTIED_mg((const SV*)io, PERL_MAGIC_tiedscalar);
if (mg == NULL)
croak("fh is not a tied filehandle");
SV* obj = SvTIED_obj(MUTABLE_SV(io), mg);
if (obj == NULL)
croak("???");
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSHs(obj);
XPUSHs(str);
PUTBACK;
RETVAL = call_method("PRINT", G_SCALAR);
if (i != 1)
croak("wrong number of return values (%i)", RETVAL);
SPAGAIN;
RETVAL=POPi;
PUTBACK;
FREETEMPS;
LEAVE;
}
OUTPUT:
RETVAL
哎呀,到处都是特例。。。我将尝试一下,谢谢。一些测试代码显示,绑定文件句柄的
svrmogic
为0,因此使用SvTIED_mg()
不起作用……我尝试了5个不同版本的Perl,从5.10.1到5.16.1,io
总是svrmogic
。代码:perl-MTie::Handle-MDevel::Peek-wE“tie*FH,'tie::StdHandle';Dump*FH{IO}”
您也可以调用一个perl子函数,它对XS代码进行打印。。。我将尝试一下,谢谢。一些测试代码显示,绑定文件句柄的svrmogic
为0,因此使用SvTIED_mg()
不起作用……我尝试了5个不同版本的Perl,从5.10.1到5.16.1,io
总是svrmogic
。代码:perl-MTie::Handle-MDevel::Peek-wE“tie*FH,'tie::StdHandle';Dump*FH{IO}”
您也可以调用一个perl子函数,它对XS代码执行打印。