diff options
-rw-r--r-- | Zend/zend_hash.c | 7 | ||||
-rw-r--r-- | Zend/zend_hash.h | 2 | ||||
-rw-r--r-- | Zend/zend_operators.c | 2 |
3 files changed, 6 insertions, 5 deletions
diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c index 710d2418dd..6372aadb13 100644 --- a/Zend/zend_hash.c +++ b/Zend/zend_hash.c @@ -829,20 +829,21 @@ ZEND_API void zend_hash_copy(HashTable *target, HashTable *source, void (*pCopyC } -ZEND_API void zend_hash_merge(HashTable *target, HashTable *source, void (*pCopyConstructor) (void *pData), void *tmp, uint size) +ZEND_API void zend_hash_merge(HashTable *target, HashTable *source, void (*pCopyConstructor) (void *pData), void *tmp, uint size, int overwrite) { Bucket *p; void *t; + int mode = (overwrite?HASH_UPDATE:HASH_ADD); p = source->pListHead; while (p) { memcpy(tmp, p->pData, size); if (p->nKeyLength>0) { - if (zend_hash_add(target, p->arKey, p->nKeyLength, tmp, size, &t)==SUCCESS && pCopyConstructor) { + if (zend_hash_add_or_update(target, p->arKey, p->nKeyLength, tmp, size, &t, mode)==SUCCESS && pCopyConstructor) { pCopyConstructor(t); } } else { - if (!zend_hash_index_exists(target, p->h) && zend_hash_index_update(target, p->h, tmp, size, &t)==SUCCESS && pCopyConstructor) { + if ((mode==HASH_UPDATE || !zend_hash_index_exists(target, p->h)) && zend_hash_index_update(target, p->h, tmp, size, &t)==SUCCESS && pCopyConstructor) { pCopyConstructor(t); } } diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h index 2699b53978..0eb8436702 100644 --- a/Zend/zend_hash.h +++ b/Zend/zend_hash.h @@ -135,7 +135,7 @@ ZEND_API void zend_hash_internal_pointer_end(HashTable *ht); /* Copying, merging and sorting */ ZEND_API void zend_hash_copy(HashTable *target, HashTable *source, void (*pCopyConstructor) (void *pData), void *tmp, uint size); -ZEND_API void zend_hash_merge(HashTable *target, HashTable *source, void (*pCopyConstructor) (void *pData), void *tmp, uint size); +ZEND_API void zend_hash_merge(HashTable *target, HashTable *source, void (*pCopyConstructor) (void *pData), void *tmp, uint size, int overwrite); ZEND_API int zend_hash_sort(HashTable *ht, int (*compar) (const void *, const void *), int renumber); ZEND_API int zend_hash_minmax(HashTable *ht, int (*compar) (const void *, const void *), int flag, void **pData); diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index 162a634162..8b83162d4d 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -431,7 +431,7 @@ ZEND_API int add_function(zval *result, zval *op1, zval *op2) if (op1->type == IS_ARRAY && op2->type == IS_ARRAY) { zval tmp; - zend_hash_merge(op1->value.ht,op2->value.ht,(void (*)(void *pData)) zval_copy_ctor, (void *) &tmp, sizeof(zval)); + zend_hash_merge(op1->value.ht,op2->value.ht,(void (*)(void *pData)) zval_copy_ctor, (void *) &tmp, sizeof(zval), 0); *result = *op1; zval_dtor(op2); return SUCCESS; |