From a4280c340bf7c127f97fd0d14ec107d60d6f1c9c Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 21 Mar 2014 21:34:15 +0400 Subject: [PATCH] Fixed reference counting --- Zend/zend_variables.c | 32 +++++++++----------------------- 1 file changed, 9 insertions(+), 23 deletions(-) diff --git a/Zend/zend_variables.c b/Zend/zend_variables.c index 995a648ef3..f7375edc5e 100644 --- a/Zend/zend_variables.c +++ b/Zend/zend_variables.c @@ -331,39 +331,25 @@ ZEND_API int zval_copy_static_var(zval *p TSRMLS_DC, int num_args, va_list args, if (is_ref) { ZVAL_NEW_REF(&tmp, &tmp); zend_hash_add(&EG(active_symbol_table)->ht, key->key, &tmp); + Z_ADDREF_P(p); } else { zend_error(E_NOTICE,"Undefined variable: %s", key->key->val); } } else { if (is_ref) { SEPARATE_ZVAL_TO_MAKE_IS_REF(p); -/* - if (!Z_ISREF_P(p)) { - if (Z_REFCOUNTED_P(p) && Z_REFCOUNT_P(p) > 1) { - Z_DELREF_P(p); - ZVAL_NEW_REF(p, p); - zval_copy_ctor(Z_REFVAL_P(p)); - Z_SET_REFCOUNT_P(Z_REFVAL_P(p), 1); - } else { - ZVAL_NEW_REF(p, p); - } - } -*/ + Z_ADDREF_P(p); } else if (Z_ISREF_P(p)) { - ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(p)); - if (Z_REFCOUNTED(tmp) && Z_REFCOUNT(tmp) > 1) { - zval_copy_ctor(&tmp); - Z_SET_REFCOUNT(tmp, 0); - } + ZVAL_DUP(&tmp, Z_REFVAL_P(p)); p = &tmp; + } else if (Z_REFCOUNTED_P(p)) { + Z_ADDREF_P(p); } } - } - if (zend_hash_add(target, key->key, p)) { - if (Z_REFCOUNTED_P(p)) { - Z_ADDREF_P(p); - } - } + } else if (Z_REFCOUNTED_P(p)) { + Z_ADDREF_P(p); + } + zend_hash_add(target, key->key, p); return ZEND_HASH_APPLY_KEEP; } /* }}} */ -- 2.40.0