summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndi Gutmans <andi@php.net>2001-08-13 15:23:37 +0000
committerAndi Gutmans <andi@php.net>2001-08-13 15:23:37 +0000
commitb6eb324cd292fef1a250d2ee1cbd4c6f872d16e2 (patch)
treef0f87b81e41c0623334cdcc05198982576fa348b
parentd4a6487e8c3f112b1b7c1fb7ea556a6b560bac39 (diff)
downloadphp-git-b6eb324cd292fef1a250d2ee1cbd4c6f872d16e2.tar.gz
- Merge from Engine 1
-rw-r--r--Zend/zend_execute.c27
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];