]> granicus.if.org Git - php/commitdiff
Make hash_copy call copy constructor on a real copy, not on a temp
authorStanislav Malyshev <stas@php.net>
Thu, 28 Sep 2000 15:17:50 +0000 (15:17 +0000)
committerStanislav Malyshev <stas@php.net>
Thu, 28 Sep 2000 15:17:50 +0000 (15:17 +0000)
Zend/zend_hash.c

index 88dd1cc0f00aff49642cbadf033783d79585b516..280fc0b6796b42364454b3979b1f4ddb8a51fe20 100644 (file)
@@ -750,21 +750,21 @@ ZEND_API void zend_hash_apply_with_arguments(HashTable *ht, int (*destruct)(void
 ZEND_API void zend_hash_copy(HashTable *target, HashTable *source, copy_ctor_func_t pCopyConstructor, void *tmp, uint size)
 {
        Bucket *p;
+       void *new_entry;
 
        IS_CONSISTENT(source);
        IS_CONSISTENT(target);
 
        p = source->pListHead;
        while (p) {
-               memcpy(tmp, p->pData, size);
-               if (pCopyConstructor) {
-                       pCopyConstructor(tmp);
-               }
                if (p->nKeyLength) {
-                       zend_hash_update(target, p->arKey, p->nKeyLength, tmp, size, NULL);
+                       zend_hash_update(target, p->arKey, p->nKeyLength, p->pData, size, &new_entry);
                } else {
-                       zend_hash_index_update(target, p->h, tmp, size, NULL);
+                       zend_hash_index_update(target, p->h, p->pData, size, &new_entry);
                }
+        if (pCopyConstructor) {
+            pCopyConstructor(new_entry);
+        }
                p = p->pListNext;
        }
        target->pInternalPointer = target->pListHead;