Commit 6e6a850cb99 for php.net
commit 6e6a850cb99d90e9979de1381641d20236ce11ba
Author: Arnaud Le Blanc <365207+arnaud-lb@users.noreply.github.com>
Date: Fri Jan 16 13:40:31 2026 +0100
Followup GH-19022
* Fix zend_call_trampoline_arginfo arg name
Name is "arguments" in documentation:
https://www.php.net/__call#language.oop5.overloading.methods
* Use zend_call_trampoline_arginfo in zend_get_call_trampoline_func()
* Copy the original arg_info in zend_closure_from_frame
None of these changes are observable, but this is cleaner, and this becomes observable in GH-20848.
Closes GH-20951
diff --git a/Zend/zend.c b/Zend/zend.c
index c46c8e9ada8..6b0ffb73ad7 100644
--- a/Zend/zend.c
+++ b/Zend/zend.c
@@ -1082,7 +1082,6 @@ void zend_startup(zend_utility_functions *utility_functions) /* {{{ */
#endif
zend_enum_startup();
- zend_closure_startup();
}
/* }}} */
diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c
index 05b68620448..43eefbeff9d 100644
--- a/Zend/zend_closures.c
+++ b/Zend/zend_closures.c
@@ -878,8 +878,6 @@ ZEND_API void zend_create_fake_closure(zval *res, zend_function *func, zend_clas
}
/* }}} */
-static zend_arg_info trampoline_arg_info[1];
-
void zend_closure_from_frame(zval *return_value, const zend_execute_data *call) { /* {{{ */
zval instance;
zend_internal_function trampoline;
@@ -904,9 +902,7 @@ void zend_closure_from_frame(zval *return_value, const zend_execute_data *call)
trampoline.function_name = mptr->common.function_name;
trampoline.scope = mptr->common.scope;
trampoline.doc_comment = NULL;
- if (trampoline.fn_flags & ZEND_ACC_VARIADIC) {
- trampoline.arg_info = trampoline_arg_info;
- }
+ trampoline.arg_info = mptr->common.arg_info;
trampoline.attributes = mptr->common.attributes;
zend_free_trampoline(mptr);
@@ -943,11 +939,3 @@ void zend_closure_bind_var_ex(zval *closure_zv, uint32_t offset, zval *val) /* {
ZVAL_COPY_VALUE(var, val);
}
/* }}} */
-
-void zend_closure_startup(void)
-{
- /* __call and __callStatic name the arguments "$arguments" in the docs. */
- trampoline_arg_info[0].name = zend_string_init_interned("arguments", strlen("arguments"), true);
- trampoline_arg_info[0].type = (zend_type)ZEND_TYPE_INIT_CODE(IS_MIXED, false, _ZEND_ARG_INFO_FLAGS(false, 1, 0));
- trampoline_arg_info[0].default_value = NULL;
-}
diff --git a/Zend/zend_closures.h b/Zend/zend_closures.h
index a118044c6e2..8bea4ffb051 100644
--- a/Zend/zend_closures.h
+++ b/Zend/zend_closures.h
@@ -28,7 +28,6 @@ BEGIN_EXTERN_C()
#define ZEND_CLOSURE_OBJECT(op_array) \
((zend_object*)((char*)(op_array) - sizeof(zend_object)))
-void zend_closure_startup(void);
void zend_register_closure_ce(void);
void zend_closure_bind_var(zval *closure_zv, zend_string *var_name, zval *var);
void zend_closure_bind_var_ex(zval *closure_zv, uint32_t offset, zval *val);
diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c
index 88b7b1112d7..baa27fd9e42 100644
--- a/Zend/zend_object_handlers.c
+++ b/Zend/zend_object_handlers.c
@@ -1685,7 +1685,6 @@ ZEND_API ZEND_ATTRIBUTE_NONNULL zend_function *zend_get_call_trampoline_func(
* The low bit must be zero, to not be interpreted as a MAP_PTR offset.
*/
static const void *dummy = (void*)(intptr_t)2;
- static const zend_arg_info arg_info[1] = {{0}};
if (EXPECTED(EG(trampoline).common.function_name == NULL)) {
func = &EG(trampoline).op_array;
@@ -1732,7 +1731,7 @@ ZEND_API ZEND_ATTRIBUTE_NONNULL zend_function *zend_get_call_trampoline_func(
func->prop_info = NULL;
func->num_args = 0;
func->required_num_args = 0;
- func->arg_info = (zend_arg_info *) arg_info;
+ func->arg_info = zend_call_trampoline_arginfo;
return (zend_function*)func;
}
@@ -2576,6 +2575,7 @@ ZEND_API const zend_object_handlers std_object_handlers = {
};
void zend_object_handlers_startup(void) {
- zend_call_trampoline_arginfo[0].name = ZSTR_KNOWN(ZEND_STR_ARGS);
+ zend_call_trampoline_arginfo[0].name = ZSTR_KNOWN(ZEND_STR_ARGUMENTS);
+ zend_call_trampoline_arginfo[0].type = (zend_type)ZEND_TYPE_INIT_CODE(IS_MIXED, false, _ZEND_ARG_INFO_FLAGS(false, 1, 0));
zend_property_hook_arginfo[0].name = ZSTR_KNOWN(ZEND_STR_VALUE);
}
diff --git a/Zend/zend_string.h b/Zend/zend_string.h
index fc7705ff786..97386ea6bad 100644
--- a/Zend/zend_string.h
+++ b/Zend/zend_string.h
@@ -563,6 +563,7 @@ EMPTY_SWITCH_DEFAULT_CASE()
_(ZEND_STR_OBJECT_OPERATOR, "->") \
_(ZEND_STR_PAAMAYIM_NEKUDOTAYIM, "::") \
_(ZEND_STR_ARGS, "args") \
+ _(ZEND_STR_ARGUMENTS, "arguments") \
_(ZEND_STR_UNKNOWN, "unknown") \
_(ZEND_STR_UNKNOWN_CAPITALIZED, "Unknown") \
_(ZEND_STR_EXIT, "exit") \