我已经浏览了Data :: Dumper的源代码.在这个包中,我不明白DumpXS发生了什么.这个DumpXS有什么用?
我已经搜索了这个,我读到它,它等于Dump
函数,它比它更快Dump
.但我不明白.
我为一个包含约80个函数的C库编写了一个Perl XS包装器.现在我的一般策略是用C函数替换错误,PL_sv_undef
并且调用Perl代码必须明确检查返回是否不是undef
.(对于某些C函数,它更复杂,因为我将它们的输出转换为HV
/ AV
并使用空列表来报告错误.)
现在,当我开始使用该库编写更大的Perl脚本时,我想简化错误处理并使用例如通常eval {}
/ die
类似异常的机制来处理错误.
目前,我的XS中的简单XSUB看起来像这样:
SV *
simple_function( param1, param2 = 0, param3 = 0)
int param1
int param2
int param3
CODE:
int rc;
rc = simple_function( param1, param2, param3 );
RETVAL = (rc == 0) ? &PL_sv_yes : &PL_sv_undef;
OUTPUT:
RETVAL
Run Code Online (Sandbox Code Playgroud)
我已经看到一些模块有die
关于错误的"RaiseError"的全局标志,但未能找到任何我可以借用的例子.我发现的几个模块处理里面的"RaiseError"标志.pm
,而不是在里面.xs
,因此允许使用Perl die
.在我的情况下,在.pm
很多函数内部很难实现需要特殊的错误检查.这也会导致代码重复,因为检查已经存在于XS内部.
我发现perlxs
/ perlguts
文档中没有任何相关内容.特别是,我已经看到了将呼叫Perl_croak()
在.c
从我的产生.xs
,但未能找到该功能的任何文件.
什么是XS的Perl模拟die
?或者XSUB如何报告Perl运行时函数失败并且没有RETVAL返回?如何正确设置$@ …
我有一个像这样的perl对象(祝福哈希的引用).
sub funcname {
#some code
}
my $o = My::Class->new();
$o->{internal_data} = \&funcname; #I know it is not nice
Run Code Online (Sandbox Code Playgroud)
在XS代码中的某个地方,我有$ o引用,我需要获取值$o->{internal_data}
.
/* at some point in XS code */
SV *obj = ... /* $o value passed to a XS function */
SV *func;
...
/* here I do not know how to load $o->{internal_data} value into func */
...
call_sv(func,G_SCALAR);
Run Code Online (Sandbox Code Playgroud)
perl中可能还有一些章节(api | xstut | guts | ???).我只是无法找到它.
提前感谢任何提示.
- kmx
尝试使用perl数据结构(部分作为支持C中的关联数组的方式),但以下程序不断崩溃.它编译得很好但会在newSVpv()上崩溃.不知道为什么.
#include <EXTERN.h> /* from the Perl distribution */
#include <perl.h> /* from the Perl distribution */
static PerlInterpreter *my_perl; /*** The Perl interpreter ***/
int main(int argc, char **argv, char **env) {
char *proto = "http";
SV* ret = newSVpv("http", 4);
sv_catpvn(ret, "://", 3);
STRLEN len = 1;
char *result = SvPV(ret, len);
printf("result: %p %d\n", result, len);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译它的行是
gcc -g -o interp te1.c `perl -MExtUtils::Embed -e ccopts -e ldopts`
Run Code Online (Sandbox Code Playgroud)
我所拥有的perl是在Ubuntu 12.04.4 LTS上运行的5.14.2.
谢谢你的任何提示!
更新:添加了gdb跟踪.谢谢你的询问.gdb跟踪:
Program …
Run Code Online (Sandbox Code Playgroud) 在XS中,如何将包含变量名称的字符串转换为其地址,我想执行以下perl代码:
our $var = 1;
print ${$main::{var}};
Run Code Online (Sandbox Code Playgroud) 我最近开始学习Ada,并且知道Ada和C对象文件可以链接在一起构建一个多语言程序或库,是否可以使用XS从Perl调用Ada代码?
在查看Perl API时,我想知道为什么
sv_setref_iv()
将其IV
参数存储在IV
插槽中,sv_setref_nv()
将其NV
参数存储在NV
插槽中,sv_setref_pv()
将其void *
参数存储在IV
插槽中,而不是PV
插槽中?我有预感(CUR和LEN字段对于这样的变量没有意义),但我想得到XS知识渊博的人的意见:-)
我是Perl XS的新手,我正在尝试将C函数转换为Perl子例程.
我有以下C函数
void parse(struct parser *result, const char *string, size_t len);
Run Code Online (Sandbox Code Playgroud)
其中parse
函数接受的指针struct parser
,一个字符串,该字符串的长度.struct parser
定义如下:
struct parser {
char *data;
long a;
long b;
long c;
};
Run Code Online (Sandbox Code Playgroud)
该函数将其结果存储在result
参数中.
我想将此函数转换为Perl XS.我在做什么是这样的:
struct parser *result
parse_xs (string)
const char* string
PREINIT:
long len = strlen(string);
CODE:
struct parser par;
parse(&par,s,len);
RETVAL = par;
OUTPUT:
RETVAL
Run Code Online (Sandbox Code Playgroud)
如何更改上面的代码以parse_xs
在这样的Perl代码中运行
my $result = parse_xs();
print $result->data; # will print the data field from the struct.
Run Code Online (Sandbox Code Playgroud)
C函数 …
我目前正在编写我的第一个 XS 模块(只是一个围绕 C 数学库的包装器),并取得了不错的成功。最大的问题是文档很难理解和/或不完整。
我已经成功地在 XS 中编写了一个构造函数,并从库中实现了一些函数作为方法调用。这很好用。
现在我也想实现一个程序接口。出于这个原因,我需要知道它是否是方法调用。如果它是一个方法调用,用函数计算的数字存储在实例中,如果它是对函数的过程调用,它的数字作为第一个参数给出。这是余弦函数的当前代码:
double
cos(...)
CODE:
SV *arg = newSVsv(ST(0));
if (sv_isobject(arg)) {
HV *self_hv = MUTABLE_HV(SvRV(arg));
SV **callback_ptr = hv_fetchs(self_hv, "Number", 0);
SV *zahl = *callback_ptr;
}
else {
SV *zahl = newSVnv(arg);
}
double x = SvNV(zahl);
RETVAL = cos(x);
OUTPUT:
RETVAL
Run Code Online (Sandbox Code Playgroud) 是否有宏提供正确printf
的格式说明IV
,UV
,STRLEN
,Size_t
和SSize_t
?perlapi 中没有列出。
C 为 提供的类型的格式说明符提供了宏stdint.h
,例如uint32_t
.
#include <inttypes.h>
#include <stdint.h>
uint32_t i = ...;
printf("i = %" PRIu32 "\n", i);
Run Code Online (Sandbox Code Playgroud)
有没有类似于PRIu32
for IV
, UV
, STRLEN
, Size_t
and 的东西SSize_t
?
在更大的问题是,我想建议在Windows子系统的Linux Ubuntu上安装排序::键时产生以下编译警告修复:
Key.xs: In function ‘_keysort’:
Key.xs:237:12: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘IV {aka long int}’ [-Wformat=]
croak("unsupported sort …
Run Code Online (Sandbox Code Playgroud)