标签: xs

Perl的Data :: Dumper中的DumpXS有什么作用?

我已经浏览了Data :: Dumper的源代码.在这个包中,我不明白DumpXS发生了什么.这个DumpXS有什么用?

我已经搜索了这个,我读到它,它等于Dump函数,它比它更快Dump.但我不明白.

perl xs

5
推荐指数
1
解决办法
360
查看次数

Perl的XSUB怎么会死?

我为一个包含约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 perl-xs xs

5
推荐指数
1
解决办法
783
查看次数

从XS访问存储在perl对象(祝福散列)中的值

我有一个像这样的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 xs

4
推荐指数
1
解决办法
1084
查看次数

调用perl函数newSVpv()时C程序不断崩溃

尝试使用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)

c perl xs

4
推荐指数
1
解决办法
238
查看次数

在XS中,如何从名称中获取变量地址?

在XS中,如何将包含变量名称的字符串转换为其地址,我想执行以下perl代码:

our $var = 1;
print ${$main::{var}};
Run Code Online (Sandbox Code Playgroud)

perl xs

3
推荐指数
1
解决办法
143
查看次数

如何在使用XS的Perl程序中使用Ada模块?

我最近开始学习Ada,并且知道Ada和C对象文件可以链接在一起构建一个多语言程序或库,是否可以使用XS从Perl调用Ada代码?

perl gcc ada xs gnat

3
推荐指数
1
解决办法
351
查看次数

为什么sv_setref_pv()将其void*参数存储在IV插槽中?

在查看Perl API时,我想知道为什么

  • sv_setref_iv()将其IV参数存储在IV插槽中,
  • sv_setref_nv()将其NV参数存储在NV插槽中,
  • 但是sv_setref_pv()将其void *参数存储在IV插槽中,而不是PV插槽中?

我有预感(CUR和LEN字段对于这样的变量没有意义),但我想得到XS知识渊博的人的意见:-)

perl xs

3
推荐指数
1
解决办法
202
查看次数

在Perl XS中使用struct

我是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函数 …

c perl xs

3
推荐指数
1
解决办法
859
查看次数

Perl/XS 中的面向过程和面向对象的接口

我目前正在编写我的第一个 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)

perl xs

3
推荐指数
1
解决办法
219
查看次数

Perl API 类型的 printf 格式说明符

是否有宏提供正确printf的格式说明IVUVSTRLENSize_tSSize_tperlapi 中没有列出。


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)

有没有类似于PRIu32for IV, UV, STRLEN, Size_tand 的东西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)

perl xs

3
推荐指数
1
解决办法
96
查看次数

标签 统计

perl ×10

xs ×10

c ×2

ada ×1

gcc ×1

gnat ×1

perl-xs ×1