【发布时间】:2017-02-28 06:57:43
【问题描述】:
PL_check 是 Perl 公共 API 公开的变量:
由操作码索引的函数数组,这些函数将在 Perl 代码编译期间为 optree 构建的“检查”阶段调用。对于大多数(但不是全部)类型的操作,一旦操作被初始构建并填充了子操作,它将通过此数组的适当元素引用的检查函数进行过滤。
在源代码的哪里可以看到哪些类型的操作码会被过滤?
【问题讨论】:
PL_check 是 Perl 公共 API 公开的变量:
由操作码索引的函数数组,这些函数将在 Perl 代码编译期间为 optree 构建的“检查”阶段调用。对于大多数(但不是全部)类型的操作,一旦操作被初始构建并填充了子操作,它将通过此数组的适当元素引用的检查函数进行过滤。
在源代码的哪里可以看到哪些类型的操作码会被过滤?
【问题讨论】:
您可以检查所有类型的操作。如上所说,它是一个由操作码索引的数组。
如果您想知道哪些操作具有检查器,这可能会根据您加载的模块而有所不同。例如,autovivification 为
OP_PADANY,
OP_PADSV,
OP_AELEM,
OP_HELEM,
OP_RV2SV,
OP_RV2AV,
OP_RV2HV,
OP_ASLICE,
OP_HSLICE,
OP_EXISTS,
OP_DELETE,
OP_KEYS 和
OP_VALUES。
(其中一些可能已经有检查器,在这种情况下,autovivifaction 的新检查器将调用旧检查器。)
您可以通过查看opcode.h 中PL_check 的定义(由opcode.pl 生成)来查找哪些操作具有内置检查器。