@@ -111,9 +111,9 @@ PHPAPI php_basic_globals basic_globals;
111
111
static zend_class_entry * incomplete_class_entry = NULL ;
112
112
113
113
typedef struct _user_tick_function_entry {
114
- zval * arguments ;
115
- int arg_count ;
116
- int calling ;
114
+ zend_fcall_info fci ;
115
+ zend_fcall_info_cache fci_cache ;
116
+ bool calling ;
117
117
} user_tick_function_entry ;
118
118
119
119
/* some prototypes for local functions */
@@ -1673,12 +1673,9 @@ void user_shutdown_function_dtor(zval *zv) /* {{{ */
1673
1673
1674
1674
void user_tick_function_dtor (user_tick_function_entry * tick_function_entry ) /* {{{ */
1675
1675
{
1676
- int i ;
1676
+ zval_ptr_dtor ( & tick_function_entry -> fci . function_name ) ;
1677
1677
1678
- for (i = 0 ; i < tick_function_entry -> arg_count ; i ++ ) {
1679
- zval_ptr_dtor (& tick_function_entry -> arguments [i ]);
1680
- }
1681
- efree (tick_function_entry -> arguments );
1678
+ efree (tick_function_entry );
1682
1679
}
1683
1680
/* }}} */
1684
1681
@@ -1709,38 +1706,18 @@ static int user_shutdown_function_call(zval *zv) /* {{{ */
1709
1706
1710
1707
static void user_tick_function_call (user_tick_function_entry * tick_fe ) /* {{{ */
1711
1708
{
1712
- zval retval ;
1713
- zval * function = & tick_fe -> arguments [0 ];
1714
-
1715
- /* Prevent reentrant calls to the same user ticks function */
1716
- if (! tick_fe -> calling ) {
1717
- tick_fe -> calling = 1 ;
1709
+ /* Prevent re-entrant calls to the same user ticks function */
1710
+ if (!tick_fe -> calling ) {
1711
+ zval retval ;
1712
+ tick_fe -> calling = true;
1718
1713
1719
- if (call_user_function (NULL , NULL ,
1720
- function ,
1721
- & retval ,
1722
- tick_fe -> arg_count - 1 ,
1723
- tick_fe -> arguments + 1
1724
- ) == SUCCESS ) {
1725
- zval_ptr_dtor (& retval );
1726
-
1727
- } else {
1728
- zval * obj , * method ;
1729
-
1730
- if (Z_TYPE_P (function ) == IS_STRING ) {
1731
- php_error_docref (NULL , E_WARNING , "Unable to call %s() - function does not exist" , Z_STRVAL_P (function ));
1732
- } else if ( Z_TYPE_P (function ) == IS_ARRAY
1733
- && (obj = zend_hash_index_find (Z_ARRVAL_P (function ), 0 )) != NULL
1734
- && (method = zend_hash_index_find (Z_ARRVAL_P (function ), 1 )) != NULL
1735
- && Z_TYPE_P (obj ) == IS_OBJECT
1736
- && Z_TYPE_P (method ) == IS_STRING ) {
1737
- php_error_docref (NULL , E_WARNING , "Unable to call %s::%s() - function does not exist" , ZSTR_VAL (Z_OBJCE_P (obj )-> name ), Z_STRVAL_P (method ));
1738
- } else {
1739
- php_error_docref (NULL , E_WARNING , "Unable to call tick function" );
1740
- }
1714
+ tick_fe -> fci .retval = & retval ;
1715
+ if (zend_call_function (& tick_fe -> fci , & tick_fe -> fci_cache ) == SUCCESS ) {
1716
+ zval_ptr_dtor (tick_fe -> fci .retval );
1741
1717
}
1742
1718
1743
- tick_fe -> calling = 0 ;
1719
+ zend_release_fcall_info_cache (& tick_fe -> fci_cache );
1720
+ tick_fe -> calling = false;
1744
1721
}
1745
1722
}
1746
1723
/* }}} */
@@ -1753,8 +1730,8 @@ static void run_user_tick_functions(int tick_count, void *arg) /* {{{ */
1753
1730
1754
1731
static int user_tick_function_compare (user_tick_function_entry * tick_fe1 , user_tick_function_entry * tick_fe2 ) /* {{{ */
1755
1732
{
1756
- zval * func1 = & tick_fe1 -> arguments [ 0 ] ;
1757
- zval * func2 = & tick_fe2 -> arguments [ 0 ] ;
1733
+ zval * func1 = & tick_fe1 -> fci . function_name ;
1734
+ zval * func2 = & tick_fe2 -> fci . function_name ;
1758
1735
int ret ;
1759
1736
1760
1737
if (Z_TYPE_P (func1 ) == IS_STRING && Z_TYPE_P (func2 ) == IS_STRING ) {
@@ -2408,35 +2385,13 @@ PHP_FUNCTION(getprotobynumber)
2408
2385
PHP_FUNCTION (register_tick_function )
2409
2386
{
2410
2387
user_tick_function_entry tick_fe ;
2411
- int i ;
2412
- zend_string * function_name = NULL ;
2413
-
2414
- tick_fe .calling = 0 ;
2415
- tick_fe .arg_count = ZEND_NUM_ARGS ();
2416
-
2417
- if (tick_fe .arg_count < 1 ) {
2418
- WRONG_PARAM_COUNT ;
2419
- }
2420
2388
2421
- tick_fe .arguments = (zval * ) safe_emalloc (sizeof (zval ), tick_fe .arg_count , 0 );
2422
-
2423
- if (zend_get_parameters_array (ZEND_NUM_ARGS (), tick_fe .arg_count , tick_fe .arguments ) == FAILURE ) {
2424
- efree (tick_fe .arguments );
2425
- RETURN_FALSE ;
2426
- }
2427
-
2428
- if (!zend_is_callable (& tick_fe .arguments [0 ], 0 , & function_name )) {
2429
- efree (tick_fe .arguments );
2430
- zend_argument_type_error (1 , "must be a valid tick callback, '%s' given" , ZSTR_VAL (function_name ));
2431
- zend_string_release_ex (function_name , 0 );
2432
- RETURN_THROWS ();
2433
- } else if (function_name ) {
2434
- zend_string_release_ex (function_name , 0 );
2435
- }
2389
+ ZEND_PARSE_PARAMETERS_START (1 , -1 )
2390
+ Z_PARAM_FUNC (tick_fe .fci , tick_fe .fci_cache )
2391
+ Z_PARAM_VARIADIC ('*' , tick_fe .fci .params , tick_fe .fci .param_count )
2392
+ ZEND_PARSE_PARAMETERS_END ();
2436
2393
2437
- if (Z_TYPE (tick_fe .arguments [0 ]) != IS_ARRAY && Z_TYPE (tick_fe .arguments [0 ]) != IS_OBJECT ) {
2438
- convert_to_string_ex (& tick_fe .arguments [0 ]);
2439
- }
2394
+ Z_TRY_ADDREF (tick_fe .fci .function_name );
2440
2395
2441
2396
if (!BG (user_tick_functions )) {
2442
2397
BG (user_tick_functions ) = (zend_llist * ) emalloc (sizeof (zend_llist ));
@@ -2446,10 +2401,6 @@ PHP_FUNCTION(register_tick_function)
2446
2401
php_add_tick_function (run_user_tick_functions , NULL );
2447
2402
}
2448
2403
2449
- for (i = 0 ; i < tick_fe .arg_count ; i ++ ) {
2450
- Z_TRY_ADDREF (tick_fe .arguments [i ]);
2451
- }
2452
-
2453
2404
zend_llist_add_element (BG (user_tick_functions ), & tick_fe );
2454
2405
2455
2406
RETURN_TRUE ;
@@ -2459,26 +2410,18 @@ PHP_FUNCTION(register_tick_function)
2459
2410
/* {{{ Unregisters a tick callback function */
2460
2411
PHP_FUNCTION (unregister_tick_function )
2461
2412
{
2462
- zval * function ;
2463
2413
user_tick_function_entry tick_fe ;
2464
2414
2465
2415
ZEND_PARSE_PARAMETERS_START (1 , 1 )
2466
- Z_PARAM_ZVAL ( function )
2416
+ Z_PARAM_FUNC ( tick_fe . fci , tick_fe . fci_cache )
2467
2417
ZEND_PARSE_PARAMETERS_END ();
2468
2418
2469
2419
if (!BG (user_tick_functions )) {
2470
2420
return ;
2471
2421
}
2472
2422
2473
- if (Z_TYPE_P (function ) != IS_ARRAY && Z_TYPE_P (function ) != IS_OBJECT ) {
2474
- convert_to_string (function );
2475
- }
2476
-
2477
- tick_fe .arguments = (zval * ) emalloc (sizeof (zval ));
2478
- ZVAL_COPY_VALUE (& tick_fe .arguments [0 ], function );
2479
- tick_fe .arg_count = 1 ;
2480
2423
zend_llist_del_element (BG (user_tick_functions ), & tick_fe , (int (* )(void * , void * )) user_tick_function_compare );
2481
- efree (tick_fe .arguments );
2424
+ // efree(tick_fe.arguments);
2482
2425
}
2483
2426
/* }}} */
2484
2427
0 commit comments