问题标签 [perlapi]

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 回答
99 浏览

perl - Why callback is not called?

I have the example script from B::OPCheck module with modified PL_op_name to padsv

But callback is not called.

When deparsing this program I can see this OP:

Why callback is not called?

UPD
It seems here is the answer:

For most (but not all) types of op, once the op has been initially built and populated with child ops it will be filtered through the check function referenced by the appropriate element of this array

But where to find the list of ops which will be filtered through the check function?

0 投票
1 回答
142 浏览

perl - 我应该在不会返回到堆栈上的 Perl 的 SV 上调用 SvREFCNT_dec() 吗?

从 Perl 调用 C 函数时,例如使用Inline::C

哪里test.c是:

无论我是否打电话,该脚本似乎都可以正常工作SvREFCNT_dec(sv_variable)。根据perlguts

要释放您创建的 SV,请调用 SvREFCNT_dec(SV*)。通常不需要这个调用

0 投票
1 回答
42 浏览

perl - 在哪里可以找到 PL_check 过滤的操作类型?

PL_check是 Perl 公共 API 公开的变量:

数组,由操作码索引,在 Perl 代码编译期间将在 optree 构建的“检查”阶段调用的函数。对于大多数(但不是全部)类型的操作,一旦最初构建操作并使用子操作填充操作,它将通过该数组的适当元素引用的检查函数进行过滤。

在源代码的哪里可以看到哪些类型的操作码将被过滤?

0 投票
1 回答
186 浏览

perl - 如何从 perl XS 中找到当前的包名?

为了获取当前上下文,我caller_cxperlapi. 但是没有关于结构的描述。在 perl 源代码perl.h中,我只能找到这个typedef

是否有示例如何使用返回的结构caller_cx从 XS 中查找当前包?

0 投票
3 回答
225 浏览

perl - 有没有办法从 XS 访问 perl 中的特殊标记?

在 perl 中,诸如__PACKAGE__, __SUB__, __FILE__,之类的特殊标记__LINE__存在并且可从脚本中获得。

__PACKAGE__我想我可能会从XSas中获得价值HvNAME( PL_currstash )
但是如何访问其他人?

是否有特殊的界面可以访问所有这些XS?比如:CTX->packageCTX->sub

0 投票
1 回答
285 浏览

perl - 标志“pIOK”是什么意思?

当倾倒 perl SV 时,Devel::Peek我可以看到:

但找不到描述是什么pIOK意思。

我试着看它,,,,Devel::Peek......在我发现的来源perlapiperlgutsperlxs

但还是找不到是什么SVp_IOK。它是什么?

UPD
我找到了这个文件。它阐明了标志的含义以及它们的位置。(注意这个 DOC 有点过时了)

在此处输入图像描述

此标志指示对象具有有效的非公共 IVX 字段值。它只能为值类型 SvIV 或其子类型设置。

UPD

为什么私有和公共标志不同

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