问题标签 [perl-xs]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
91 浏览

perl - 疑难解答 Math::PARI 在 mod_perl 中的崩溃

我构建(酿造)了自己的 perl,然后是 mod_perl 模块,然后安装了所有必需的 perl 库。

mod_perl 环境运行良好。使用 Math::PARI 的单行代码也可以使用,例如:

perl -MMath::Pari -e "使用 Math::Pari ':float', 'type_name'; 警告 type_name 22222222222222222222222;" t_INT 在 -e 第 1 行。

但是,当我启动 apache2/mod_perl 并尝试加载 Math::PARI 时,出现以下崩溃:

有关环境的更多信息:

  • Debian 7.11
  • perl-5.14.2(与系统 perl 相同,但使用 perlbrew 构建)
  • mod_perl2(手动构建)

我怎样才能找到这个的根本原因?

0 投票
1 回答
239 浏览

c - 在 XS 代码中安全地释放资源(在范围退出时运行析构函数)

我正在编写一个 XS 模块。我分配一些资源(例如malloc()or SvREFCNT_inc())然后做一些涉及 Perl API 的操作,然后释放资源。这在普通 C 中很好,因为 C 没有异常,但使用 Perl API 的代码可能会croak(),从而防止正常清理和泄漏资源。因此,除了相当简单的情况外,似乎不可能编写正确的 XS 代码。

当我croak()自己时,我可以清理到目前为止分配的任何资源,但我可能会croak()直接调用函数,这会避开我编写的任何清理代码。

伪代码来说明我的担忧:

那么如何安全地清理 XS 代码中的资源呢?如何注册一些在抛出异常或从 XS 代码返回到 Perl 代码时运行的析构函数?

到目前为止我的想法和发现:

  • 我可以创建一个在析构函数中运行必要清理的类,然后创建一个包含此类实例的凡人 SV。在未来的某个时候,Perl 将释放那个 SV 并运行我的析构函数。然而,这似乎相当倒退,必须有更好的方法。

  • XSAWYERX 的XS Fun小册子似乎详细讨论了 DESTROY 方法,但没有讨论源自XS 代码的异常的处理。

  • LEONT 的Scope::OnExit模块具有XS 代码使用SAVEDESTRUCTOR()SAVEDESTRUCTOR_X()宏。这些似乎没有记录。

  • Perl API将其列为公共但未记录的函数save_destructor()save_destructor_x()

  • Perl 的scope.h头文件(由 包含perl.h)声明SAVEDESTRUCTOR(f,p)SAVEDESTRUCTOR_X(f,p)宏,没有任何进一步的解释。从上下文和Scope::OnExit代码来看,f是一个函数指针和p一个将传递给f. pTHX__X 版本适用于使用宏参数声明的函数。

我在正确的轨道上吗?我应该酌情使用这些宏吗?它们是在哪个 Perl 版本中引入的?关于它们的使用是否有任何进一步的指导?究竟什么时候触发析构函数?大概在与FREETMPSorLEAVE宏相关的地方?

0 投票
0 回答
100 浏览

perl - 在一个项目中有多个 .xs 文件

在我的根 XS 文件中,我包含了其他 XS 文件,我必须这样做才能保持干净的项目结构:

一切正常,除了每次编辑 MySubpackage.xs 时我必须手动删除“MyPackage.c” - 否则更改不会得到反映。

每次更改 MySubpackage.xs 时,是否有一种简单的方法可以让 ExtUtils::MakeMaker 自动重建 MyModule.c?

0 投票
1 回答
49 浏览

perl - 如何从 XS 访问当前上下文?

当用户XSmain::包中调用时,我们不能使用

因为没有适用于main::和适用于XSUB DOC的框架

请注意,XSUB 不获取堆栈帧,因此 C 将返回紧邻 Perl 代码的信息

如何获取被调用的file:line信息、范围提示等信息?XSUBmain::

0 投票
0 回答
32 浏览

perl - 如何使用来自另一个模块的 XSUB?

我正在编写XS模块。并希望重用XS.Sub::Indentify

在通常的 perl 模块的情况下,我可以这样做:

如何做同样的事情XS

UPD
我想调用函数get_code_infoC不是 perl 子例程

0 投票
1 回答
78 浏览

perl - `GvNAME` 和 `GvENAME` 有什么区别?

在 perl 源代码GvNAMEGvENAME. 两者都返回给定的名称gv。但 second 代表有效名称。

转储名称我没有看到区别。

有人可以弄清楚有什么区别并提供显示它的例子吗?

UPD
因为这也与命名有关。HvNAMEvs有什么区别HvNAME_HEK

0 投票
1 回答
76 浏览

perl - 如何模拟来自 XS 的 &sname 调用?

如何z在 sub 中模拟 sub 行为XS

在我的.xs文件中,我有:

但是调用XS::test(1,2,3)不会将任何参数传递给hello.

输出:

在这里我们可以看到由于$hasargsflag没有设置G_NOARGflag,但是为什么@_会刷新呢?我错过了什么?

UPD
似乎找到了一半的答案。

  1. G_NOARGS标志

    具有不为 Perl 子例程创建 @_ 数组的效果。

  2. XSUB调用 perl 时,不要为它创建框架(不记得在哪里描述过)并且不要@_为它填充(这里间接描述

    XSUB 使用宏 ST(x) 引用它们的堆栈参数

所以更精确的问题是:

如何将XSUB堆栈参数传播到PP子程序?

注意:我不能只使用:

因为这是序数PP子调用。当它返回时,XSUB堆栈参数将被XS::hellosub的返回值替换

所以我提供标志以便在调用sub后G_NOARGS能够访问堆栈参数XSUBPP

0 投票
0 回答
81 浏览

perl - 是否有可能知道使用 `&sub` 调用了`XSUB`

PPsub 被调用时CX,这个 sub 被创建。
通过访问这个上下文,CxHASARGS(CX_CUR())我们可以检查这个子hasargs是否。

但是对于XSUB上下文没有创建,所以我们不能使用这个技巧。

是否有可能知道使用或不XSUB调用?&sub

UPD在何时
查看来源。我们可以看到代码如何处理. 它访问然后稍后调用目标:pp_entersubcvXSUBhasargsPL_op->op_flags & OPf_STACKEDXSUB

如果我在我XSUB做同样的检查可以PL_op->op_flags & OPf_STACKED吗?

0 投票
0 回答
61 浏览

perl - 为什么数组变量名有魔力?这个是来做什么的?

从中获取变量的名称PAD_COMPNAME表明该名称很神奇:

为什么我们需要变量名的魔法?这个是来做什么的?

0 投票
1 回答
100 浏览

perl - 如何将操作地址转换为正确的 B::OP?

在一个正在运行的 Perl 程序中,如果我有一个 Op 地址(通过B::ConciseDevel::Callsite或通过神秘的其他方式),是否有一种简单的方法可以将其转换为正确的 B::OP,无需步行操作码树?

为了使这一点更清楚,这里有一些代码:

运行此程序时,您会看到如下内容:

a and0x2026940的地址也是如此,根据this有, ,方法。如果说地址,那将是另外一个方法的地址。B::OPnext()sibling()name()0x20aa870LISTOPchildren()

我添加了 B::Concise 只是为了显示发生了什么。实际上,我不想遍历 optree,因为我假设/希望地址实际上是该列表所在的位置。

所以也许有两个部分,首先是B::Op我认为是父类的地址,但之后我想知道我们在谈论哪种操作(UNOP,BINOP,LISTOP)。

如果我能完成铸件,第二部分可能很容易: allB::OP都有一个name()方法,所以我可以从中找出我拥有的 OP 子类。

编辑: ikegami 的解决方案现在是 Devel::Callsite 版本 1.0.1 的一部分,尽管它不太正确。