2727
2828typedef struct _php_converter_object {
2929 UConverter * src , * dest ;
30- zend_fcall_info to_cb , from_cb ;
3130 zend_fcall_info_cache to_cache , from_cache ;
3231 intl_error error ;
3332 zend_object obj ;
@@ -230,13 +229,9 @@ static void php_converter_to_u_callback(const void *context,
230229 ZVAL_LONG (& zargs [3 ], * pErrorCode );
231230 ZVAL_MAKE_REF (& zargs [3 ]);
232231
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 ))) {
240235 php_converter_append_toUnicode_target (& retval , args , objval );
241236 zval_ptr_dtor (& retval );
242237 }
@@ -297,11 +292,10 @@ static void php_converter_from_u_callback(const void *context,
297292 php_converter_object * objval = (php_converter_object * )context ;
298293 zval retval ;
299294 zval zargs [4 ];
300- int i ;
301295
302296 ZVAL_LONG (& zargs [0 ], reason );
303297 array_init (& zargs [1 ]);
304- i = 0 ;
298+ int i = 0 ;
305299 while (i < length ) {
306300 UChar32 c ;
307301 U16_NEXT (codeUnits , i , length , c );
@@ -311,13 +305,9 @@ static void php_converter_from_u_callback(const void *context,
311305 ZVAL_LONG (& zargs [3 ], * pErrorCode );
312306 ZVAL_MAKE_REF (& zargs [3 ]);
313307
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 ))) {
321311 php_converter_append_fromUnicode_target (& retval , args , objval );
322312 zval_ptr_dtor (& retval );
323313 }
@@ -503,26 +493,20 @@ PHP_METHOD(UConverter, getDestinationType) {
503493/* }}} */
504494
505495/* {{{ 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 );
513504
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 ;
526510}
527511/* }}} */
528512
@@ -544,8 +528,8 @@ PHP_METHOD(UConverter, __construct) {
544528
545529 php_converter_set_encoding (objval , & (objval -> src ), src , src_len );
546530 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" ));
549533}
550534/* }}} */
551535
0 commit comments