Skip to content

Commit 4740dab

Browse files
committed
Reverted back ce->iterator_funcs_ptr. Initialize ce->iterator_funcs_ptr fields in immutable classes.
1 parent ad7a78b commit 4740dab

15 files changed

+125
-192
lines changed

UPGRADING.INTERNALS

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,9 @@ PHP 7.4 INTERNALS UPGRADE NOTES
128128
Few related data structures were changed to allow addressing mutable data
129129
structures from immutable ones. This access is implemented through
130130
ZEND_MAP_PTR... abstraction macros and, basically, uses additional level of
131-
indirection. op_array->run_time_cache, op_array->static_variables_ptr,
132-
class_entry->static_members_table and class_entry->iterator_funcs_ptr now
133-
have to be accessed through ZEND_MAP_PTR... macros.
131+
indirection. op_array->run_time_cache, op_array->static_variables_ptr and
132+
class_entry->static_members_table now have to be accessed through
133+
ZEND_MAP_PTR... macros.
134134
It's also not allowed to change op_array->reserved[] handles of immutable
135135
op_arrays. Instead, now you have to reserve op_array handle using
136136
zend_get_op_array_extension_handle() during MINIT and access its value

Zend/zend.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ struct _zend_class_entry {
148148
zend_function *unserialize_func;
149149

150150
/* allocated only if class implements Iterator or IteratorAggregate interface */
151-
ZEND_MAP_PTR_DEF(zend_class_iterator_funcs *, iterator_funcs_ptr);
151+
zend_class_iterator_funcs *iterator_funcs_ptr;
152152

153153
/* handlers */
154154
union {

Zend/zend_API.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ typedef struct _zend_fcall_info_cache {
219219
class_container.trait_precedences = NULL; \
220220
class_container.interfaces = NULL; \
221221
class_container.get_iterator = NULL; \
222-
ZEND_MAP_PTR_INIT(class_container.iterator_funcs_ptr, NULL); \
222+
class_container.iterator_funcs_ptr = NULL; \
223223
class_container.info.internal.module = NULL; \
224224
class_container.info.internal.builtin_functions = functions; \
225225
}

Zend/zend_compile.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1638,7 +1638,7 @@ ZEND_API void zend_initialize_class_data(zend_class_entry *ce, zend_bool nullify
16381638
ce->__tostring = NULL;
16391639
ce->create_object = NULL;
16401640
ce->get_iterator = NULL;
1641-
ZEND_MAP_PTR_INIT(ce->iterator_funcs_ptr, NULL);
1641+
ce->iterator_funcs_ptr = NULL;
16421642
ce->get_static_method = NULL;
16431643
ce->parent = NULL;
16441644
ce->parent_name = NULL;

Zend/zend_inheritance.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,9 @@ static void do_inherit_parent_constructor(zend_class_entry *ce) /* {{{ */
9292
if (EXPECTED(!ce->get_iterator)) {
9393
ce->get_iterator = parent->get_iterator;
9494
}
95-
if (ZEND_MAP_PTR(parent->iterator_funcs_ptr)) {
95+
if (parent->iterator_funcs_ptr) {
9696
/* Must be initialized through iface->interface_gets_implemented() */
97-
ZEND_ASSERT(ZEND_MAP_PTR_GET(ce->iterator_funcs_ptr));
97+
ZEND_ASSERT(ce->iterator_funcs_ptr);
9898
}
9999
if (EXPECTED(!ce->__get)) {
100100
ce->__get = parent->__get;

Zend/zend_interfaces.c

Lines changed: 30 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -119,36 +119,12 @@ ZEND_API zval* zend_call_method(zval *object, zend_class_entry *obj_ce, zend_fun
119119
}
120120
/* }}} */
121121

122-
typedef struct _zend_class_iterator_funcs_ptr {
123-
zend_class_iterator_funcs *ptr;
124-
zend_class_iterator_funcs data;
125-
} zend_class_iterator_funcs_ptr;
126-
127122
/* iterator interface, c-level functions used by engine */
128-
static zend_never_inline zend_class_iterator_funcs* zend_alloc_iterator_funcs_ptr(zend_class_entry *ce) /* {{{ */
129-
{
130-
zend_class_iterator_funcs *ptr = zend_arena_alloc(&CG(arena), sizeof(zend_class_iterator_funcs));
131-
memset(ptr, 0, sizeof(zend_class_iterator_funcs));
132-
ZEND_MAP_PTR_SET(ce->iterator_funcs_ptr, ptr);
133-
return ptr;
134-
}
135-
/* }}} */
136-
137-
static zend_always_inline zend_class_iterator_funcs* zend_get_iterator_funcs_ptr(zend_class_entry *ce) /* {{{ */
138-
{
139-
if (ZEND_MAP_PTR_GET(ce->iterator_funcs_ptr)) {
140-
return ZEND_MAP_PTR_GET(ce->iterator_funcs_ptr);
141-
} else {
142-
return zend_alloc_iterator_funcs_ptr(ce);
143-
}
144-
}
145-
/* }}} */
146123

147124
/* {{{ zend_user_it_new_iterator */
148125
ZEND_API void zend_user_it_new_iterator(zend_class_entry *ce, zval *object, zval *retval)
149126
{
150-
zend_class_iterator_funcs *iterator_funcs_ptr = zend_get_iterator_funcs_ptr(ce);
151-
zend_call_method_with_0_params(object, ce, &iterator_funcs_ptr->zf_new_iterator, "getiterator", retval);
127+
zend_call_method_with_0_params(object, ce, &ce->iterator_funcs_ptr->zf_new_iterator, "getiterator", retval);
152128
}
153129
/* }}} */
154130

@@ -183,10 +159,8 @@ ZEND_API int zend_user_it_valid(zend_object_iterator *_iter)
183159
zval *object = &iter->it.data;
184160
zval more;
185161
int result;
186-
zend_class_entry *ce = iter->ce;
187-
zend_class_iterator_funcs *iterator_funcs_ptr = zend_get_iterator_funcs_ptr(ce);
188162

189-
zend_call_method_with_0_params(object, ce, &iterator_funcs_ptr->zf_valid, "valid", &more);
163+
zend_call_method_with_0_params(object, iter->ce, &iter->ce->iterator_funcs_ptr->zf_valid, "valid", &more);
190164
result = i_zend_is_true(&more);
191165
zval_ptr_dtor(&more);
192166
return result ? SUCCESS : FAILURE;
@@ -202,10 +176,7 @@ ZEND_API zval *zend_user_it_get_current_data(zend_object_iterator *_iter)
202176
zval *object = &iter->it.data;
203177

204178
if (Z_ISUNDEF(iter->value)) {
205-
zend_class_entry *ce = iter->ce;
206-
zend_class_iterator_funcs *iterator_funcs_ptr = zend_get_iterator_funcs_ptr(ce);
207-
208-
zend_call_method_with_0_params(object, ce, &iterator_funcs_ptr->zf_current, "current", &iter->value);
179+
zend_call_method_with_0_params(object, iter->ce, &iter->ce->iterator_funcs_ptr->zf_current, "current", &iter->value);
209180
}
210181
return &iter->value;
211182
}
@@ -217,10 +188,8 @@ ZEND_API void zend_user_it_get_current_key(zend_object_iterator *_iter, zval *ke
217188
zend_user_iterator *iter = (zend_user_iterator*)_iter;
218189
zval *object = &iter->it.data;
219190
zval retval;
220-
zend_class_entry *ce = iter->ce;
221-
zend_class_iterator_funcs *iterator_funcs_ptr = zend_get_iterator_funcs_ptr(ce);
222191

223-
zend_call_method_with_0_params(object, ce, &iterator_funcs_ptr->zf_key, "key", &retval);
192+
zend_call_method_with_0_params(object, iter->ce, &iter->ce->iterator_funcs_ptr->zf_key, "key", &retval);
224193

225194
if (Z_TYPE(retval) != IS_UNDEF) {
226195
ZVAL_ZVAL(key, &retval, 1, 1);
@@ -239,11 +208,9 @@ ZEND_API void zend_user_it_move_forward(zend_object_iterator *_iter)
239208
{
240209
zend_user_iterator *iter = (zend_user_iterator*)_iter;
241210
zval *object = &iter->it.data;
242-
zend_class_entry *ce = iter->ce;
243-
zend_class_iterator_funcs *iterator_funcs_ptr = zend_get_iterator_funcs_ptr(ce);
244211

245212
zend_user_it_invalidate_current(_iter);
246-
zend_call_method_with_0_params(object, ce, &iterator_funcs_ptr->zf_next, "next", NULL);
213+
zend_call_method_with_0_params(object, iter->ce, &iter->ce->iterator_funcs_ptr->zf_next, "next", NULL);
247214
}
248215
/* }}} */
249216

@@ -252,11 +219,9 @@ ZEND_API void zend_user_it_rewind(zend_object_iterator *_iter)
252219
{
253220
zend_user_iterator *iter = (zend_user_iterator*)_iter;
254221
zval *object = &iter->it.data;
255-
zend_class_entry *ce = iter->ce;
256-
zend_class_iterator_funcs *iterator_funcs_ptr = zend_get_iterator_funcs_ptr(ce);
257222

258223
zend_user_it_invalidate_current(_iter);
259-
zend_call_method_with_0_params(object, ce, &iterator_funcs_ptr->zf_rewind, "rewind", NULL);
224+
zend_call_method_with_0_params(object, iter->ce, &iter->ce->iterator_funcs_ptr->zf_rewind, "rewind", NULL);
260225
}
261226
/* }}} */
262227

@@ -347,7 +312,6 @@ static int zend_implement_aggregate(zend_class_entry *interface, zend_class_entr
347312
{
348313
uint32_t i;
349314
int t = -1;
350-
zend_class_iterator_funcs *iterator_funcs_ptr;
351315

352316
if (class_type->get_iterator) {
353317
if (class_type->type == ZEND_INTERNAL_CLASS) {
@@ -376,40 +340,24 @@ static int zend_implement_aggregate(zend_class_entry *interface, zend_class_entr
376340
}
377341
}
378342
class_type->get_iterator = zend_user_it_get_new_iterator;
379-
if (ZEND_MAP_PTR(class_type->iterator_funcs_ptr)) {
380-
iterator_funcs_ptr = ZEND_MAP_PTR_GET(class_type->iterator_funcs_ptr);
381-
ZEND_ASSERT(iterator_funcs_ptr);
382-
if (class_type->type == ZEND_USER_CLASS) {
383-
iterator_funcs_ptr->zf_new_iterator = NULL;
384-
return SUCCESS;
385-
}
343+
if (class_type->iterator_funcs_ptr != NULL) {
344+
class_type->iterator_funcs_ptr->zf_new_iterator = NULL;
386345
} else if (class_type->type == ZEND_INTERNAL_CLASS) {
387-
/* We can use pointer even in ZTS mode, because this structure is read-only */
388-
zend_class_iterator_funcs_ptr *iterator_funcs_ptr_ptr =
389-
calloc(1, sizeof(zend_class_iterator_funcs_ptr));
390-
ZEND_MAP_PTR_INIT(class_type->iterator_funcs_ptr, &iterator_funcs_ptr_ptr->ptr);
391-
iterator_funcs_ptr = &iterator_funcs_ptr_ptr->data;
392-
iterator_funcs_ptr_ptr->ptr = iterator_funcs_ptr;
346+
class_type->iterator_funcs_ptr = calloc(1, sizeof(zend_class_iterator_funcs));
393347
} else {
394-
zend_class_iterator_funcs_ptr *iterator_funcs_ptr_ptr =
395-
zend_arena_alloc(&CG(arena), sizeof(zend_class_iterator_funcs_ptr));
396-
iterator_funcs_ptr_ptr->ptr = &iterator_funcs_ptr_ptr->data;
397-
ZEND_MAP_PTR_INIT(class_type->iterator_funcs_ptr, &iterator_funcs_ptr_ptr->ptr);
398-
iterator_funcs_ptr = &iterator_funcs_ptr_ptr->data;
399-
iterator_funcs_ptr_ptr->ptr = iterator_funcs_ptr;
400-
memset(iterator_funcs_ptr, 0, sizeof(zend_class_iterator_funcs));
401-
return SUCCESS;
348+
class_type->iterator_funcs_ptr = zend_arena_alloc(&CG(arena), sizeof(zend_class_iterator_funcs));
349+
memset(class_type->iterator_funcs_ptr, 0, sizeof(zend_class_iterator_funcs));
350+
}
351+
if (class_type->type == ZEND_INTERNAL_CLASS) {
352+
class_type->iterator_funcs_ptr->zf_new_iterator = zend_hash_str_find_ptr(&class_type->function_table, "getiterator", sizeof("getiterator") - 1);
402353
}
403-
iterator_funcs_ptr->zf_new_iterator = zend_hash_str_find_ptr(&class_type->function_table, "getiterator", sizeof("getiterator") - 1);
404354
return SUCCESS;
405355
}
406356
/* }}} */
407357

408358
/* {{{ zend_implement_iterator */
409359
static int zend_implement_iterator(zend_class_entry *interface, zend_class_entry *class_type)
410360
{
411-
zend_class_iterator_funcs *iterator_funcs_ptr;
412-
413361
if (class_type->get_iterator && class_type->get_iterator != zend_user_it_get_iterator) {
414362
if (class_type->type == ZEND_INTERNAL_CLASS) {
415363
/* inheritance ensures the class has the necessary userland methods */
@@ -426,39 +374,25 @@ static int zend_implement_iterator(zend_class_entry *interface, zend_class_entry
426374
}
427375
}
428376
class_type->get_iterator = zend_user_it_get_iterator;
429-
if (ZEND_MAP_PTR(class_type->iterator_funcs_ptr)) {
430-
iterator_funcs_ptr = ZEND_MAP_PTR_GET(class_type->iterator_funcs_ptr);
431-
ZEND_ASSERT(iterator_funcs_ptr);
432-
if (class_type->type == ZEND_USER_CLASS) {
433-
iterator_funcs_ptr->zf_valid = NULL;
434-
iterator_funcs_ptr->zf_current = NULL;
435-
iterator_funcs_ptr->zf_key = NULL;
436-
iterator_funcs_ptr->zf_next = NULL;
437-
iterator_funcs_ptr->zf_rewind = NULL;
438-
return SUCCESS;
439-
}
377+
if (class_type->iterator_funcs_ptr != NULL) {
378+
class_type->iterator_funcs_ptr->zf_valid = NULL;
379+
class_type->iterator_funcs_ptr->zf_current = NULL;
380+
class_type->iterator_funcs_ptr->zf_key = NULL;
381+
class_type->iterator_funcs_ptr->zf_next = NULL;
382+
class_type->iterator_funcs_ptr->zf_rewind = NULL;
440383
} else if (class_type->type == ZEND_INTERNAL_CLASS) {
441-
/* We can use pointer even in ZTS mode, because this structure is read-only */
442-
zend_class_iterator_funcs_ptr *iterator_funcs_ptr_ptr =
443-
calloc(1, sizeof(zend_class_iterator_funcs_ptr));
444-
ZEND_MAP_PTR_INIT(class_type->iterator_funcs_ptr, &iterator_funcs_ptr_ptr->ptr);
445-
iterator_funcs_ptr = &iterator_funcs_ptr_ptr->data;
446-
iterator_funcs_ptr_ptr->ptr = iterator_funcs_ptr;
384+
class_type->iterator_funcs_ptr = calloc(1, sizeof(zend_class_iterator_funcs));
447385
} else {
448-
zend_class_iterator_funcs_ptr *iterator_funcs_ptr_ptr =
449-
zend_arena_alloc(&CG(arena), sizeof(zend_class_iterator_funcs_ptr));
450-
iterator_funcs_ptr_ptr->ptr = &iterator_funcs_ptr_ptr->data;
451-
ZEND_MAP_PTR_INIT(class_type->iterator_funcs_ptr, &iterator_funcs_ptr_ptr->ptr);
452-
iterator_funcs_ptr = &iterator_funcs_ptr_ptr->data;
453-
iterator_funcs_ptr_ptr->ptr = iterator_funcs_ptr;
454-
memset(iterator_funcs_ptr, 0, sizeof(zend_class_iterator_funcs));
455-
return SUCCESS;
386+
class_type->iterator_funcs_ptr = zend_arena_alloc(&CG(arena), sizeof(zend_class_iterator_funcs));
387+
memset(class_type->iterator_funcs_ptr, 0, sizeof(zend_class_iterator_funcs));
388+
}
389+
if (class_type->type == ZEND_INTERNAL_CLASS) {
390+
class_type->iterator_funcs_ptr->zf_rewind = zend_hash_str_find_ptr(&class_type->function_table, "rewind", sizeof("rewind") - 1);
391+
class_type->iterator_funcs_ptr->zf_valid = zend_hash_str_find_ptr(&class_type->function_table, "valid", sizeof("valid") - 1);
392+
class_type->iterator_funcs_ptr->zf_key = zend_hash_str_find_ptr(&class_type->function_table, "key", sizeof("key") - 1);
393+
class_type->iterator_funcs_ptr->zf_current = zend_hash_str_find_ptr(&class_type->function_table, "current", sizeof("current") - 1);
394+
class_type->iterator_funcs_ptr->zf_next = zend_hash_str_find_ptr(&class_type->function_table, "next", sizeof("next") - 1);
456395
}
457-
iterator_funcs_ptr->zf_rewind = zend_hash_str_find_ptr(&class_type->function_table, "rewind", sizeof("rewind") - 1);
458-
iterator_funcs_ptr->zf_valid = zend_hash_str_find_ptr(&class_type->function_table, "valid", sizeof("valid") - 1);
459-
iterator_funcs_ptr->zf_key = zend_hash_str_find_ptr(&class_type->function_table, "key", sizeof("key") - 1);
460-
iterator_funcs_ptr->zf_current = zend_hash_str_find_ptr(&class_type->function_table, "current", sizeof("current") - 1);
461-
iterator_funcs_ptr->zf_next = zend_hash_str_find_ptr(&class_type->function_table, "next", sizeof("next") - 1);
462396
return SUCCESS;
463397
}
464398
/* }}} */

Zend/zend_opcode.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -347,8 +347,8 @@ ZEND_API void destroy_zend_class(zval *zv)
347347
} ZEND_HASH_FOREACH_END();
348348
zend_hash_destroy(&ce->constants_table);
349349
}
350-
if (ZEND_MAP_PTR(ce->iterator_funcs_ptr)) {
351-
free(ZEND_MAP_PTR(ce->iterator_funcs_ptr));
350+
if (ce->iterator_funcs_ptr) {
351+
free(ce->iterator_funcs_ptr);
352352
}
353353
if (ce->num_interfaces > 0) {
354354
free(ce->interfaces);

ext/opcache/zend_accelerator_util_funcs.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -373,11 +373,6 @@ static void zend_class_copy_ctor(zend_class_entry **pce)
373373
ce->trait_precedences = trait_precedences;
374374
}
375375
}
376-
377-
if (ZEND_MAP_PTR(ce->iterator_funcs_ptr)) {
378-
ZEND_MAP_PTR_INIT(ce->iterator_funcs_ptr, ARENA_REALLOC(ZEND_MAP_PTR(ce->iterator_funcs_ptr)));
379-
ZEND_MAP_PTR_SET(ce->iterator_funcs_ptr, ARENA_REALLOC(ZEND_MAP_PTR_GET(ce->iterator_funcs_ptr)));
380-
}
381376
}
382377

383378
static void zend_accel_function_hash_copy(HashTable *target, HashTable *source)

ext/opcache/zend_file_cache.c

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -757,14 +757,17 @@ static void zend_file_cache_serialize_class(zval *zv,
757757
SERIALIZE_PTR(ce->__callstatic);
758758
SERIALIZE_PTR(ce->__debugInfo);
759759

760-
ZEND_MAP_PTR_INIT(ce->static_members_table, &ce->default_static_members_table);
761-
if (ZEND_MAP_PTR(ce->iterator_funcs_ptr)) {
762-
if (ce->ce_flags & ZEND_ACC_IMMUTABLE) {
763-
ZEND_MAP_PTR_INIT(ce->iterator_funcs_ptr, (void*)(uintptr_t)1);
764-
} else {
765-
SERIALIZE_PTR(ZEND_MAP_PTR(ce->iterator_funcs_ptr));
766-
}
760+
if (ce->iterator_funcs_ptr) {
761+
SERIALIZE_PTR(ce->iterator_funcs_ptr->zf_new_iterator);
762+
SERIALIZE_PTR(ce->iterator_funcs_ptr->zf_rewind);
763+
SERIALIZE_PTR(ce->iterator_funcs_ptr->zf_valid);
764+
SERIALIZE_PTR(ce->iterator_funcs_ptr->zf_key);
765+
SERIALIZE_PTR(ce->iterator_funcs_ptr->zf_current);
766+
SERIALIZE_PTR(ce->iterator_funcs_ptr->zf_next);
767+
SERIALIZE_PTR(ce->iterator_funcs_ptr);
767768
}
769+
770+
ZEND_MAP_PTR_INIT(ce->static_members_table, &ce->default_static_members_table);
768771
}
769772

770773
static void zend_file_cache_serialize(zend_persistent_script *script,
@@ -1413,18 +1416,20 @@ static void zend_file_cache_unserialize_class(zval *zv,
14131416
ce->unserialize = zend_class_unserialize_deny;
14141417
}
14151418

1416-
if (ce->ce_flags & ZEND_ACC_IMMUTABLE) {
1417-
if (ce->default_static_members_table) {
1418-
ZEND_MAP_PTR_NEW(ce->static_members_table);
1419-
} else {
1420-
ZEND_MAP_PTR_INIT(ce->static_members_table, &ce->default_static_members_table);
1421-
}
1422-
if (ZEND_MAP_PTR(ce->iterator_funcs_ptr)) {
1423-
ZEND_MAP_PTR_NEW(ce->iterator_funcs_ptr);
1424-
}
1419+
if (ce->iterator_funcs_ptr) {
1420+
UNSERIALIZE_PTR(ce->iterator_funcs_ptr);
1421+
UNSERIALIZE_PTR(ce->iterator_funcs_ptr->zf_new_iterator);
1422+
UNSERIALIZE_PTR(ce->iterator_funcs_ptr->zf_rewind);
1423+
UNSERIALIZE_PTR(ce->iterator_funcs_ptr->zf_valid);
1424+
UNSERIALIZE_PTR(ce->iterator_funcs_ptr->zf_key);
1425+
UNSERIALIZE_PTR(ce->iterator_funcs_ptr->zf_current);
1426+
UNSERIALIZE_PTR(ce->iterator_funcs_ptr->zf_next);
1427+
}
1428+
1429+
if (ce->ce_flags & ZEND_ACC_IMMUTABLE && ce->default_static_members_table) {
1430+
ZEND_MAP_PTR_NEW(ce->static_members_table);
14251431
} else {
14261432
ZEND_MAP_PTR_INIT(ce->static_members_table, &ce->default_static_members_table);
1427-
UNSERIALIZE_PTR(ZEND_MAP_PTR(ce->iterator_funcs_ptr));
14281433
}
14291434
}
14301435

ext/opcache/zend_persist.c

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "zend_vm.h"
2828
#include "zend_constants.h"
2929
#include "zend_operators.h"
30+
#include "zend_interfaces.h"
3031

3132
#ifdef HAVE_OPCACHE_FILE_CACHE
3233
#define zend_set_str_gc_flags(str) do { \
@@ -905,14 +906,8 @@ static void zend_persist_class_entry(zval *zv)
905906
}
906907
}
907908

908-
if (ZEND_MAP_PTR(ce->iterator_funcs_ptr)) {
909-
if (ce->ce_flags & ZEND_ACC_IMMUTABLE) {
910-
ZEND_MAP_PTR_NEW(ce->iterator_funcs_ptr);
911-
} else {
912-
ZEND_MAP_PTR_INIT(ce->iterator_funcs_ptr, ZCG(arena_mem));
913-
ZCG(arena_mem) = (void*)(((char*)ZCG(arena_mem)) + ZEND_ALIGNED_SIZE(sizeof(void*)));
914-
ZEND_MAP_PTR_SET(ce->iterator_funcs_ptr, zend_shared_memdup_arena(ZEND_MAP_PTR_GET(ce->iterator_funcs_ptr), sizeof(zend_class_iterator_funcs)));
915-
}
909+
if (ce->iterator_funcs_ptr) {
910+
ce->iterator_funcs_ptr = zend_shared_memdup(ce->iterator_funcs_ptr, sizeof(zend_class_iterator_funcs));
916911
}
917912
}
918913
}
@@ -968,6 +963,20 @@ static int zend_update_parent_ce(zval *zv)
968963
}
969964
}
970965
}
966+
967+
if (ce->iterator_funcs_ptr) {
968+
memset(ce->iterator_funcs_ptr, 0, sizeof(zend_class_iterator_funcs));
969+
if (instanceof_function_ex(ce, zend_ce_aggregate, 1)) {
970+
ce->iterator_funcs_ptr->zf_new_iterator = zend_hash_str_find_ptr(&ce->function_table, "getiterator", sizeof("getiterator") - 1);
971+
}
972+
if (instanceof_function_ex(ce, zend_ce_iterator, 1)) {
973+
ce->iterator_funcs_ptr->zf_rewind = zend_hash_str_find_ptr(&ce->function_table, "rewind", sizeof("rewind") - 1);
974+
ce->iterator_funcs_ptr->zf_valid = zend_hash_str_find_ptr(&ce->function_table, "valid", sizeof("valid") - 1);
975+
ce->iterator_funcs_ptr->zf_key = zend_hash_str_find_ptr(&ce->function_table, "key", sizeof("key") - 1);
976+
ce->iterator_funcs_ptr->zf_current = zend_hash_str_find_ptr(&ce->function_table, "current", sizeof("current") - 1);
977+
ce->iterator_funcs_ptr->zf_next = zend_hash_str_find_ptr(&ce->function_table, "next", sizeof("next") - 1);
978+
}
979+
}
971980
}
972981

973982
/* update methods */

0 commit comments

Comments
 (0)