146#define Z_SPLRECURSIVE_IT_P(zv) spl_recursive_it_from_obj(Z_OBJ_P((zv)))
152#define Z_SPLDUAL_IT_P(zv) spl_dual_it_from_obj(Z_OBJ_P((zv)))
154#define SPL_FETCH_AND_CHECK_DUAL_IT(var, objzval) \
156 spl_dual_it_object *it = Z_SPLDUAL_IT_P(objzval); \
157 if (it->dit_type == DIT_Unknown) { \
158 zend_throw_error(NULL, "The object is in an invalid state as the parent constructor was not called"); \
164#define SPL_FETCH_SUB_ELEMENT(var, object, element) \
166 if(!(object)->iterators) { \
167 zend_throw_error(NULL, "The object is in an invalid state as the parent constructor was not called"); \
170 (var) = (object)->iterators[(object)->level].element; \
173#define SPL_FETCH_SUB_ELEMENT_ADDR(var, object, element) \
175 if(!(object)->iterators) { \
176 zend_throw_error(NULL, "The object is in an invalid state as the parent constructor was not called"); \
179 (var) = &(object)->iterators[(object)->level].element; \
182#define SPL_FETCH_SUB_ITERATOR(var, object) SPL_FETCH_SUB_ELEMENT(var, object, iterator)
192 while (
object->level > 0) {
194 sub_iter =
object->iterators[
object->level].iterator;
210 int level =
object->level;
216 sub_iter =
object->iterators[level].iterator;
225 object->in_iteration = 0;
265 iterator =
object->iterators[
object->level].iterator;
281 object->iterators[
object->level].state =
RS_TEST;
286 if (
object->callHasChildren) {
291 zend_function **cache = &
object->iterators[
object->level].haschildren;
293 zend_call_method_with_0_params(obj, ce, cache,
"haschildren", &
retval);
297 object->iterators[
object->level].state =
RS_NEXT;
311 object->iterators[
object->level].state =
RS_CHILD;
314 object->iterators[
object->level].state =
RS_SELF;
321 object->iterators[
object->level].state =
RS_NEXT;
327 if (
object->nextElement) {
330 object->iterators[
object->level].state =
RS_NEXT;
344 object->iterators[
object->level].state =
RS_CHILD;
346 object->iterators[
object->level].state =
RS_NEXT;
350 if (
object->callGetChildren) {
351 zend_call_method_with_0_params(
Z_OBJ_P(zthis),
object->ce, &
object->callGetChildren,
"callGetChildren", &child);
355 zend_function **cache = &
object->iterators[
object->level].getchildren;
357 zend_call_method_with_0_params(obj, ce, cache,
"getchildren", &child);
366 object->iterators[
object->level].state =
RS_NEXT;
379 object->iterators[
object->level].state =
RS_SELF;
381 object->iterators[
object->level].state =
RS_NEXT;
386 object->iterators[
object->level].iterator = sub_iter;
387 object->iterators[
object->level].ce = ce;
388 object->iterators[
object->level].state =
RS_START;
391 object->iterators[
object->level].haschildren =
392 object->iterators[
object->level - 1].haschildren;
393 object->iterators[
object->level].getchildren =
394 object->iterators[
object->level - 1].getchildren;
396 object->iterators[
object->level].haschildren =
NULL;
397 object->iterators[
object->level].getchildren =
NULL;
402 if (
object->beginChildren) {
416 if (
object->endChildren) {
447 sub_iter =
object->iterators[
object->level].iterator;
455 object->iterators[0].state =
RS_START;
456 sub_iter =
object->iterators[0].iterator;
463 object->in_iteration = 1;
464 spl_recursive_it_move_forward_ex(
object, zthis);
478 spl_recursive_it_dtor,
479 spl_recursive_it_valid,
480 spl_recursive_it_get_current_data,
481 spl_recursive_it_get_current_key,
482 spl_recursive_it_move_forward,
483 spl_recursive_it_rewind,
505 iterator->
intern.
funcs = &spl_recursive_it_iterator_funcs;
512 zend_call_method_with_0_params(obj, ce, getiterator_cache,
"getiterator",
retval);
519 "%s::getIterator() must return an object that implements Traversable",
530 while (
object->level >= 0) {
537 object->iterators =
NULL;
548 zval caching_it, aggregate_retval;
561 if (spl_get_iterator_from_aggregate(
565 iterator = &aggregate_retval;
572 ZVAL_LONG(¶ms[1], user_caching_it_flags);
575 if (is_initialized ==
FAILURE) {
579 iterator = &caching_it;
591 if (spl_get_iterator_from_aggregate(
595 iterator = &aggregate_retval;
611 spl_RecursiveIteratorIterator_free_iterators(intern);
661 while (intern->
level >= 0) {
683 spl_recursive_it_rewind_ex(
object,
ZEND_THIS);
735 spl_recursive_it_move_forward_ex(
object,
ZEND_THIS);
752 bool level_is_null = 1;
760 level =
object->level;
761 }
else if (level < 0 || level >
object->level) {
766 zend_throw_error(
NULL,
"The object is in an invalid state as the parent constructor was not called");
770 value = &
object->iterators[level].zobject;
814 zobject = &
object->iterators[
object->level].zobject;
836 zobject = &
object->iterators[
object->level].zobject;
877 if (max_depth < -1) {
880 }
else if (max_depth >
INT_MAX) {
884 object->max_depth = (int)max_depth;
894 if (
object->max_depth == -1) {
912 zobj = &
object->iterators[level].zobject;
915 if (!function_handler) {
916 if ((function_handler = zend_hash_find_ptr(&
Z_OBJCE_P(
zobj)->function_table, method)) ==
NULL) {
918 function_handler = (*zobject)->handlers->get_method(zobject, method,
key);
923 return function_handler;
927static void spl_RecursiveIteratorIterator_free_storage(
zend_object *_object)
931 spl_RecursiveIteratorIterator_free_iterators(
object);
934 for (
size_t i = 0; i < 6; i++) {
936 zend_string_release(
object->prefix[i]);
941 zend_string_release(
object->postfix[0]);
952 for (
int level = 0; level <=
object->level; level++) {
953 zend_get_gc_buffer_add_zval(gc_buffer, &
object->iterators[level].zobject);
954 zend_get_gc_buffer_add_obj(gc_buffer, &
object->iterators[level].iterator->std);
958 zend_get_gc_buffer_use(gc_buffer, table,
n);
990 return spl_RecursiveIteratorIterator_new_ex(class_type, 0);
997 return spl_RecursiveIteratorIterator_new_ex(class_type, 1);
1007 smart_str_append(&str,
object->prefix[0]);
1009 for (level = 0; level <
object->level; ++level) {
1010 zend_call_method_with_0_params(
Z_OBJ(
object->iterators[level].zobject),
object->iterators[level].ce,
NULL,
"hasnext", &has_next);
1013 smart_str_append(&str,
object->prefix[1]);
1015 smart_str_append(&str,
object->prefix[2]);
1020 zend_call_method_with_0_params(
Z_OBJ(
object->iterators[level].zobject),
object->iterators[level].ce,
NULL,
"hasnext", &has_next);
1023 smart_str_append(&str,
object->prefix[3]);
1025 smart_str_append(&str,
object->prefix[4]);
1030 smart_str_append(&str,
object->prefix[5]);
1047 return ZSTR_KNOWN(ZEND_STR_ARRAY_CAPITALIZED);
1049 return zval_get_string(
data);
1054 return zend_string_copy(
object->postfix[0]);
1074 if (0 > part || part > 5) {
1079 zend_string_release(
object->prefix[part]);
1080 object->prefix[part] = zend_string_copy(
prefix);
1091 zend_throw_error(
NULL,
"The object is in an invalid state as the parent constructor was not called");
1095 RETURN_STR(spl_recursive_tree_iterator_get_prefix(
object));
1108 zend_string_release(
object->postfix[0]);
1109 object->postfix[0] = zend_string_copy(postfix);
1120 zend_throw_error(
NULL,
"The object is in an invalid state as the parent constructor was not called");
1124 zend_string *entry = spl_recursive_tree_iterator_get_entry(
object);
1140 zend_throw_error(
NULL,
"The object is in an invalid state as the parent constructor was not called");
1144 RETURN_STR(spl_recursive_tree_iterator_get_postfix(
object));
1155 zend_throw_error(
NULL,
"The object is in an invalid state as the parent constructor was not called");
1172 zend_string *entry = spl_recursive_tree_iterator_get_entry(
object);
1178 zend_string *postfix = spl_recursive_tree_iterator_get_postfix(
object);
1185 zend_string_release(entry);
1186 zend_string_release(
prefix);
1187 zend_string_release(postfix);
1215 zend_string *postfix = spl_recursive_tree_iterator_get_postfix(
object);
1222 zend_string_release(key_str);
1223 zend_string_release(
prefix);
1224 zend_string_release(postfix);
1235 intern = spl_dual_it_from_obj(*
object);
1238 if (!function_handler && intern->
inner.
ce) {
1242 function_handler = (*object)->handlers->get_method(
object, method,
key);
1248 return function_handler;
1251#define SPL_CHECK_CTOR(intern, classname) \
1252 if (intern->dit_type == DIT_Unknown) { \
1254 zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Classes derived from %s must call %s::__construct()", \
1255 ZSTR_VAL((spl_ce_##classname)->name), ZSTR_VAL((spl_ce_##classname)->name)); \
1259#define APPENDIT_CHECK_CTOR(intern) SPL_CHECK_CTOR(intern, AppendIterator)
1280 int inc_refcount = 1;
1315 "CachingIterator::TOSTRING_USE_KEY, CachingIterator::TOSTRING_USE_CURRENT, "
1316 "or CachingIterator::TOSTRING_USE_INNER");
1334 || !instanceof_function(ce, ce_cast)
1367 intern->
u.
regex.flags = 0;
1368 intern->
u.
regex.preg_flags = 0;
1374 "RegexIterator::ALL_MATCHES, RegexIterator::SPLIT, or RegexIterator::REPLACE");
1388 intern->
u.
regex.regex = zend_string_copy(regex);
1477 spl_dual_it_free(intern);
1497 spl_dual_it_free(intern);
1498 if (!check_more || spl_dual_it_valid(intern) ==
SUCCESS) {
1521 spl_dual_it_free(intern);
1539 spl_dual_it_rewind(intern);
1540 spl_dual_it_fetch(intern, 1);
1596 spl_dual_it_next(intern, 1);
1597 spl_dual_it_fetch(intern, 1);
1604 while (spl_dual_it_fetch(intern, 1) ==
SUCCESS) {
1618 spl_dual_it_free(intern);
1623 spl_dual_it_rewind(intern);
1624 spl_filter_it_fetch(zthis, intern);
1629 spl_dual_it_next(intern, 1);
1630 spl_filter_it_fetch(zthis, intern);
1641 spl_filter_it_rewind(
ZEND_THIS, intern);
1697 if (is_initialized ==
FAILURE) {
1723 if (is_initialized ==
FAILURE) {
1788 subject = zval_get_string(&intern->
current.
key);
1801 switch (intern->
u.
regex.mode)
1834 zend_string *replacement_str = zval_try_get_string(replacement);
1842 zend_string_release(replacement_str);
1855 zend_string_release(replacement_str);
1902 "RegexIterator::ALL_MATCHES, RegexIterator::SPLIT, or RegexIterator::REPLACE");
1962 intern->
u.
regex.preg_flags = preg_flags;
1997 zval_ptr_dtor_str(&
args[1]);
1998 if (is_initialized ==
FAILURE) {
2021static void spl_dual_it_free_storage(
zend_object *_object)
2025 spl_dual_it_free(
object);
2027 if (
object->inner.iterator) {
2047 if (
object->u.regex.pce) {
2050 if (
object->u.regex.regex) {
2057 zend_fcc_dtor(&
object->u.callback_filter);
2070 if (
object->inner.iterator) {
2071 zend_get_gc_buffer_add_obj(gc_buffer, &
object->inner.iterator->std);
2074 zend_get_gc_buffer_add_zval(gc_buffer, &
object->current.data);
2075 zend_get_gc_buffer_add_zval(gc_buffer, &
object->current.key);
2076 zend_get_gc_buffer_add_zval(gc_buffer, &
object->inner.zobject);
2078 switch (
object->dit_type) {
2090 zend_get_gc_buffer_add_obj(gc_buffer, &
object->u.append.iterator->std);
2092 zend_get_gc_buffer_add_zval(gc_buffer, &
object->u.append.zarrayit);
2097 zend_get_gc_buffer_add_zval(gc_buffer, &
object->u.caching.zcache);
2098 zend_get_gc_buffer_add_zval(gc_buffer, &
object->u.caching.zchildren);
2103 zend_get_gc_buffer_add_fcc(gc_buffer, &
object->u.callback_filter);
2108 zend_get_gc_buffer_use(gc_buffer, table,
n);
2123 return &intern->
std;
2133 return spl_dual_it_valid(intern);
2141 spl_dual_it_free(intern);
2152 spl_dual_it_free(intern);
2156 if (spl_limit_it_valid(intern) ==
SUCCESS) {
2157 spl_dual_it_fetch(intern, 0);
2164 spl_dual_it_rewind(intern);
2167 spl_dual_it_next(intern, 1);
2169 if (spl_dual_it_valid(intern) ==
SUCCESS) {
2170 spl_dual_it_fetch(intern, 1);
2189 spl_dual_it_rewind(intern);
2215 spl_dual_it_next(intern, 1);
2217 spl_dual_it_fetch(intern, 1);
2232 spl_limit_it_seek(intern,
pos);
2254 return spl_dual_it_valid(intern);
2259 if (spl_dual_it_fetch(intern, 1) ==
SUCCESS) {
2307 if (is_initialized ==
FAILURE) {
2325 spl_dual_it_next(intern, 0);
2333 spl_dual_it_rewind(intern);
2335 spl_caching_it_next(intern);
2353 spl_caching_it_rewind(intern);
2377 spl_caching_it_next(intern);
2559 "CachingIterator::TOSTRING_USE_KEY, CachingIterator::TOSTRING_USE_CURRENT, "
2560 "or CachingIterator::TOSTRING_USE_INNER");
2720 spl_dual_it_next(intern, 1);
2721 if (spl_dual_it_valid(intern) ==
SUCCESS) {
2722 spl_dual_it_fetch(intern, 0);
2724 spl_dual_it_rewind(intern);
2725 if (spl_dual_it_valid(intern) ==
SUCCESS) {
2726 spl_dual_it_fetch(intern, 0);
2766 spl_dual_it_free(intern);
2784 spl_dual_it_rewind(intern);
2793 while (spl_dual_it_valid(intern) !=
SUCCESS) {
2795 if (spl_append_it_next_iterator(intern) !=
SUCCESS) {
2799 spl_dual_it_fetch(intern, 0);
2804 if (spl_dual_it_valid(intern) ==
SUCCESS) {
2805 spl_dual_it_next(intern, 1);
2807 spl_append_it_fetch(intern);
2840 spl_append_it_next_iterator(intern);
2842 spl_append_it_fetch(intern);
2855 spl_dual_it_fetch(intern, 1);
2873 if (spl_append_it_next_iterator(intern) ==
SUCCESS) {
2874 spl_append_it_fetch(intern);
2899 spl_append_it_next(intern);
3083 apply_info->
count++;
3084 zend_call_function_with_return_value(&apply_info->
fci, &apply_info->
fcc, &
retval);
3102 apply_info.
count = 0;
3124 spl_handlers_rec_it_it.get_method = spl_recursive_it_get_method;
3125 spl_handlers_rec_it_it.clone_obj =
NULL;
3126 spl_handlers_rec_it_it.free_obj = spl_RecursiveIteratorIterator_free_storage;
3127 spl_handlers_rec_it_it.get_gc = spl_RecursiveIteratorIterator_get_gc;
3131 spl_handlers_dual_it.get_method = spl_dual_it_get_method;
3132 spl_handlers_dual_it.clone_obj =
NULL;
3133 spl_handlers_dual_it.free_obj = spl_dual_it_free_storage;
3134 spl_handlers_dual_it.get_gc = spl_dual_it_get_gc;
count(Countable|array $value, int $mode=COUNT_NORMAL)
#define PHP_MINIT_FUNCTION
unsigned const char * pos
PHPAPI pcre2_match_context * php_pcre_mctx(void)
PHPAPI pcre2_code * php_pcre_pce_re(pcre_cache_entry *pce)
PHPAPI zend_string * php_pcre_replace_impl(pcre_cache_entry *pce, zend_string *subject_str, const char *subject, size_t subject_len, zend_string *replace_str, size_t limit, size_t *replace_count)
PHPAPI pcre2_match_data * php_pcre_create_match_data(uint32_t capture_count, pcre2_code *re)
PHPAPI void php_pcre_pce_decref(pcre_cache_entry *pce)
PHPAPI void php_pcre_match_impl(pcre_cache_entry *pce, zend_string *subject_str, zval *return_value, zval *subpats, bool global, zend_long flags, zend_off_t start_offset)
PHPAPI void php_pcre_pce_incref(pcre_cache_entry *pce)
PHPAPI pcre_cache_entry * pcre_get_compiled_regex_cache(zend_string *regex)
PHPAPI void php_pcre_free_match_data(pcre2_match_data *match_data)
PHPAPI void php_pcre_split_impl(pcre_cache_entry *pce, zend_string *subject_str, zval *return_value, zend_long limit_val, zend_long flags)
struct _pcre_cache_entry pcre_cache_entry
unsigned char key[REFLECTION_KEY_LEN]
iterator_count(iterable $iterator)
iterator_to_array(iterable $iterator, bool $preserve_keys=true)
iterator_apply(Traversable $iterator, callable $callback, ?array $args=null)
void spl_array_iterator_append(zval *object, zval *append_value)
PHPAPI zend_class_entry * spl_ce_ArrayIterator
void spl_array_iterator_key(zval *object, zval *return_value)
PHPAPI zend_class_entry * spl_ce_LogicException
PHPAPI zend_class_entry * spl_ce_BadMethodCallException
PHPAPI zend_class_entry * spl_ce_UnexpectedValueException
PHPAPI zend_class_entry * spl_ce_OutOfBoundsException
PHPAPI zend_class_entry * spl_ce_InvalidArgumentException
PHPAPI zend_class_entry * spl_ce_IteratorIterator
PHPAPI zend_class_entry * spl_ce_RecursiveCallbackFilterIterator
struct _spl_recursive_it_object spl_recursive_it_object
#define SPL_FETCH_SUB_ELEMENT_ADDR(var, object, element)
PHPAPI zend_result spl_iterator_apply(zval *obj, spl_iterator_apply_func_t apply_func, void *puser)
PHPAPI zend_class_entry * spl_ce_InfiniteIterator
PHPAPI zend_class_entry * spl_ce_RecursiveFilterIterator
PHPAPI zend_class_entry * spl_ce_RecursiveCachingIterator
PHPAPI zend_class_entry * spl_ce_LimitIterator
PHPAPI zend_class_entry * spl_ce_CallbackFilterIterator
PHPAPI zend_class_entry * spl_ce_RecursiveTreeIterator
PHPAPI zend_class_entry * spl_ce_AppendIterator
PHPAPI zend_class_entry * spl_ce_CachingIterator
#define SPL_FETCH_AND_CHECK_DUAL_IT(var, objzval)
PHPAPI zend_class_entry * spl_ce_RecursiveIteratorIterator
PHPAPI zend_class_entry * spl_ce_RecursiveRegexIterator
#define APPENDIT_CHECK_CTOR(intern)
#define Z_SPLDUAL_IT_P(zv)
PHPAPI zend_class_entry * spl_ce_RegexIterator
struct _spl_dual_it_object spl_dual_it_object
#define Z_SPLRECURSIVE_IT_P(zv)
PHPAPI zend_class_entry * spl_ce_RecursiveIterator
#define SPL_FETCH_SUB_ELEMENT(var, object, element)
PHPAPI zend_class_entry * spl_ce_FilterIterator
PHPAPI zend_class_entry * spl_ce_SeekableIterator
PHPAPI zend_class_entry * spl_ce_EmptyIterator
PHPAPI zend_class_entry * spl_ce_ParentIterator
struct _spl_recursive_it_iterator spl_recursive_it_iterator
PHPAPI zend_class_entry * spl_ce_OuterIterator
#define SPL_FETCH_SUB_ITERATOR(var, object)
struct _spl_sub_iterator spl_sub_iterator
PHPAPI zend_class_entry * spl_ce_NoRewindIterator
int(* spl_iterator_apply_func_t)(zend_object_iterator *iter, void *puser)
@ RIT_RecursiveTreeIterator
@ RIT_RecursiveIteratorIterator
#define RIT_CATCH_GET_CHILD
@ CIT_TOSTRING_USE_CURRENT
@ DIT_RecursiveRegexIterator
@ DIT_RecursiveCachingIterator
@ DIT_RecursiveCallbackFilterIterator
@ DIT_RecursiveFilterIterator
@ DIT_CallbackFilterIterator
struct _spl_dual_it_object::@012240072325330126316172276321013152034333106151::@212234175242011007307133367026020110337331214204 append
union _spl_dual_it_object::@012240072325330126316172276321013152034333106151 u
zend_fcall_info_cache callback_filter
struct _spl_dual_it_object::@005376174137325342047325047243100202123274372045 current
struct _spl_dual_it_object::@012240072325330126316172276321013152034333106151::@006272062141275373266122061203141270350377172271 caching
struct _spl_dual_it_object::@012240072325330126316172276321013152034333106151::@342144152202164315055333174206037133114170012047 limit
zend_object_iterator * iterator
struct _spl_dual_it_object::@251115313140126033323014171122330174020351311013 inner
zend_object_iterator intern
zend_function * beginIteration
zend_function * callGetChildren
spl_sub_iterator * iterators
zend_function * endIteration
zend_function * beginChildren
zend_function * callHasChildren
RecursiveIteratorMode mode
zend_function * endChildren
zend_function * nextElement
RecursiveIteratorState state
zend_object_iterator * iterator
zend_function * getchildren
zend_function * haschildren
zend_class_iterator_funcs * iterator_funcs_ptr
zend_object_iterator *(* get_iterator)(zend_class_entry *ce, zval *object, int by_ref)
zend_function * zf_new_iterator
void(* get_current_key)(zend_object_iterator *iter, zval *key)
void(* invalidate_current)(zend_object_iterator *iter)
void(* rewind)(zend_object_iterator *iter)
void(* move_forward)(zend_object_iterator *iter)
zend_result(* valid)(zend_object_iterator *iter)
zval *(* get_current_data)(zend_object_iterator *iter)
const zend_object_iterator_funcs * funcs
zend_fcall_info_cache fcc
struct _zend_function::@236135173067030250234125302313220025134003177336 common
ZEND_API ZEND_COLD void zend_throw_error(zend_class_entry *exception_ce, const char *format,...)
ZEND_API ZEND_COLD void zend_error(int type, const char *format,...)
#define INTERNAL_FUNCTION_PARAMETERS
ZEND_API void zend_replace_error_handling(zend_error_handling_t error_handling, zend_class_entry *exception_class, zend_error_handling *current)
ZEND_API void zend_restore_error_handling(zend_error_handling *saved)
#define INTERNAL_FUNCTION_PARAM_PASSTHRU
ZEND_API zend_result array_set_zval_key(HashTable *ht, zval *key, zval *value)
ZEND_API zend_result object_init_ex(zval *arg, zend_class_entry *class_type)
ZEND_API zend_result object_init_with_constructor(zval *arg, zend_class_entry *class_type, uint32_t param_count, zval *params, HashTable *named_params)
ZEND_API zval * zend_read_property(zend_class_entry *scope, zend_object *object, const char *name, size_t name_length, bool silent, zval *rv)
ZEND_API void zend_get_callable_zval_from_fcc(const zend_fcall_info_cache *fcc, zval *callable)
ZEND_API zend_result zend_parse_parameters(uint32_t num_args, const char *type_spec,...)
ZEND_API void object_properties_init(zend_object *object, zend_class_entry *class_type)
ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *format,...)
#define RETURN_COPY_DEREF(zv)
struct _zend_fcall_info_cache zend_fcall_info_cache
#define ZEND_PARSE_PARAMETERS_END()
#define ZEND_PARSE_PARAMETERS_NONE()
#define zend_parse_parameters_none()
#define ZEND_PARSE_PARAMETERS_START(min_num_args, max_num_args)
#define RETURN_NEW_STR(s)
struct _zend_fcall_info zend_fcall_info
#define Z_PARAM_ITERABLE(dest)
#define ZEND_FCC_INITIALIZED(fcc)
#define RETURN_COPY_VALUE(zv)
#define Z_PARAM_BOOL(dest)
#define RETURN_EMPTY_STRING()
#define RETURN_STR_COPY(s)
#define erealloc(ptr, size)
zend_string_release_ex(func->internal_function.function_name, 0)
ZEND_API ZEND_COLD zend_object * zend_throw_exception(zend_class_entry *exception_ce, const char *message, zend_long code)
ZEND_API void zend_clear_exception(void)
ZEND_API ZEND_COLD zend_object * zend_throw_exception_ex(zend_class_entry *exception_ce, zend_long code, const char *format,...)
ZEND_API zend_class_entry * zend_lookup_class(zend_string *name)
union _zend_function zend_function
ZEND_API zend_get_gc_buffer * zend_get_gc_buffer_create(void)
ZEND_API HashTable * zend_array_to_list(HashTable *source)
ZEND_API void ZEND_FASTCALL zend_hash_clean(HashTable *ht)
#define ZEND_HASH_APPLY_STOP
#define ZEND_HASH_APPLY_KEEP
ZEND_API zend_class_entry * zend_ce_countable
ZEND_API zend_class_entry * zend_ce_iterator
ZEND_API zend_class_entry * zend_ce_traversable
ZEND_API zend_class_entry * zend_ce_stringable
ZEND_API zend_class_entry * zend_ce_arrayaccess
ZEND_API zend_class_entry * zend_ce_aggregate
ZEND_API void zend_iterator_init(zend_object_iterator *iter)
ZEND_API void zend_iterator_dtor(zend_object_iterator *iter)
struct _zend_object_iterator zend_object_iterator
struct _zend_object_iterator_funcs zend_object_iterator_funcs
struct _zend_string zend_string
ZEND_API zend_function * zend_std_get_method(zend_object **obj_ptr, zend_string *method_name, const zval *key)
ZEND_API HashTable * zend_std_get_properties(zend_object *zobj)
ZEND_API const zend_object_handlers std_object_handlers
ZEND_API void ZEND_FASTCALL zend_object_std_init(zend_object *object, zend_class_entry *ce)
ZEND_API void zend_object_std_dtor(zend_object *object)
ZEND_API bool ZEND_FASTCALL zend_is_true(const zval *op)
#define convert_to_string(op)
#define XtOffsetOf(s_type, field)
#define UNEXPECTED(condition)
struct _zend_class_entry zend_class_entry
struct _zend_object zend_object
ZEND_API zend_string * zend_string_concat3(const char *str1, size_t str1_len, const char *str2, size_t str2_len, const char *str3, size_t str3_len)
#define ZSTR_INIT_LITERAL(s, persistent)
#define ZSTR_EMPTY_ALLOC()
#define Z_ISREF_P(zval_p)
#define Z_TRY_ADDREF_P(pz)
#define Z_ISUNDEF_P(zval_p)
#define Z_ARRVAL_P(zval_p)
#define ZVAL_STR_COPY(z, s)
struct _zend_array HashTable
#define Z_OBJCE_P(zval_p)
#define ZVAL_OBJ_COPY(z, o)
ZEND_RESULT_CODE zend_result
struct _zend_object_handlers zend_object_handlers
#define ZVAL_COPY_VALUE(z, v)
ZEND_API void zval_ptr_dtor(zval *zval_ptr)
zend_refcounted * garbage