@@ -101,12 +101,6 @@ typedef struct _spl_recursive_it_iterator {
101101 zend_object_iterator intern ;
102102} spl_recursive_it_iterator ;
103103
104- typedef struct _spl_cbfilter_it_intern {
105- zend_fcall_info fci ;
106- zend_fcall_info_cache fcc ;
107- zend_object * object ;
108- } _spl_cbfilter_it_intern ;
109-
110104typedef struct _spl_dual_it_object {
111105 struct {
112106 zval zobject ;
@@ -143,7 +137,7 @@ typedef struct _spl_dual_it_object {
143137 regex_mode mode ;
144138 int use_flags ;
145139 } regex ;
146- _spl_cbfilter_it_intern * cbfilter ;
140+ zend_fcall_info_cache callback_filter ;
147141 } u ;
148142 zend_object std ;
149143} spl_dual_it_object ;
@@ -1441,16 +1435,11 @@ static spl_dual_it_object* spl_dual_it_construct(INTERNAL_FUNCTION_PARAMETERS, z
14411435 }
14421436 case DIT_CallbackFilterIterator :
14431437 case DIT_RecursiveCallbackFilterIterator : {
1444- _spl_cbfilter_it_intern * cfi = emalloc (sizeof (* cfi ));
1445- cfi -> fci .object = NULL ;
1446- if (zend_parse_parameters (ZEND_NUM_ARGS (), "Of" , & zobject , ce_inner , & cfi -> fci , & cfi -> fcc ) == FAILURE ) {
1447- efree (cfi );
1438+ zend_fcall_info fci ;
1439+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "Of" , & zobject , ce_inner , & fci , & intern -> u .callback_filter ) == FAILURE ) {
14481440 return NULL ;
14491441 }
1450- Z_TRY_ADDREF (cfi -> fci .function_name );
1451- cfi -> object = cfi -> fcc .object ;
1452- if (cfi -> object ) GC_ADDREF (cfi -> object );
1453- intern -> u .cbfilter = cfi ;
1442+ zend_fcc_addref (& intern -> u .callback_filter );
14541443 break ;
14551444 }
14561445 default :
@@ -1783,7 +1772,10 @@ PHP_METHOD(RecursiveCallbackFilterIterator, getChildren)
17831772
17841773 zend_call_method_with_0_params (Z_OBJ (intern -> inner .zobject ), intern -> inner .ce , NULL , "getchildren" , & retval );
17851774 if (!EG (exception ) && Z_TYPE (retval ) != IS_UNDEF ) {
1786- spl_instantiate_arg_ex2 (Z_OBJCE_P (ZEND_THIS ), return_value , & retval , & intern -> u .cbfilter -> fci .function_name );
1775+ zval callable ;
1776+ zend_get_callable_zval_from_fcc (& intern -> u .callback_filter , & callable );
1777+ spl_instantiate_arg_ex2 (Z_OBJCE_P (ZEND_THIS ), return_value , & retval , & callable );
1778+ zval_ptr_dtor (& callable );
17871779 }
17881780 zval_ptr_dtor (& retval );
17891781} /* }}} */
@@ -1819,13 +1811,10 @@ PHP_METHOD(CallbackFilterIterator, accept)
18191811 ZVAL_COPY_VALUE (& params [1 ], & intern -> current .key );
18201812 ZVAL_COPY_VALUE (& params [2 ], & intern -> inner .zobject );
18211813
1822- zend_fcall_info * fci = & intern -> u .cbfilter -> fci ;
1823- zend_fcall_info_cache * fcc = & intern -> u .cbfilter -> fcc ;
1824- fci -> retval = return_value ;
1825- fci -> param_count = 3 ;
1826- fci -> params = params ;
1814+ zend_fcall_info_cache * fcc = & intern -> u .callback_filter ;
18271815
1828- if (zend_call_function (fci , fcc ) != SUCCESS || Z_ISUNDEF_P (return_value )) {
1816+ zend_call_known_fcc (fcc , return_value , 3 , params , NULL );
1817+ if (Z_ISUNDEF_P (return_value )) {
18291818 RETURN_FALSE ;
18301819 }
18311820}
@@ -2129,14 +2118,8 @@ static void spl_dual_it_free_storage(zend_object *_object)
21292118 }
21302119
21312120 if (object -> dit_type == DIT_CallbackFilterIterator || object -> dit_type == DIT_RecursiveCallbackFilterIterator ) {
2132- if (object -> u .cbfilter ) {
2133- _spl_cbfilter_it_intern * cbfilter = object -> u .cbfilter ;
2134- object -> u .cbfilter = NULL ;
2135- zval_ptr_dtor (& cbfilter -> fci .function_name );
2136- if (cbfilter -> fci .object ) {
2137- OBJ_RELEASE (cbfilter -> fci .object );
2138- }
2139- efree (cbfilter );
2121+ if (ZEND_FCC_INITIALIZED (object -> u .callback_filter )) {
2122+ zend_fcc_dtor (& object -> u .callback_filter );
21402123 }
21412124 }
21422125
@@ -2181,11 +2164,8 @@ static HashTable *spl_dual_it_get_gc(zend_object *obj, zval **table, int *n)
21812164 break ;
21822165 case DIT_CallbackFilterIterator :
21832166 case DIT_RecursiveCallbackFilterIterator :
2184- if (object -> u .cbfilter ) {
2185- zend_get_gc_buffer_add_zval (gc_buffer , & object -> u .cbfilter -> fci .function_name );
2186- if (object -> u .cbfilter -> fci .object ) {
2187- zend_get_gc_buffer_add_obj (gc_buffer , object -> u .cbfilter -> fci .object );
2188- }
2167+ if (ZEND_FCC_INITIALIZED (object -> u .callback_filter )) {
2168+ zend_get_gc_buffer_add_fcc (gc_buffer , & object -> u .callback_filter );
21892169 }
21902170 break ;
21912171 }
0 commit comments