@@ -101,12 +101,6 @@ typedef struct _spl_recursive_it_iterator {
101
101
zend_object_iterator intern ;
102
102
} spl_recursive_it_iterator ;
103
103
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
-
110
104
typedef struct _spl_dual_it_object {
111
105
struct {
112
106
zval zobject ;
@@ -143,7 +137,7 @@ typedef struct _spl_dual_it_object {
143
137
regex_mode mode ;
144
138
int use_flags ;
145
139
} regex ;
146
- _spl_cbfilter_it_intern * cbfilter ;
140
+ zend_fcall_info_cache callback_filter ;
147
141
} u ;
148
142
zend_object std ;
149
143
} spl_dual_it_object ;
@@ -1441,16 +1435,11 @@ static spl_dual_it_object* spl_dual_it_construct(INTERNAL_FUNCTION_PARAMETERS, z
1441
1435
}
1442
1436
case DIT_CallbackFilterIterator :
1443
1437
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 ) {
1448
1440
return NULL ;
1449
1441
}
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 );
1454
1443
break ;
1455
1444
}
1456
1445
default :
@@ -1783,7 +1772,10 @@ PHP_METHOD(RecursiveCallbackFilterIterator, getChildren)
1783
1772
1784
1773
zend_call_method_with_0_params (Z_OBJ (intern -> inner .zobject ), intern -> inner .ce , NULL , "getchildren" , & retval );
1785
1774
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 );
1787
1779
}
1788
1780
zval_ptr_dtor (& retval );
1789
1781
} /* }}} */
@@ -1819,13 +1811,10 @@ PHP_METHOD(CallbackFilterIterator, accept)
1819
1811
ZVAL_COPY_VALUE (& params [1 ], & intern -> current .key );
1820
1812
ZVAL_COPY_VALUE (& params [2 ], & intern -> inner .zobject );
1821
1813
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 ;
1827
1815
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 )) {
1829
1818
RETURN_FALSE ;
1830
1819
}
1831
1820
}
@@ -2129,14 +2118,8 @@ static void spl_dual_it_free_storage(zend_object *_object)
2129
2118
}
2130
2119
2131
2120
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 );
2140
2123
}
2141
2124
}
2142
2125
@@ -2181,11 +2164,8 @@ static HashTable *spl_dual_it_get_gc(zend_object *obj, zval **table, int *n)
2181
2164
break ;
2182
2165
case DIT_CallbackFilterIterator :
2183
2166
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 );
2189
2169
}
2190
2170
break ;
2191
2171
}
0 commit comments