Skip to content

Commit 8d5d3fd

Browse files
committed
Refactor SPL Callback filter to only use FCC
1 parent de4cfff commit 8d5d3fd

File tree

1 file changed

+15
-35
lines changed

1 file changed

+15
-35
lines changed

ext/spl/spl_iterators.c

+15-35
Original file line numberDiff line numberDiff line change
@@ -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-
110104
typedef 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

Comments
 (0)