@@ -110,9 +110,9 @@ PHPAPI php_basic_globals basic_globals;
110
110
#include "basic_functions_arginfo.h"
111
111
112
112
typedef struct _user_tick_function_entry {
113
- zval * arguments ;
114
- int arg_count ;
115
- int calling ;
113
+ zend_fcall_info fci ;
114
+ zend_fcall_info_cache fci_cache ;
115
+ bool calling ;
116
116
} user_tick_function_entry ;
117
117
118
118
/* some prototypes for local functions */
@@ -1678,12 +1678,9 @@ void user_shutdown_function_dtor(zval *zv) /* {{{ */
1678
1678
1679
1679
void user_tick_function_dtor (user_tick_function_entry * tick_function_entry ) /* {{{ */
1680
1680
{
1681
- int i ;
1681
+ zval_ptr_dtor ( & tick_function_entry -> fci . function_name ) ;
1682
1682
1683
- for (i = 0 ; i < tick_function_entry -> arg_count ; i ++ ) {
1684
- zval_ptr_dtor (& tick_function_entry -> arguments [i ]);
1685
- }
1686
- efree (tick_function_entry -> arguments );
1683
+ efree (tick_function_entry );
1687
1684
}
1688
1685
/* }}} */
1689
1686
@@ -1713,27 +1710,12 @@ static int user_shutdown_function_call(zval *zv) /* {{{ */
1713
1710
1714
1711
static void user_tick_function_call (user_tick_function_entry * tick_fe ) /* {{{ */
1715
1712
{
1716
- zval retval ;
1717
- zval * function = & tick_fe -> arguments [0 ];
1718
-
1719
- /* Prevent reentrant calls to the same user ticks function */
1720
- if (! tick_fe -> calling ) {
1721
- tick_fe -> calling = 1 ;
1722
-
1723
- if (call_user_function (NULL , NULL ,
1724
- function ,
1725
- & retval ,
1726
- tick_fe -> arg_count - 1 ,
1727
- tick_fe -> arguments + 1
1728
- ) == SUCCESS ) {
1729
- zval_ptr_dtor (& retval );
1730
- } else {
1731
- zend_string * function_name = zend_get_callable_name (function );
1732
- zend_throw_error (NULL , "Registered tick function %s() cannot be called, function does not exist" , ZSTR_VAL (function_name ));
1733
- zend_string_release (function_name );
1734
- }
1735
-
1736
- tick_fe -> calling = 0 ;
1713
+ /* Prevent re-entrant calls to the same user ticks function */
1714
+ if (!tick_fe -> calling ) {
1715
+ tick_fe -> calling = true;
1716
+ zend_fcall_info_call (& tick_fe -> fci , & tick_fe -> fci_cache , tick_fe -> fci .retval , NULL );
1717
+ zend_release_fcall_info_cache (& tick_fe -> fci_cache );
1718
+ tick_fe -> calling = false;
1737
1719
}
1738
1720
}
1739
1721
/* }}} */
@@ -1746,8 +1728,8 @@ static void run_user_tick_functions(int tick_count, void *arg) /* {{{ */
1746
1728
1747
1729
static int user_tick_function_compare (user_tick_function_entry * tick_fe1 , user_tick_function_entry * tick_fe2 ) /* {{{ */
1748
1730
{
1749
- zval * func1 = & tick_fe1 -> arguments [ 0 ] ;
1750
- zval * func2 = & tick_fe2 -> arguments [ 0 ] ;
1731
+ zval * func1 = & tick_fe1 -> fci . function_name ;
1732
+ zval * func2 = & tick_fe2 -> fci . function_name ;
1751
1733
int ret ;
1752
1734
1753
1735
if (Z_TYPE_P (func1 ) == IS_STRING && Z_TYPE_P (func2 ) == IS_STRING ) {
@@ -2386,36 +2368,15 @@ PHP_FUNCTION(getprotobynumber)
2386
2368
/* {{{ Registers a tick callback function */
2387
2369
PHP_FUNCTION (register_tick_function )
2388
2370
{
2389
- user_tick_function_entry tick_fe ;
2390
- int i ;
2391
- zend_string * function_name = NULL ;
2392
-
2393
- tick_fe .calling = 0 ;
2394
- tick_fe .arg_count = ZEND_NUM_ARGS ();
2395
-
2396
- if (tick_fe .arg_count < 1 ) {
2397
- WRONG_PARAM_COUNT ;
2398
- }
2399
-
2400
- tick_fe .arguments = (zval * ) safe_emalloc (sizeof (zval ), tick_fe .arg_count , 0 );
2371
+ user_tick_function_entry * tick_fe = emalloc (sizeof (user_tick_function_entry ));
2401
2372
2402
- if (zend_get_parameters_array (ZEND_NUM_ARGS (), tick_fe .arg_count , tick_fe .arguments ) == FAILURE ) {
2403
- efree (tick_fe .arguments );
2404
- RETURN_FALSE ;
2405
- }
2406
-
2407
- if (!zend_is_callable (& tick_fe .arguments [0 ], 0 , & function_name )) {
2408
- efree (tick_fe .arguments );
2409
- zend_argument_type_error (1 , "must be a valid tick callback, \"%s\" given" , ZSTR_VAL (function_name ));
2410
- zend_string_release_ex (function_name , 0 );
2373
+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "f*" , & tick_fe -> fci , & tick_fe -> fci_cache ,
2374
+ & tick_fe -> fci .params , & tick_fe -> fci .param_count ) == FAILURE ) {
2375
+ efree (tick_fe );
2411
2376
RETURN_THROWS ();
2412
- } else if (function_name ) {
2413
- zend_string_release_ex (function_name , 0 );
2414
2377
}
2415
2378
2416
- if (Z_TYPE (tick_fe .arguments [0 ]) != IS_ARRAY && Z_TYPE (tick_fe .arguments [0 ]) != IS_OBJECT ) {
2417
- convert_to_string (& tick_fe .arguments [0 ]);
2418
- }
2379
+ Z_TRY_ADDREF (tick_fe -> fci .function_name );
2419
2380
2420
2381
if (!BG (user_tick_functions )) {
2421
2382
BG (user_tick_functions ) = (zend_llist * ) emalloc (sizeof (zend_llist ));
@@ -2425,11 +2386,8 @@ PHP_FUNCTION(register_tick_function)
2425
2386
php_add_tick_function (run_user_tick_functions , NULL );
2426
2387
}
2427
2388
2428
- for (i = 0 ; i < tick_fe .arg_count ; i ++ ) {
2429
- Z_TRY_ADDREF (tick_fe .arguments [i ]);
2430
- }
2431
-
2432
- zend_llist_add_element (BG (user_tick_functions ), & tick_fe );
2389
+ zend_llist_add_element (BG (user_tick_functions ), tick_fe );
2390
+ efree (tick_fe );
2433
2391
2434
2392
RETURN_TRUE ;
2435
2393
}
@@ -2438,23 +2396,19 @@ PHP_FUNCTION(register_tick_function)
2438
2396
/* {{{ Unregisters a tick callback function */
2439
2397
PHP_FUNCTION (unregister_tick_function )
2440
2398
{
2441
- user_tick_function_entry tick_fe ;
2442
- zend_fcall_info fci ;
2443
- zend_fcall_info_cache fci_cache ;
2399
+ user_tick_function_entry * tick_fe = emalloc (sizeof (user_tick_function_entry ));
2444
2400
2445
- ZEND_PARSE_PARAMETERS_START (1 , 1 )
2446
- Z_PARAM_FUNC (fci , fci_cache )
2447
- ZEND_PARSE_PARAMETERS_END ();
2401
+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "f" , & tick_fe -> fci , & tick_fe -> fci_cache ) == FAILURE ) {
2402
+ efree (tick_fe );
2403
+ RETURN_THROWS ();
2404
+ }
2448
2405
2449
2406
if (!BG (user_tick_functions )) {
2450
2407
return ;
2451
2408
}
2452
2409
2453
- tick_fe .arguments = (zval * ) emalloc (sizeof (zval ));
2454
- ZVAL_COPY_VALUE (& tick_fe .arguments [0 ], & fci .function_name );
2455
- tick_fe .arg_count = 1 ;
2456
- zend_llist_del_element (BG (user_tick_functions ), & tick_fe , (int (* )(void * , void * )) user_tick_function_compare );
2457
- efree (tick_fe .arguments );
2410
+ zend_llist_del_element (BG (user_tick_functions ), tick_fe , (int (* )(void * , void * )) user_tick_function_compare );
2411
+ efree (tick_fe );
2458
2412
}
2459
2413
/* }}} */
2460
2414
0 commit comments