diff options
author | Dmitry Stogov <dmitry@zend.com> | 2014-06-05 16:04:11 +0400 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2014-06-05 16:04:11 +0400 |
commit | c1965f58d4dd3970912dcd6a63ccd5860bae1a97 (patch) | |
tree | 15b4a94e8e8405f791438c468ad4eb03f60c4079 /Zend/zend_hash.c | |
parent | 3d87391cc06fe87344536e88ac74ded22b0195cf (diff) | |
download | php-git-c1965f58d4dd3970912dcd6a63ccd5860bae1a97.tar.gz |
Use reference counting instead of zval duplication
Diffstat (limited to 'Zend/zend_hash.c')
-rw-r--r-- | Zend/zend_hash.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c index 08b4cb5e4e..e7aa255d78 100644 --- a/Zend/zend_hash.c +++ b/Zend/zend_hash.c @@ -1207,7 +1207,7 @@ ZEND_API void zend_array_dup(HashTable *target, HashTable *source) q->key = NULL; if (Z_OPT_REFCOUNTED_P(data)) { if (Z_ISREF_P(data) && Z_REFCOUNT_P(data) == 1) { - ZVAL_DUP(&q->val, Z_REFVAL_P(data)); + ZVAL_COPY(&q->val, Z_REFVAL_P(data)); } else { ZVAL_COPY(&q->val, data); } @@ -1256,7 +1256,7 @@ ZEND_API void zend_array_dup(HashTable *target, HashTable *source) target->arHash[nIndex] = target_idx; if (Z_OPT_REFCOUNTED_P(data)) { if (Z_ISREF_P(data) && Z_REFCOUNT_P(data) == 1) { - ZVAL_DUP(&q->val, Z_REFVAL_P(data)); + ZVAL_COPY(&q->val, Z_REFVAL_P(data)); } else { ZVAL_COPY(&q->val, data); } @@ -1495,14 +1495,15 @@ ZEND_API int zend_hash_set_pointer(HashTable *ht, const HashPointer *ptr) } else if (ht->nInternalPointer != ptr->pos) { IS_CONSISTENT(ht); if (ht->u.flags & HASH_FLAG_PACKED) { - if (Z_TYPE(ht->arData[ptr->h].val) != IS_UNDEF) { + if (ptr->h < ht->nNumUsed && + Z_TYPE(ht->arData[ptr->h].val) != IS_UNDEF) { ht->nInternalPointer = ptr->h; return 1; } } else { idx = ht->arHash[ptr->h & ht->nTableMask]; while (idx != INVALID_IDX) { - if (idx == ptr->pos) { + if (ht->arData[idx].h == ptr->h && idx == ptr->pos) { ht->nInternalPointer = idx; return 1; } |