Skip to content

Commit 5e77cad

Browse files
committed
Add explicit key field
This will simplify handling two iterators.
1 parent e91bcae commit 5e77cad

File tree

1 file changed

+8
-2
lines changed

1 file changed

+8
-2
lines changed

Zend/zend_property_hooks.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ typedef struct {
2424
zend_object_iterator it;
2525
bool by_ref;
2626
zval properties;
27+
zval current_key;
2728
zval current_data;
2829
} zend_hooked_object_iterator;
2930

@@ -89,6 +90,10 @@ static zend_result zend_hooked_object_it_fetch_current_data(zend_object_iterator
8990
ZVAL_UNDEF(&hooked_iter->current_data);
9091
zend_object *zobj = Z_OBJ_P(&iter->data);
9192
zend_array *properties = Z_ARR(hooked_iter->properties);
93+
94+
zval_ptr_dtor_nogc(&hooked_iter->current_key);
95+
zend_hash_get_current_key_zval(properties, &hooked_iter->current_key);
96+
9297
zval *property = zend_hash_get_current_data(properties);
9398
if (Z_TYPE_P(property) == IS_PTR) {
9499
zend_property_info *prop_info = Z_PTR_P(property);
@@ -117,6 +122,7 @@ static void zend_hooked_object_it_dtor(zend_object_iterator *iter)
117122
zend_hooked_object_iterator *hooked_iter = (zend_hooked_object_iterator*)iter;
118123
zval_ptr_dtor(&iter->data);
119124
zval_ptr_dtor(&hooked_iter->properties);
125+
zval_ptr_dtor_nogc(&hooked_iter->current_key);
120126
zval_ptr_dtor(&hooked_iter->current_data);
121127
}
122128

@@ -136,8 +142,7 @@ static zval *zend_hooked_object_it_get_current_data(zend_object_iterator *iter)
136142
static void zend_hooked_object_it_get_current_key(zend_object_iterator *iter, zval *key)
137143
{
138144
zend_hooked_object_iterator *hooked_iter = (zend_hooked_object_iterator*)iter;
139-
zend_array *properties = Z_ARR(hooked_iter->properties);
140-
zend_hash_get_current_key_zval(properties, key);
145+
ZVAL_COPY(key, &hooked_iter->current_key);
141146
}
142147

143148
static void zend_hooked_object_it_move_forward(zend_object_iterator *iter)
@@ -189,6 +194,7 @@ ZEND_API zend_object_iterator *zend_hooked_object_get_iterator(zend_class_entry
189194
iterator->by_ref = by_ref;
190195
zend_array *properties = zend_hooked_object_build_properties_ex(Z_OBJ_P(object), true);
191196
ZVAL_ARR(&iterator->properties, properties);
197+
ZVAL_UNDEF(&iterator->current_key);
192198
ZVAL_UNDEF(&iterator->current_data);
193199

194200
return &iterator->it;

0 commit comments

Comments
 (0)