问题标签 [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.
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?
perl - 在哪里可以找到 PL_check 过滤的操作类型?
PL_check
是 Perl 公共 API 公开的变量:
数组,由操作码索引,在 Perl 代码编译期间将在 optree 构建的“检查”阶段调用的函数。对于大多数(但不是全部)类型的操作,一旦最初构建操作并使用子操作填充操作,它将通过该数组的适当元素引用的检查函数进行过滤。
在源代码的哪里可以看到哪些类型的操作码将被过滤?
perl - 如何从 perl XS 中找到当前的包名?
为了获取当前上下文,我caller_cx
在perlapi
. 但是没有关于结构的描述。在 perl 源代码perl.h
中,我只能找到这个typedef
:
是否有示例如何使用返回的结构caller_cx
从 XS 中查找当前包?
perl - 有没有办法从 XS 访问 perl 中的特殊标记?
在 perl 中,诸如__PACKAGE__
, __SUB__
, __FILE__
,之类的特殊标记__LINE__
存在并且可从脚本中获得。
__PACKAGE__
我想我可能会从XS
as中获得价值HvNAME( PL_currstash )
。
但是如何访问其他人?
是否有特殊的界面可以访问所有这些XS
?比如:CTX->package
等CTX->sub
。
perl - 标志“pIOK”是什么意思?
当倾倒 perl SV 时,Devel::Peek
我可以看到:
但找不到描述是什么pIOK
意思。
我试着看它,,,,Devel::Peek
......在我发现的来源perlapi
中perlguts
:perlxs
但还是找不到是什么SVp_IOK
。它是什么?
UPD
我找到了这个文件。它阐明了标志的含义以及它们的位置。(注意这个 DOC 有点过时了)
此标志指示对象具有有效的非公共 IVX 字段值。它只能为值类型 SvIV 或其子类型设置。
UPD
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