gpt4 book ai didi

c - zend/php 是否为执行数据中某处的函数缓存哈希码?

转载 作者:行者123 更新时间:2023-12-02 01:45:06 24 4
gpt4 key购买 nike

编辑:明确地说,我想识别和跟踪被调用的函数,而不会在 class.function 的字符串上产生散列的成本和歧义。我希望 php 保留一些内部哈希值。

我正在开发一个扩展,我想要一种可靠的方法来获取特定 zend_execute_data->zend_function 的哈希码,而不需要在函数名上调用一些哈希函数的开销(无论如何都会导致与重载函数的冲突)。

_zend_execute_data.opline 有一个名为“extended_value”的字段,看起来它是针对 op1 中的某些内容设置了 zend_hash_function 的值,但前提是 op2 是常量。

if (opline->op2.op_type == IS_CONST) {
...
opline->extended_value = zend_hash_func(Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant) + 1);

我不确定 op2 类型 IS_CONST 是什么意思,我不确定这是否可靠。而且我不确定这个哈希码是用于函数定义,还是用于类中的特定实例。

编辑:我猜 IS_CONST 意味着函数不是对象实例的成员。

还有什么可以用作 execute_data->zend_function 的哈希码代理吗?

最佳答案

一个非常简单的方法是使用 zend_function * 本身的指针来索引到哈希表中。 IE。使用 (unsigned long) (uintptr_t) func 作为索引。

这种方法有一个警告:虽然函数/方法通常在脚本的生命周期内有一个唯一的zend_function *,但也有一些情况(比如__call magic) 其中分配了一个临时的 zend_function * 结构。在这些情况下,将在函数上设置 ZEND_ACC_CALL_VIA_HANDLER 标志。如果您也想支持这些情况,则必须为它们使用单​​独的机制。

关于c - zend/php 是否为执行数据中某处的函数缓存哈希码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26127581/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com