Skip to content

Commit eebab82

Browse files
committed
Improved hash table copying
1 parent 6c8d49b commit eebab82

File tree

1 file changed

+7
-3
lines changed

1 file changed

+7
-3
lines changed

Diff for: Zend/zend_objects.c

+7-3
Original file line numberDiff line numberDiff line change
@@ -164,14 +164,18 @@ ZEND_API void zend_objects_clone_members(zend_object *new_object, zend_object *o
164164
dst++;
165165
} while (src != end);
166166
}
167-
if (old_object->properties) {
167+
if (old_object->properties &&
168+
EXPECTED(zend_hash_num_elements(old_object->properties))) {
168169
zval *prop, new_prop;
169170
zend_ulong num_key;
170171
zend_string *key;
171172

172173
if (!new_object->properties) {
173174
ALLOC_HASHTABLE(new_object->properties);
174175
zend_hash_init(new_object->properties, zend_hash_num_elements(old_object->properties), NULL, ZVAL_PTR_DTOR, 0);
176+
zend_hash_real_init(new_object->properties, 0);
177+
} else {
178+
zend_hash_extend(new_object->properties, new_object->properties->nNumUsed + zend_hash_num_elements(old_object->properties), 0);
175179
}
176180

177181
ZEND_HASH_FOREACH_KEY_VAL(old_object->properties, num_key, key, prop) {
@@ -181,8 +185,8 @@ ZEND_API void zend_objects_clone_members(zend_object *new_object, zend_object *o
181185
ZVAL_COPY_VALUE(&new_prop, prop);
182186
zval_add_ref(&new_prop);
183187
}
184-
if (key) {
185-
zend_hash_add_new(new_object->properties, key, &new_prop);
188+
if (EXPECTED(key)) {
189+
_zend_hash_append(new_object->properties, key, &new_prop);
186190
} else {
187191
zend_hash_index_add_new(new_object->properties, num_key, &new_prop);
188192
}

0 commit comments

Comments
 (0)