如何z在 sub 中模拟 sub 行为XS?
package XS;
sub hello {
print "ARGS: >>@_<<\n";
my $lvl;
while( my @frame = caller( $lvl++ ) ) {
print ">>@frame[0..4]<<\n";
}
}
sub z {
&hello;
}
在我的.xs文件中,我有:
void
call_perl() {
call_pv( "XS::hello", G_NOARGS );
}
void
test(...)
CODE:
call_perl();
但是调用XS::test(1,2,3)不会将任何参数传递给hello.
输出:
ARGS: >><<
>>main -e 1 XS::hello <<
在这里我们可以看到由于$hasargsflag没有设置G_NOARGflag,但是为什么@_会刷新呢?我错过了什么?
UPD
似乎找到了一半的答案。
G_NOARGS标志
具有不为 Perl 子例程创建 @_ 数组的效果。
当
XSUB调用 perl 时,不要为它创建框架(不记得在哪里描述过)并且不要@_为它填充(这里间接描述 )XSUB 使用宏 ST(x) 引用它们的堆栈参数
所以更精确的问题是:
如何将XSUB堆栈参数传播到PP子程序?
注意:我不能只使用:
call_pv( "XS::hello", 0 );
因为这是序数PP子调用。当它返回时,XSUB堆栈参数将被XS::hellosub的返回值替换
int count = call_pv( "XS::hello", 0 );
STAGAIN;
printf( "%s\n", SvPV_nolen( ST(0) ) );
所以我提供标志以便在调用sub后G_NOARGS能够访问堆栈参数XSUBPP