summaryrefslogtreecommitdiff
path: root/Zend/zend_objects.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2015-05-19 13:23:13 +0300
committerDmitry Stogov <dmitry@zend.com>2015-05-19 13:23:13 +0300
commiteebab8282b38ca6ff77d3b878aba8fbb9fc89f66 (patch)
tree629b0ea13cf346eae0c1af70757e7fd530602f63 /Zend/zend_objects.c
parent6c8d49b6b0face2a5453f168da385b0964c3194f (diff)
downloadphp-git-eebab8282b38ca6ff77d3b878aba8fbb9fc89f66.tar.gz
Improved hash table copying
Diffstat (limited to 'Zend/zend_objects.c')
-rw-r--r--Zend/zend_objects.c10
1 files changed, 7 insertions, 3 deletions
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);
}