summaryrefslogtreecommitdiff
path: root/ext/standard/array.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2016-06-09 15:09:09 +0300
committerDmitry Stogov <dmitry@zend.com>2016-06-09 15:09:09 +0300
commitdf7dccea83c7438e0a08c40df774b9b1cdc89efd (patch)
tree9cbdec4154bde95c43bcd775ce99ce0344e357c5 /ext/standard/array.c
parente7e79aa409d2b92bf2bcbe0fcdcaf1a9820903f2 (diff)
parentbfcf32237e32b46cba7ce2f9bcd36482978f8dd8 (diff)
downloadphp-git-df7dccea83c7438e0a08c40df774b9b1cdc89efd.tar.gz
Merge branch 'PHP-7.0'
* PHP-7.0: Fixed bug #72369 (array_merge() produces references in PHP7)
Diffstat (limited to 'ext/standard/array.c')
-rw-r--r--ext/standard/array.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/ext/standard/array.c b/ext/standard/array.c
index 7ee505601e..01e87d80e9 100644
--- a/ext/standard/array.c
+++ b/ext/standard/array.c
@@ -3099,15 +3099,20 @@ PHPAPI int php_array_merge(HashTable *dest, HashTable *src) /* {{{ */
zend_string *string_key;
ZEND_HASH_FOREACH_STR_KEY_VAL(src, string_key, src_entry) {
- if (string_key) {
- if (Z_REFCOUNTED_P(src_entry)) {
+ if (Z_REFCOUNTED_P(src_entry)) {
+ if (UNEXPECTED(Z_ISREF_P(src_entry))
+ && UNEXPECTED(Z_REFCOUNT_P(src_entry) == 1)) {
+ ZVAL_UNREF(src_entry);
+ if (Z_REFCOUNTED_P(src_entry)) {
+ Z_ADDREF_P(src_entry);
+ }
+ } else {
Z_ADDREF_P(src_entry);
}
+ }
+ if (string_key) {
zend_hash_update(dest, string_key, src_entry);
} else {
- if (Z_REFCOUNTED_P(src_entry)) {
- Z_ADDREF_P(src_entry);
- }
zend_hash_next_index_insert_new(dest, src_entry);
}
} ZEND_HASH_FOREACH_END();