diff options
Diffstat (limited to 'Zend/zend_execute.h')
-rw-r--r-- | Zend/zend_execute.h | 49 |
1 files changed, 25 insertions, 24 deletions
diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 1d4853d5ee..8ad16de2d8 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -72,36 +72,37 @@ ZEND_API int zend_verify_arg_error(int error_type, const zend_function *zf, zend static zend_always_inline void i_zval_ptr_dtor(zval *zval_ptr ZEND_FILE_LINE_DC TSRMLS_DC) { - if (!Z_DELREF_P(zval_ptr)) { - ZEND_ASSERT(zval_ptr != &EG(uninitialized_zval)); - GC_REMOVE_ZVAL_FROM_BUFFER(zval_ptr); - zval_dtor(zval_ptr); - efree_rel(zval_ptr); - } else { - if (Z_REFCOUNT_P(zval_ptr) == 1 && Z_TYPE_P(zval_ptr) == IS_REFERENCE) { - /* convert reference to regular value */ - zend_reference *ref = Z_REF_P(zval_ptr); - *zval_ptr = ref->val; - efree_rel(ref); + if (IS_REFCOUNTED(Z_TYPE_P(zval_ptr))) { + if (!Z_DELREF_P(zval_ptr)) { + ZEND_ASSERT(zval_ptr != &EG(uninitialized_zval)); + GC_REMOVE_ZVAL_FROM_BUFFER(zval_ptr); + zval_dtor(zval_ptr); + } else { + if (Z_REFCOUNT_P(zval_ptr) == 1 && Z_TYPE_P(zval_ptr) == IS_REFERENCE) { + /* convert reference to regular value */ + zend_reference *ref = Z_REF_P(zval_ptr); + ZVAL_COPY_VALUE(zval_ptr, &ref->val); + efree_rel(ref); + } + GC_ZVAL_CHECK_POSSIBLE_ROOT(zval_ptr); } - - GC_ZVAL_CHECK_POSSIBLE_ROOT(zval_ptr); } } static zend_always_inline void i_zval_ptr_dtor_nogc(zval *zval_ptr ZEND_FILE_LINE_DC TSRMLS_DC) { - if (!Z_DELREF_P(zval_ptr)) { - ZEND_ASSERT(zval_ptr != &EG(uninitialized_zval)); - GC_REMOVE_ZVAL_FROM_BUFFER(zval_ptr); - zval_dtor(zval_ptr); - efree_rel(zval_ptr); - } else { - if (Z_REFCOUNT_P(zval_ptr) == 1 && Z_TYPE_P(zval_ptr) == IS_REFERENCE) { - /* convert reference to regular value */ - zend_reference *ref = Z_REF_P(zval_ptr); - *zval_ptr = ref->val; - efree_rel(ref); + if (IS_REFCOUNTED(Z_TYPE_P(zval_ptr))) { + if (!Z_DELREF_P(zval_ptr)) { + ZEND_ASSERT(zval_ptr != &EG(uninitialized_zval)); + GC_REMOVE_ZVAL_FROM_BUFFER(zval_ptr); + zval_dtor(zval_ptr); + } else { + if (Z_REFCOUNT_P(zval_ptr) == 1 && Z_TYPE_P(zval_ptr) == IS_REFERENCE) { + /* convert reference to regular value */ + zend_reference *ref = Z_REF_P(zval_ptr); + ZVAL_COPY_VALUE(zval_ptr, &ref->val); + efree_rel(ref); + } } } } |