Fix uses of zval_add_ref and add comment on usage

zval_add_ref should be used as a copy ctor, after the value was
already copied.

In particular when used with hash insertions, it should be applied
to the return value of the insert function.
This commit is contained in:
Nikita Popov 2015-01-05 17:02:11 +01:00
parent 411980a8bc
commit 1266515e19
6 changed files with 45 additions and 46 deletions

View file

@ -201,13 +201,15 @@ ZEND_API void _zval_internal_dtor_for_ptr(zval *zvalue ZEND_FILE_LINE_DC)
}
}
/* This function should only be used as a copy constructor, i.e. it
* should only be called AFTER a zval has been copied to another
* location using ZVAL_COPY_VALUE. Do not call it before copying,
* otherwise a reference may be leaked. */
ZEND_API void zval_add_ref(zval *p)
{
if (Z_REFCOUNTED_P(p)) {
if (Z_ISREF_P(p) && Z_REFCOUNT_P(p) == 1) {
zend_reference *ref = Z_REF_P(p);
ZVAL_COPY(p, Z_REFVAL_P(p));
efree_size(ref, sizeof(zend_reference));
} else {
Z_ADDREF_P(p);
}