From 7134e69ab2a73da2a5f0e540a135a559210278bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20D=C3=BCsterhus?= Date: Wed, 11 Feb 2026 22:53:31 +0100 Subject: [PATCH] zend_globals: Embed `in_autoload` into `zend_executor_globals` (#21202) * zend_globals: Embed `in_autoload` into `zend_executor_globals` Nowadays virtually any PHP application is making use of autoloading, making the lazy allocation of the `HashTable` struct a needless pointer indirection. * zend_globals: Rename `in_autoload` to `autoload_current_classnames` The old name `in_autoload` was somewhat misleading by implying a `bool`ean value rather than a `HashTable`. Since the previous change to embed the `HashTable` is breaking anyway, we can also rename it. * UPGRADING.INTERNALS --- UPGRADING.INTERNALS | 2 ++ Zend/zend.c | 1 - Zend/zend_execute_API.c | 16 ++++------------ Zend/zend_globals.h | 2 +- 4 files changed, 7 insertions(+), 14 deletions(-) diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS index 83ef90e555879..06c1d52826229 100644 --- a/UPGRADING.INTERNALS +++ b/UPGRADING.INTERNALS @@ -70,6 +70,8 @@ PHP 8.6 INTERNALS UPGRADE NOTES performed on the result. . The zend_dval_to_lval_cap() function no longer takes a second zend_string* parameter. + . EG(in_autoload) was renamed to EG(autoload_current_classnames) and no + longer is a pointer, but a directly embedded HashTable struct. ======================== 2. Build system changes diff --git a/Zend/zend.c b/Zend/zend.c index 49e18f1a777c7..bce1faede8fb9 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -811,7 +811,6 @@ static void executor_globals_ctor(zend_executor_globals *executor_globals) /* {{ executor_globals->user_error_handler_error_reporting = 0; ZVAL_UNDEF(&executor_globals->user_error_handler); ZVAL_UNDEF(&executor_globals->user_exception_handler); - executor_globals->in_autoload = NULL; executor_globals->current_execute_data = NULL; executor_globals->current_module = NULL; executor_globals->exit_status = 0; diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index f9309be99f0e8..dbd2a9039cfc9 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -145,7 +145,6 @@ void init_executor(void) /* {{{ */ EG(function_table) = CG(function_table); EG(class_table) = CG(class_table); - EG(in_autoload) = NULL; EG(error_handling) = EH_NORMAL; EG(flags) = EG_FLAGS_INITIAL; @@ -156,6 +155,7 @@ void init_executor(void) /* {{{ */ zend_llist_apply(&zend_extensions, (llist_apply_func_t) zend_extension_activator); zend_hash_init(&EG(included_files), 8, NULL, NULL, 0); + zend_hash_init(&EG(autoload_current_classnames), 8, NULL, NULL, 0); EG(ticks_count) = 0; @@ -503,16 +503,13 @@ void shutdown_executor(void) /* {{{ */ } zend_hash_destroy(&EG(included_files)); + zend_hash_destroy(&EG(autoload_current_classnames)); zend_stack_destroy(&EG(user_error_handlers_error_reporting)); zend_stack_destroy(&EG(user_error_handlers)); zend_stack_destroy(&EG(user_exception_handlers)); zend_lazy_objects_destroy(&EG(lazy_objects_store)); zend_objects_store_destroy(&EG(objects_store)); - if (EG(in_autoload)) { - zend_hash_destroy(EG(in_autoload)); - FREE_HASHTABLE(EG(in_autoload)); - } if (EG(ht_iterators) != EG(ht_iterators_slots)) { efree(EG(ht_iterators)); @@ -1245,12 +1242,7 @@ ZEND_API zend_class_entry *zend_lookup_class_ex(zend_string *name, zend_string * return NULL; } - if (EG(in_autoload) == NULL) { - ALLOC_HASHTABLE(EG(in_autoload)); - zend_hash_init(EG(in_autoload), 8, NULL, NULL, 0); - } - - if (zend_hash_add_empty_element(EG(in_autoload), lc_name) == NULL) { + if (zend_hash_add_empty_element(&EG(autoload_current_classnames), lc_name) == NULL) { if (!key) { zend_string_release_ex(lc_name, 0); } @@ -1272,7 +1264,7 @@ ZEND_API zend_class_entry *zend_lookup_class_ex(zend_string *name, zend_string * EG(lineno_override) = previous_lineno; zend_string_release_ex(autoload_name, 0); - zend_hash_del(EG(in_autoload), lc_name); + zend_hash_del(&EG(autoload_current_classnames), lc_name); if (!key) { zend_string_release_ex(lc_name, 0); diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h index f09b81acb315b..31f54cd8284b7 100644 --- a/Zend/zend_globals.h +++ b/Zend/zend_globals.h @@ -220,7 +220,7 @@ struct _zend_executor_globals { zend_atomic_bool vm_interrupt; zend_atomic_bool timed_out; - HashTable *in_autoload; + HashTable autoload_current_classnames; zend_long hard_timeout; void *stack_base;