@@ -28,6 +28,7 @@ typedef struct {
28
28
bool declared_props_done ;
29
29
zval declared_props ;
30
30
bool dynamic_props_done ;
31
+ uint32_t dynamic_prop_offset ;
31
32
uint32_t dynamic_prop_it ;
32
33
zval current_key ;
33
34
zval current_data ;
@@ -36,9 +37,19 @@ typedef struct {
36
37
static zend_result zho_it_valid (zend_object_iterator * iter );
37
38
static void zho_it_move_forward (zend_object_iterator * iter );
38
39
39
- static uint32_t zho_num_backed_props ( zend_object * zobj )
40
+ static uint32_t zho_find_dynamic_prop_offset ( zend_array * properties )
40
41
{
41
- return zobj -> ce -> default_properties_count ;
42
+ uint32_t offset = 0 ;
43
+ zval * value ;
44
+
45
+ ZEND_HASH_MAP_FOREACH_VAL (properties , value ) {
46
+ if (Z_TYPE_P (value ) != IS_INDIRECT ) {
47
+ break ;
48
+ }
49
+ offset ++ ;
50
+ } ZEND_HASH_FOREACH_END ();
51
+
52
+ return offset ;
42
53
}
43
54
44
55
static zend_array * zho_build_properties_ex (zend_object * zobj , bool check_access , bool force_ptr , bool include_dynamic_props )
@@ -106,7 +117,10 @@ static zend_array *zho_build_properties_ex(zend_object *zobj, bool check_access,
106
117
if (include_dynamic_props && zobj -> properties ) {
107
118
zend_string * prop_name ;
108
119
zval * prop_value ;
109
- ZEND_HASH_FOREACH_STR_KEY_VAL_FROM (zobj -> properties , prop_name , prop_value , zho_num_backed_props (zobj )) {
120
+ ZEND_HASH_FOREACH_STR_KEY_VAL (zobj -> properties , prop_name , prop_value ) {
121
+ if (Z_TYPE_P (prop_value ) == IS_INDIRECT ) {
122
+ continue ;
123
+ }
110
124
zval * tmp = _zend_hash_append (properties , prop_name , prop_value );
111
125
Z_TRY_ADDREF_P (tmp );
112
126
} ZEND_HASH_FOREACH_END ();
@@ -132,7 +146,8 @@ static void zho_dynamic_it_init(zend_hooked_object_iterator *hooked_iter)
132
146
zend_object * zobj = Z_OBJ_P (& hooked_iter -> it .data );
133
147
zend_array * properties = zobj -> handlers -> get_properties (zobj );
134
148
hooked_iter -> dynamic_props_done = false;
135
- hooked_iter -> dynamic_prop_it = zend_hash_iterator_add (properties , zho_num_backed_props (zobj ));
149
+ hooked_iter -> dynamic_prop_offset = zho_find_dynamic_prop_offset (properties );
150
+ hooked_iter -> dynamic_prop_it = zend_hash_iterator_add (properties , hooked_iter -> dynamic_prop_offset );
136
151
}
137
152
138
153
static void zho_it_get_current_key (zend_object_iterator * iter , zval * key );
@@ -324,7 +339,7 @@ static void zho_it_rewind(zend_object_iterator *iter)
324
339
zend_hash_internal_pointer_reset (properties );
325
340
hooked_iter -> declared_props_done = !zend_hash_num_elements (properties );
326
341
hooked_iter -> dynamic_props_done = false;
327
- EG (ht_iterators )[hooked_iter -> dynamic_prop_it ].pos = zho_num_backed_props ( Z_OBJ ( iter -> data )) ;
342
+ EG (ht_iterators )[hooked_iter -> dynamic_prop_it ].pos = hooked_iter -> dynamic_prop_offset ;
328
343
}
329
344
330
345
static HashTable * zho_it_get_gc (zend_object_iterator * iter , zval * * table , int * n )
0 commit comments