From: Dmitry Stogov Date: Tue, 19 May 2015 10:23:13 +0000 (+0300) Subject: Improved hash table copying X-Git-Tag: PRE_PHP7_NSAPI_REMOVAL~42^2~39 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=eebab8282b38ca6ff77d3b878aba8fbb9fc89f66;p=php Improved hash table copying --- diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c index 2826c322a9..9007661f03 100644 --- a/Zend/zend_objects.c +++ b/Zend/zend_objects.c @@ -164,7 +164,8 @@ ZEND_API void zend_objects_clone_members(zend_object *new_object, zend_object *o dst++; } while (src != end); } - if (old_object->properties) { + if (old_object->properties && + EXPECTED(zend_hash_num_elements(old_object->properties))) { zval *prop, new_prop; zend_ulong num_key; zend_string *key; @@ -172,6 +173,9 @@ ZEND_API void zend_objects_clone_members(zend_object *new_object, zend_object *o if (!new_object->properties) { ALLOC_HASHTABLE(new_object->properties); zend_hash_init(new_object->properties, zend_hash_num_elements(old_object->properties), NULL, ZVAL_PTR_DTOR, 0); + zend_hash_real_init(new_object->properties, 0); + } else { + zend_hash_extend(new_object->properties, new_object->properties->nNumUsed + zend_hash_num_elements(old_object->properties), 0); } 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 ZVAL_COPY_VALUE(&new_prop, prop); zval_add_ref(&new_prop); } - if (key) { - zend_hash_add_new(new_object->properties, key, &new_prop); + if (EXPECTED(key)) { + _zend_hash_append(new_object->properties, key, &new_prop); } else { zend_hash_index_add_new(new_object->properties, num_key, &new_prop); }