@@ -1665,20 +1665,36 @@ PHP_FUNCTION(forward_static_call_array)
1665
1665
}
1666
1666
/* }}} */
1667
1667
1668
+ static void fci_addref (zend_fcall_info * fci , zend_fcall_info_cache * fci_cache )
1669
+ {
1670
+ Z_TRY_ADDREF (fci -> function_name );
1671
+ if (fci_cache -> object ) {
1672
+ GC_ADDREF (fci_cache -> object );
1673
+ }
1674
+ }
1675
+
1676
+ static void fci_release (zend_fcall_info * fci , zend_fcall_info_cache * fci_cache )
1677
+ {
1678
+ zval_ptr_dtor (& fci -> function_name );
1679
+ if (fci_cache -> object ) {
1680
+ zend_object_release (fci_cache -> object );
1681
+ }
1682
+ }
1683
+
1668
1684
void user_shutdown_function_dtor (zval * zv ) /* {{{ */
1669
1685
{
1670
1686
php_shutdown_function_entry * shutdown_function_entry = Z_PTR_P (zv );
1671
1687
1672
- zval_ptr_dtor (& shutdown_function_entry -> fci .function_name );
1673
1688
zend_fcall_info_args_clear (& shutdown_function_entry -> fci , true);
1689
+ fci_release (& shutdown_function_entry -> fci , & shutdown_function_entry -> fci_cache );
1674
1690
efree (shutdown_function_entry );
1675
1691
}
1676
1692
/* }}} */
1677
1693
1678
1694
void user_tick_function_dtor (user_tick_function_entry * tick_function_entry ) /* {{{ */
1679
1695
{
1680
- zval_ptr_dtor (& tick_function_entry -> fci .function_name );
1681
1696
zend_fcall_info_args_clear (& tick_function_entry -> fci , true);
1697
+ fci_release (& tick_function_entry -> fci , & tick_function_entry -> fci_cache );
1682
1698
}
1683
1699
/* }}} */
1684
1700
@@ -1784,7 +1800,7 @@ PHP_FUNCTION(register_shutdown_function)
1784
1800
RETURN_THROWS ();
1785
1801
}
1786
1802
1787
- Z_TRY_ADDREF ( entry .fci . function_name );
1803
+ fci_addref ( & entry .fci , & entry . fci_cache );
1788
1804
zend_fcall_info_argp (& entry .fci , param_count , params );
1789
1805
1790
1806
status = append_user_shutdown_function (& entry );
@@ -2353,7 +2369,7 @@ PHP_FUNCTION(register_tick_function)
2353
2369
}
2354
2370
2355
2371
tick_fe .calling = false;
2356
- Z_TRY_ADDREF ( tick_fe .fci . function_name );
2372
+ fci_addref ( & tick_fe .fci , & tick_fe . fci_cache );
2357
2373
zend_fcall_info_argp (& tick_fe .fci , param_count , params );
2358
2374
2359
2375
if (!BG (user_tick_functions )) {
0 commit comments