Commit 9518d49da0f for php.net
commit 9518d49da0f56aa806a8c4c0e364de2802bf6bcf
Author: Gina Peter Banyard <girgias@php.net>
Date: Tue Jul 28 17:29:11 2026 +0100
Zend: add _ex variants for calling known functions/FCC (#22910)
To permit setting the consumed_arg FCI field
diff --git a/Zend/zend_API.h b/Zend/zend_API.h
index 2c0b892d194..622e90da59b 100644
--- a/Zend/zend_API.h
+++ b/Zend/zend_API.h
@@ -854,12 +854,19 @@ static zend_always_inline zend_result zend_call_function_with_return_value(
* If retval_ptr is NULL, the return value is discarded.
* If object is NULL, this must be a free function or static call.
* called_scope must be provided for instance and static method calls. */
-ZEND_API void zend_call_known_function(
+ZEND_API void zend_call_known_function_ex(
zend_function *fn, zend_object *object, zend_class_entry *called_scope, zval *retval_ptr,
- uint32_t param_count, zval *params, HashTable *named_params);
+ uint32_t param_count, zval *params, HashTable *named_params, uint32_t consumed_args);
-static zend_always_inline void zend_call_known_fcc(
- const zend_fcall_info_cache *fcc, zval *retval_ptr, uint32_t param_count, zval *params, HashTable *named_params)
+static zend_always_inline void zend_call_known_function(
+ zend_function *fn, zend_object *object, zend_class_entry *called_scope, zval *retval_ptr,
+ uint32_t param_count, zval *params, HashTable *named_params) {
+ zend_call_known_function_ex(fn, object, called_scope, retval_ptr, param_count, params, named_params, 0);
+}
+
+static zend_always_inline void zend_call_known_fcc_ex(
+ const zend_fcall_info_cache *fcc, zval *retval_ptr,
+ uint32_t param_count, zval *params, HashTable *named_params, uint32_t consumed_args)
{
zend_function *func = fcc->function_handler;
/* Need to copy trampolines as they get released after they are called */
@@ -868,7 +875,13 @@ static zend_always_inline void zend_call_known_fcc(
memcpy(func, fcc->function_handler, sizeof(zend_function));
zend_string_addref(func->op_array.function_name);
}
- zend_call_known_function(func, fcc->object, fcc->called_scope, retval_ptr, param_count, params, named_params);
+ zend_call_known_function_ex(func, fcc->object, fcc->called_scope, retval_ptr, param_count, params, named_params, consumed_args);
+}
+
+static zend_always_inline void zend_call_known_fcc(
+ const zend_fcall_info_cache *fcc, zval *retval_ptr, uint32_t param_count, zval *params, HashTable *named_params)
+{
+ zend_call_known_fcc_ex(fcc, retval_ptr, param_count, params, named_params, 0);
}
/* Call the provided zend_function instance method on an object. */
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index 88b0a485750..83ba5e7490c 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -1100,9 +1100,9 @@ zend_result zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_
}
/* }}} */
-ZEND_API void zend_call_known_function(
+ZEND_API void zend_call_known_function_ex(
zend_function *fn, zend_object *object, zend_class_entry *called_scope, zval *retval_ptr,
- uint32_t param_count, zval *params, HashTable *named_params)
+ uint32_t param_count, zval *params, HashTable *named_params, uint32_t consumed_args)
{
zval retval;
zend_fcall_info fci;
@@ -1116,7 +1116,7 @@ ZEND_API void zend_call_known_function(
fci.param_count = param_count;
fci.params = params;
fci.named_params = named_params;
- fci.consumed_args = 0;
+ fci.consumed_args = consumed_args;
ZVAL_UNDEF(&fci.function_name); /* Unused */
fcic.function_handler = fn;