@@ -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,12 @@ 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 ;
1682
-
1683
- for (i = 0 ; i < tick_function_entry -> arg_count ; i ++ ) {
1684
- zval_ptr_dtor (& tick_function_entry -> arguments [i ]);
1681
+ zval_ptr_dtor (& tick_function_entry -> fci .function_name );
1682
+ for (size_t i = 0 ; i < tick_function_entry -> fci .param_count ; i ++ ) {
1683
+ zval_ptr_dtor (& tick_function_entry -> fci .params [i ]);
1685
1684
}
1686
- efree (tick_function_entry -> arguments );
1685
+
1686
+ efree (tick_function_entry );
1687
1687
}
1688
1688
/* }}} */
1689
1689
@@ -1713,27 +1713,19 @@ static int user_shutdown_function_call(zval *zv) /* {{{ */
1713
1713
1714
1714
static void user_tick_function_call (user_tick_function_entry * tick_fe ) /* {{{ */
1715
1715
{
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
- }
1716
+ /* Prevent re-entrant calls to the same user ticks function */
1717
+ if (!tick_fe -> calling ) {
1718
+ zval tmp ;
1719
+
1720
+ /* set tmp zval */
1721
+ tick_fe -> fci .retval = & tmp ;
1735
1722
1736
- tick_fe -> calling = 0 ;
1723
+ tick_fe -> calling = true;
1724
+ zend_call_function (& tick_fe -> fci , & tick_fe -> fci_cache );
1725
+
1726
+ /* Destroy return value */
1727
+ zval_ptr_dtor (& tmp );
1728
+ tick_fe -> calling = false;
1737
1729
}
1738
1730
}
1739
1731
/* }}} */
@@ -1746,8 +1738,8 @@ static void run_user_tick_functions(int tick_count, void *arg) /* {{{ */
1746
1738
1747
1739
static int user_tick_function_compare (user_tick_function_entry * tick_fe1 , user_tick_function_entry * tick_fe2 ) /* {{{ */
1748
1740
{
1749
- zval * func1 = & tick_fe1 -> arguments [ 0 ] ;
1750
- zval * func2 = & tick_fe2 -> arguments [ 0 ] ;
1741
+ zval * func1 = & tick_fe1 -> fci . function_name ;
1742
+ zval * func2 = & tick_fe2 -> fci . function_name ;
1751
1743
int ret ;
1752
1744
1753
1745
if (Z_TYPE_P (func1 ) == IS_STRING && Z_TYPE_P (func2 ) == IS_STRING ) {
@@ -2387,36 +2379,17 @@ PHP_FUNCTION(getprotobynumber)
2387
2379
PHP_FUNCTION (register_tick_function )
2388
2380
{
2389
2381
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
2382
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 );
2401
-
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 );
2383
+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "f*" , & tick_fe .fci , & tick_fe .fci_cache ,
2384
+ & tick_fe .fci .params , & tick_fe .fci .param_count ) == FAILURE ) {
2411
2385
RETURN_THROWS ();
2412
- } else if (function_name ) {
2413
- zend_string_release_ex (function_name , 0 );
2414
2386
}
2415
2387
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 ]);
2388
+ tick_fe .calling = false;
2389
+ Z_TRY_ADDREF (tick_fe .fci .function_name );
2390
+ for (size_t i = 0 ; i < tick_fe .fci .param_count ; i ++ ) {
2391
+ Z_TRY_ADDREF (tick_fe .fci .params [i ]);
2418
2392
}
2419
-
2420
2393
if (!BG (user_tick_functions )) {
2421
2394
BG (user_tick_functions ) = (zend_llist * ) emalloc (sizeof (zend_llist ));
2422
2395
zend_llist_init (BG (user_tick_functions ),
@@ -2425,10 +2398,6 @@ PHP_FUNCTION(register_tick_function)
2425
2398
php_add_tick_function (run_user_tick_functions , NULL );
2426
2399
}
2427
2400
2428
- for (i = 0 ; i < tick_fe .arg_count ; i ++ ) {
2429
- Z_TRY_ADDREF (tick_fe .arguments [i ]);
2430
- }
2431
-
2432
2401
zend_llist_add_element (BG (user_tick_functions ), & tick_fe );
2433
2402
2434
2403
RETURN_TRUE ;
@@ -2439,22 +2408,16 @@ PHP_FUNCTION(register_tick_function)
2439
2408
PHP_FUNCTION (unregister_tick_function )
2440
2409
{
2441
2410
user_tick_function_entry tick_fe ;
2442
- zend_fcall_info fci ;
2443
- zend_fcall_info_cache fci_cache ;
2444
2411
2445
2412
ZEND_PARSE_PARAMETERS_START (1 , 1 )
2446
- Z_PARAM_FUNC (fci , fci_cache )
2413
+ Z_PARAM_FUNC (tick_fe . fci , tick_fe . fci_cache )
2447
2414
ZEND_PARSE_PARAMETERS_END ();
2448
2415
2449
2416
if (!BG (user_tick_functions )) {
2450
2417
return ;
2451
2418
}
2452
2419
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
2420
zend_llist_del_element (BG (user_tick_functions ), & tick_fe , (int (* )(void * , void * )) user_tick_function_compare );
2457
- efree (tick_fe .arguments );
2458
2421
}
2459
2422
/* }}} */
2460
2423
0 commit comments