summaryrefslogtreecommitdiff
path: root/Zend/zend_execute.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2015-04-03 01:32:20 +0300
committerDmitry Stogov <dmitry@zend.com>2015-04-03 01:32:20 +0300
commitadcf0c6052761350695da211b337edff12c6e63c (patch)
treeadfa8f0c41009c5d04a6b612f289e3ec4e7a1d4d /Zend/zend_execute.c
parentf26592846f8190fdab6cb148e484a4aeb032c096 (diff)
downloadphp-git-adcf0c6052761350695da211b337edff12c6e63c.tar.gz
Improved reference counting
Diffstat (limited to 'Zend/zend_execute.c')
-rw-r--r--Zend/zend_execute.c21
1 files changed, 11 insertions, 10 deletions
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);