问题标签 [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.
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(手动构建)
我怎样才能找到这个的根本原因?
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 版本中引入的?关于它们的使用是否有任何进一步的指导?究竟什么时候触发析构函数?大概在与FREETMPS
orLEAVE
宏相关的地方?
perl - 在一个项目中有多个 .xs 文件
在我的根 XS 文件中,我包含了其他 XS 文件,我必须这样做才能保持干净的项目结构:
一切正常,除了每次编辑 MySubpackage.xs 时我必须手动删除“MyPackage.c” - 否则更改不会得到反映。
每次更改 MySubpackage.xs 时,是否有一种简单的方法可以让 ExtUtils::MakeMaker 自动重建 MyModule.c?
perl - 如何从 XS 访问当前上下文?
当用户XS
从main::
包中调用时,我们不能使用
因为没有适用于main::
和适用于XSUB
DOC的框架
请注意,XSUB 不获取堆栈帧,因此 C 将返回紧邻 Perl 代码的信息
如何获取被调用的file:line
信息、范围提示等信息?XSUB
main::
perl - 如何使用来自另一个模块的 XSUB?
我正在编写XS
模块。并希望重用XS
.Sub::Indentify
在通常的 perl 模块的情况下,我可以这样做:
如何做同样的事情XS
?
UPD
我想调用函数get_code_info
而C
不是 perl 子例程
perl - `GvNAME` 和 `GvENAME` 有什么区别?
在 perl 源代码GvNAME
和GvENAME
. 两者都返回给定的名称gv
。但 second 代表有效名称。
转储名称我没有看到区别。
有人可以弄清楚有什么区别并提供显示它的例子吗?
UPD
因为这也与命名有关。HvNAME
vs有什么区别HvNAME_HEK
perl - 如何模拟来自 XS 的 &sname 调用?
如何z
在 sub 中模拟 sub 行为XS
?
在我的.xs
文件中,我有:
但是调用XS::test(1,2,3)
不会将任何参数传递给hello
.
输出:
在这里我们可以看到由于$hasargs
flag没有设置G_NOARG
flag,但是为什么@_
会刷新呢?我错过了什么?
UPD
似乎找到了一半的答案。
G_NOARGS标志
具有不为 Perl 子例程创建 @_ 数组的效果。
当
XSUB
调用 perl 时,不要为它创建框架(不记得在哪里描述过)并且不要@_
为它填充(这里间接描述 )XSUB 使用宏 ST(x) 引用它们的堆栈参数
所以更精确的问题是:
如何将XSUB
堆栈参数传播到PP
子程序?
注意:我不能只使用:
因为这是序数PP子调用。当它返回时,XSUB
堆栈参数将被XS::hello
sub的返回值替换
所以我提供标志以便在调用sub后G_NOARGS
能够访问堆栈参数XSUB
PP
perl - 是否有可能知道使用 `&sub` 调用了`XSUB`
当PP
sub 被调用时CX
,这个 sub 被创建。
通过访问这个上下文,CxHASARGS(CX_CUR())
我们可以检查这个子hasargs
是否。
但是对于XSUB
上下文没有创建,所以我们不能使用这个技巧。
是否有可能知道使用或不XSUB
调用?&sub
UPD在何时
查看来源。我们可以看到代码如何处理. 它访问然后稍后调用目标:pp_entersub
cv
XSUB
hasargs
PL_op->op_flags & OPf_STACKED
XSUB
如果我在我XSUB
做同样的检查可以PL_op->op_flags & OPf_STACKED
吗?
perl - 为什么数组变量名有魔力?这个是来做什么的?
从中获取变量的名称PAD_COMPNAME
表明该名称很神奇:
为什么我们需要变量名的魔法?这个是来做什么的?
perl - 如何将操作地址转换为正确的 B::OP?
在一个正在运行的 Perl 程序中,如果我有一个 Op 地址(通过B::Concise、Devel::Callsite或通过神秘的其他方式),是否有一种简单的方法可以将其转换为正确的 B::OP,无需步行操作码树?
为了使这一点更清楚,这里有一些代码:
运行此程序时,您会看到如下内容:
a and0x2026940
的地址也是如此,根据this有, ,方法。如果说地址,那将是另外一个方法的地址。B::OP
next()
sibling()
name()
0x20aa870
LISTOP
children()
我添加了 B::Concise 只是为了显示发生了什么。实际上,我不想遍历 optree,因为我假设/希望地址实际上是该列表所在的位置。
所以也许有两个部分,首先是B::Op
我认为是父类的地址,但之后我想知道我们在谈论哪种操作(UNOP,BINOP,LISTOP)。
如果我能完成铸件,第二部分可能很容易: allB::OP
都有一个name()
方法,所以我可以从中找出我拥有的 OP 子类。
编辑: ikegami 的解决方案现在是 Devel::Callsite 版本 1.0.1 的一部分,尽管它不太正确。