@@ -1594,36 +1594,45 @@ PHP_FUNCTION(forward_static_call_array)
1594
1594
}
1595
1595
/* }}} */
1596
1596
1597
- static void fci_addref (zend_fcall_info * fci , zend_fcall_info_cache * fci_cache )
1597
+ static void php_user_callable_addref_with_params (zend_fcall_info * fci , zend_fcall_info_cache * fcc , const zval * params )
1598
1598
{
1599
1599
Z_TRY_ADDREF (fci -> function_name );
1600
- if (fci_cache -> object ) {
1601
- GC_ADDREF (fci_cache -> object );
1600
+ fci -> params = NULL ;
1601
+ if (params ) {
1602
+ ZEND_ASSERT (fci -> param_count > 0 );
1603
+ fci -> params = (zval * ) safe_erealloc (fci -> params , sizeof (zval ), fci -> param_count , 0 );
1604
+ for (uint32_t i = 0 ; i < fci -> param_count ; ++ i ) {
1605
+ ZVAL_COPY (& fci -> params [i ], & params [i ]);
1606
+ }
1602
1607
}
1608
+ zend_fcc_addref (fcc );
1603
1609
}
1604
1610
1605
- static void fci_release (zend_fcall_info * fci , zend_fcall_info_cache * fci_cache )
1611
+ static void php_user_callable_dtor_with_params (zend_fcall_info * fci , zend_fcall_info_cache * fcc )
1606
1612
{
1607
1613
zval_ptr_dtor (& fci -> function_name );
1608
- if (fci_cache -> object ) {
1609
- zend_object_release (fci_cache -> object );
1614
+ if (fci -> params ) {
1615
+ ZEND_ASSERT (fci -> param_count > 0 );
1616
+ for (uint32_t i = 0 ; i < fci -> param_count ; ++ i ) {
1617
+ zval_ptr_dtor (& fci -> params [i ]);
1618
+ }
1619
+ efree (fci -> params );
1610
1620
}
1621
+ zend_fcc_dtor (fcc );
1611
1622
}
1612
1623
1613
1624
void user_shutdown_function_dtor (zval * zv ) /* {{{ */
1614
1625
{
1615
1626
php_shutdown_function_entry * shutdown_function_entry = Z_PTR_P (zv );
1616
1627
1617
- zend_fcall_info_args_clear (& shutdown_function_entry -> fci , true);
1618
- fci_release (& shutdown_function_entry -> fci , & shutdown_function_entry -> fci_cache );
1628
+ php_user_callable_dtor_with_params (& shutdown_function_entry -> fci , & shutdown_function_entry -> fci_cache );
1619
1629
efree (shutdown_function_entry );
1620
1630
}
1621
1631
/* }}} */
1622
1632
1623
1633
void user_tick_function_dtor (user_tick_function_entry * tick_function_entry ) /* {{{ */
1624
1634
{
1625
- zend_fcall_info_args_clear (& tick_function_entry -> fci , true);
1626
- fci_release (& tick_function_entry -> fci , & tick_function_entry -> fci_cache );
1635
+ php_user_callable_dtor_with_params (& tick_function_entry -> fci , & tick_function_entry -> fci_cache );
1627
1636
}
1628
1637
/* }}} */
1629
1638
@@ -1721,16 +1730,14 @@ PHPAPI void php_free_shutdown_functions(void) /* {{{ */
1721
1730
PHP_FUNCTION (register_shutdown_function )
1722
1731
{
1723
1732
php_shutdown_function_entry entry ;
1724
- zval * params = NULL ;
1725
- uint32_t param_count = 0 ;
1726
1733
bool status ;
1734
+ zval * params = NULL ;
1727
1735
1728
- if (zend_parse_parameters (ZEND_NUM_ARGS (), "f*" , & entry .fci , & entry .fci_cache , & params , & param_count ) == FAILURE ) {
1736
+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "f*" , & entry .fci , & entry .fci_cache , & params , & entry . fci . param_count ) == FAILURE ) {
1729
1737
RETURN_THROWS ();
1730
1738
}
1731
1739
1732
- fci_addref (& entry .fci , & entry .fci_cache );
1733
- zend_fcall_info_argp (& entry .fci , param_count , params );
1740
+ php_user_callable_addref_with_params (& entry .fci , & entry .fci_cache , params );
1734
1741
1735
1742
status = append_user_shutdown_function (& entry );
1736
1743
ZEND_ASSERT (status );
@@ -2310,15 +2317,13 @@ PHP_FUNCTION(register_tick_function)
2310
2317
{
2311
2318
user_tick_function_entry tick_fe ;
2312
2319
zval * params = NULL ;
2313
- uint32_t param_count = 0 ;
2314
2320
2315
- if (zend_parse_parameters (ZEND_NUM_ARGS (), "f*" , & tick_fe .fci , & tick_fe .fci_cache , & params , & param_count ) == FAILURE ) {
2321
+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "f*" , & tick_fe .fci , & tick_fe .fci_cache , & params , & tick_fe . fci . param_count ) == FAILURE ) {
2316
2322
RETURN_THROWS ();
2317
2323
}
2318
2324
2319
2325
tick_fe .calling = false;
2320
- fci_addref (& tick_fe .fci , & tick_fe .fci_cache );
2321
- zend_fcall_info_argp (& tick_fe .fci , param_count , params );
2326
+ php_user_callable_addref_with_params (& tick_fe .fci , & tick_fe .fci_cache , params );
2322
2327
2323
2328
if (!BG (user_tick_functions )) {
2324
2329
BG (user_tick_functions ) = (zend_llist * ) emalloc (sizeof (zend_llist ));
0 commit comments