27
27
28
28
typedef struct _php_converter_object {
29
29
UConverter * src , * dest ;
30
- zend_fcall_info to_cb , from_cb ;
31
30
zend_fcall_info_cache to_cache , from_cache ;
32
31
intl_error error ;
33
32
zend_object obj ;
@@ -230,13 +229,9 @@ static void php_converter_to_u_callback(const void *context,
230
229
ZVAL_LONG (& zargs [3 ], * pErrorCode );
231
230
ZVAL_MAKE_REF (& zargs [3 ]);
232
231
233
- objval -> to_cb .param_count = 4 ;
234
- objval -> to_cb .params = zargs ;
235
- objval -> to_cb .retval = & retval ;
236
- if (zend_call_function (& (objval -> to_cb ), & (objval -> to_cache )) == FAILURE ) {
237
- /* Unlikely */
238
- php_converter_throw_failure (objval , U_INTERNAL_PROGRAM_ERROR , "Unexpected failure calling toUCallback()" );
239
- } else if (!Z_ISUNDEF (retval )) {
232
+ zend_call_known_fcc (& objval -> to_cache , & retval , 4 , zargs , NULL );
233
+ /* When no exception is thrown */
234
+ if (EXPECTED (!Z_ISUNDEF (retval ))) {
240
235
php_converter_append_toUnicode_target (& retval , args , objval );
241
236
zval_ptr_dtor (& retval );
242
237
}
@@ -297,11 +292,10 @@ static void php_converter_from_u_callback(const void *context,
297
292
php_converter_object * objval = (php_converter_object * )context ;
298
293
zval retval ;
299
294
zval zargs [4 ];
300
- int i ;
301
295
302
296
ZVAL_LONG (& zargs [0 ], reason );
303
297
array_init (& zargs [1 ]);
304
- i = 0 ;
298
+ int i = 0 ;
305
299
while (i < length ) {
306
300
UChar32 c ;
307
301
U16_NEXT (codeUnits , i , length , c );
@@ -311,13 +305,9 @@ static void php_converter_from_u_callback(const void *context,
311
305
ZVAL_LONG (& zargs [3 ], * pErrorCode );
312
306
ZVAL_MAKE_REF (& zargs [3 ]);
313
307
314
- objval -> from_cb .param_count = 4 ;
315
- objval -> from_cb .params = zargs ;
316
- objval -> from_cb .retval = & retval ;
317
- if (zend_call_function (& (objval -> from_cb ), & (objval -> from_cache )) == FAILURE ) {
318
- /* Unlikely */
319
- php_converter_throw_failure (objval , U_INTERNAL_PROGRAM_ERROR , "Unexpected failure calling fromUCallback()" );
320
- } else if (!Z_ISUNDEF (retval )) {
308
+ zend_call_known_fcc (& objval -> from_cache , & retval , 4 , zargs , NULL );
309
+ /* When no exception is thrown */
310
+ if (EXPECTED (!Z_ISUNDEF (retval ))) {
321
311
php_converter_append_fromUnicode_target (& retval , args , objval );
322
312
zval_ptr_dtor (& retval );
323
313
}
@@ -503,26 +493,20 @@ PHP_METHOD(UConverter, getDestinationType) {
503
493
/* }}} */
504
494
505
495
/* {{{ php_converter_resolve_callback */
506
- static void php_converter_resolve_callback (zval * zobj ,
507
- php_converter_object * objval ,
508
- const char * callback_name ,
509
- zend_fcall_info * finfo ,
510
- zend_fcall_info_cache * fcache ) {
511
- char * errstr = NULL ;
512
- zval caller ;
496
+ static void php_converter_resolve_callback (
497
+ zend_fcall_info_cache * fcc ,
498
+ zend_object * obj ,
499
+ const char * callback_name ,
500
+ size_t callback_name_len
501
+ ) {
502
+ zend_function * fn = zend_hash_str_find_ptr_lc (& obj -> ce -> function_table , callback_name , callback_name_len );
503
+ ZEND_ASSERT (fn != NULL );
513
504
514
- array_init (& caller );
515
- Z_ADDREF_P (zobj );
516
- add_index_zval (& caller , 0 , zobj );
517
- add_index_string (& caller , 1 , callback_name );
518
- if (zend_fcall_info_init (& caller , 0 , finfo , fcache , NULL , & errstr ) == FAILURE ) {
519
- php_converter_throw_failure (objval , U_INTERNAL_PROGRAM_ERROR , "Error setting converter callback: %s" , errstr );
520
- }
521
- zend_array_destroy (Z_ARR (caller ));
522
- ZVAL_UNDEF (& finfo -> function_name );
523
- if (errstr ) {
524
- efree (errstr );
525
- }
505
+ fcc -> function_handler = fn ;
506
+ fcc -> object = obj ;
507
+ fcc -> called_scope = obj -> ce ;
508
+ fcc -> calling_scope = NULL ;
509
+ fcc -> closure = NULL ;
526
510
}
527
511
/* }}} */
528
512
@@ -544,8 +528,8 @@ PHP_METHOD(UConverter, __construct) {
544
528
545
529
php_converter_set_encoding (objval , & (objval -> src ), src , src_len );
546
530
php_converter_set_encoding (objval , & (objval -> dest ), dest , dest_len );
547
- php_converter_resolve_callback (ZEND_THIS , objval , "toUCallback" , & ( objval -> to_cb ), & ( objval -> to_cache ));
548
- php_converter_resolve_callback (ZEND_THIS , objval , "fromUCallback" , & ( objval -> from_cb ), & ( objval -> from_cache ));
531
+ php_converter_resolve_callback (& objval -> to_cache , Z_OBJ_P ( ZEND_THIS ), ZEND_STRL ( "toUCallback" ));
532
+ php_converter_resolve_callback (& objval -> from_cache , Z_OBJ_P ( ZEND_THIS ), ZEND_STRL ( "fromUCallback" ));
549
533
}
550
534
/* }}} */
551
535
0 commit comments