diff options
author | Andi Gutmans <andi@php.net> | 2001-08-13 15:23:37 +0000 |
---|---|---|
committer | Andi Gutmans <andi@php.net> | 2001-08-13 15:23:37 +0000 |
commit | b6eb324cd292fef1a250d2ee1cbd4c6f872d16e2 (patch) | |
tree | f0f87b81e41c0623334cdcc05198982576fa348b | |
parent | d4a6487e8c3f112b1b7c1fb7ea556a6b560bac39 (diff) | |
download | php-git-b6eb324cd292fef1a250d2ee1cbd4c6f872d16e2.tar.gz |
- Merge from Engine 1
-rw-r--r-- | Zend/zend_execute.c | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index ba96d242be..7f9dd2e32f 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -308,11 +308,30 @@ static inline void zend_assign_to_variable(znode *result, znode *op1, znode *op2 if (!variable_ptr_ptr) { switch (Ts[op1->u.var].EA.type) { case IS_OVERLOADED_OBJECT: - set_overloaded_property(&Ts[op1->u.var], value TSRMLS_CC); - if (type == IS_TMP_VAR) { - zval_dtor(value); + { + int return_value_used; + + return_value_used = result && !(result->u.EA.type & EXT_TYPE_UNUSED); + + if (return_value_used) { + if (type == IS_TMP_VAR) { + MAKE_STD_ZVAL(*Ts[result->u.var].var.ptr_ptr); + **Ts[result->u.var].var.ptr_ptr = *value; + INIT_PZVAL(*Ts[result->u.var].var.ptr_ptr); + } else { + Ts[result->u.var].var.ptr_ptr = &value; + PZVAL_LOCK(*Ts[result->u.var].var.ptr_ptr); + } + AI_USE_PTR(Ts[result->u.var].var); + } + + set_overloaded_property(&Ts[op1->u.var], value TSRMLS_CC); + + if (!return_value_used && type == IS_TMP_VAR) { + zval_dtor(value); + } + break; } - break; case IS_STRING_OFFSET: { temp_variable *T = &Ts[op1->u.var]; |