From adcf0c6052761350695da211b337edff12c6e63c Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 3 Apr 2015 01:32:20 +0300 Subject: Improved reference counting --- Zend/zend_execute.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) (limited to 'Zend/zend_execute.c') diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 424f4888e9..063f9ed427 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -971,7 +971,7 @@ static inline int zend_verify_missing_return_type(zend_function *zf) static zend_always_inline void zend_assign_to_object(zval *retval, zval *object, uint32_t object_op_type, zval *property_name, uint32_t property_op_type, int value_type, znode_op value_op, const zend_execute_data *execute_data, void **cache_slot) { zend_free_op free_value; - zval *value = get_zval_ptr_deref(value_type, value_op, execute_data, &free_value, BP_VAR_R); + zval *value = get_zval_ptr(value_type, value_op, execute_data, &free_value, BP_VAR_R); zval tmp; if (object_op_type != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { @@ -1033,9 +1033,6 @@ fast_assign: if (retval && !EG(exception)) { ZVAL_COPY(retval, value); } - if (value_type == IS_VAR) { - FREE_OP(free_value); - } return; } } else { @@ -1057,9 +1054,11 @@ fast_assign: zval_copy_ctor_func(&tmp); value = &tmp; } - } else if (value_type != IS_TMP_VAR && - Z_REFCOUNTED_P(value)) { - Z_ADDREF_P(value); + } else if (value_type != IS_TMP_VAR) { + ZVAL_DEREF(value); + if (Z_REFCOUNTED_P(value)) { + Z_ADDREF_P(value); + } } zend_hash_add_new(zobj->properties, Z_STR_P(property_name), value); if (retval && !EG(exception)) { @@ -1089,9 +1088,11 @@ fast_assign: zval_copy_ctor_func(&tmp); value = &tmp; } - } else if (value_type != IS_TMP_VAR && - Z_REFCOUNTED_P(value)) { - Z_ADDREF_P(value); + } else if (value_type != IS_TMP_VAR) { + ZVAL_DEREF(value); + if (Z_REFCOUNTED_P(value)) { + Z_ADDREF_P(value); + } } Z_OBJ_HT_P(object)->write_property(object, property_name, value, cache_slot); -- cgit v1.2.1