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