diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 6d2a6195cd5..06618b3a9de 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -1130,22 +1130,20 @@ ZEND_API zend_result zend_call_method_if_exists( zend_object *object, zend_string *method_name, zval *retval, uint32_t param_count, zval *params) { - zend_fcall_info fci; - fci.size = sizeof(zend_fcall_info); - fci.object = object; - ZVAL_STR(&fci.function_name, method_name); - fci.retval = retval; - fci.param_count = param_count; - fci.params = params; - fci.named_params = NULL; - + zval zval_method; zend_fcall_info_cache fcc; - if (!zend_is_callable_ex(&fci.function_name, fci.object, IS_CALLABLE_SUPPRESS_DEPRECATIONS, NULL, &fcc, NULL)) { + + ZVAL_STR(&zval_method, method_name); + + if (UNEXPECTED(!zend_is_callable_ex(&zval_method, object, IS_CALLABLE_SUPPRESS_DEPRECATIONS, NULL, &fcc, NULL))) { ZVAL_UNDEF(retval); return FAILURE; } - return zend_call_function(&fci, &fcc); + zend_call_known_fcc(&fcc, retval, param_count, params, NULL); + /* Need to free potential trampoline (__call/__callStatic) copied function handler before releasing the closure */ + zend_release_fcall_info_cache(&fcc); + return SUCCESS; } /* 0-9 a-z A-Z _ \ 0x80-0xff */