Commit d3f0e07df33 for php.net
commit d3f0e07df3360f7efb4c02fc5857e3ba74aa4a17
Author: Weilin Du <weilindu@php.net>
Date: Sun Aug 16 02:31:02 2026 +0800
Zend: Use pointer hash lookups for methods
diff --git a/Zend/zend_API.c b/Zend/zend_API.c
index a03ceb8cd28..b5bea957106 100644
--- a/Zend/zend_API.c
+++ b/Zend/zend_API.c
@@ -3802,7 +3802,6 @@ static zend_always_inline bool zend_is_method_callable(zend_string *callable, co
HashTable *ftable;
bool call_via_handler = false;
zend_class_entry *scope;
- zval *zv;
fcc->calling_scope = NULL;
@@ -3888,8 +3887,7 @@ static zend_always_inline bool zend_is_method_callable(zend_string *callable, co
if (fcc->function_handler) {
retval = true;
}
- } else if ((zv = zend_hash_find(ftable, lmname)) != NULL) {
- fcc->function_handler = Z_PTR_P(zv);
+ } else if ((fcc->function_handler = zend_hash_find_ptr(ftable, lmname)) != NULL) {
retval = true;
if ((fcc->function_handler->op_array.fn_flags & ZEND_ACC_CHANGED) &&
!strict_class) {
@@ -3897,10 +3895,8 @@ static zend_always_inline bool zend_is_method_callable(zend_string *callable, co
if (scope &&
instanceof_function(fcc->function_handler->common.scope, scope)) {
- zv = zend_hash_find(&scope->function_table, lmname);
- if (zv != NULL) {
- zend_function *priv_fbc = Z_PTR_P(zv);
-
+ zend_function *priv_fbc = zend_hash_find_ptr(&scope->function_table, lmname);
+ if (priv_fbc != NULL) {
if ((priv_fbc->common.fn_flags & ZEND_ACC_PRIVATE)
&& priv_fbc->common.scope == scope) {
fcc->function_handler = priv_fbc;
diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c
index e06287895d1..f3b925cdeb3 100644
--- a/Zend/zend_object_handlers.c
+++ b/Zend/zend_object_handlers.c
@@ -1756,13 +1756,9 @@ ZEND_API void zend_std_unset_dimension(zend_object *object, zval *offset) /* {{{
static zend_never_inline zend_function *zend_get_parent_private_method(const zend_class_entry *scope, const zend_class_entry *ce, zend_string *function_name) /* {{{ */
{
- zval *func;
- zend_function *fbc;
-
if (scope != ce && scope && is_derived_class(ce, scope)) {
- func = zend_hash_find(&scope->function_table, function_name);
- if (func != NULL) {
- fbc = Z_FUNC_P(func);
+ zend_function *fbc = zend_hash_find_ptr(&scope->function_table, function_name);
+ if (fbc != NULL) {
if ((fbc->common.fn_flags & ZEND_ACC_PRIVATE)
&& fbc->common.scope == scope) {
return fbc;
@@ -1979,7 +1975,6 @@ ZEND_API ZEND_COLD zend_never_inline void zend_abstract_method_call(const zend_f
ZEND_API zend_function *zend_std_get_method(zend_object **obj_ptr, zend_string *method_name, const zval *key) /* {{{ */
{
zend_object *zobj = *obj_ptr;
- zval *func;
zend_function *fbc;
zend_string *lc_method_name;
ALLOCA_FLAG(use_heap);
@@ -1994,7 +1989,8 @@ ZEND_API zend_function *zend_std_get_method(zend_object **obj_ptr, zend_string *
zend_str_tolower_copy(ZSTR_VAL(lc_method_name), ZSTR_VAL(method_name), ZSTR_LEN(method_name));
}
- if (UNEXPECTED((func = zend_hash_find(&zobj->ce->function_table, lc_method_name)) == NULL)) {
+ fbc = zend_hash_find_ptr(&zobj->ce->function_table, lc_method_name);
+ if (UNEXPECTED(fbc == NULL)) {
if (UNEXPECTED(!key)) {
ZSTR_ALLOCA_FREE(lc_method_name, use_heap);
}
@@ -2005,8 +2001,6 @@ ZEND_API zend_function *zend_std_get_method(zend_object **obj_ptr, zend_string *
}
}
- fbc = Z_FUNC_P(func);
-
/* Check access level */
if (fbc->op_array.fn_flags & (ZEND_ACC_CHANGED|ZEND_ACC_PRIVATE|ZEND_ACC_PROTECTED)) {
const zend_class_entry *scope = zend_get_executed_scope();