summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2014-03-05 00:28:01 +0400
committerDmitry Stogov <dmitry@zend.com>2014-03-05 00:28:01 +0400
commitdb7b5325f08f706b311d69cb204f4ea8b6bd0356 (patch)
tree1c58a8d6e159b2a075638631692474e3be662f3a
parent6b8c46dc764c6b9baa3b56914839c1a385773938 (diff)
downloadphp-git-db7b5325f08f706b311d69cb204f4ea8b6bd0356.tar.gz
Fixed IS_REFERENCE separation
-rw-r--r--Zend/zend.h5
-rw-r--r--Zend/zend_object_handlers.c5
2 files changed, 7 insertions, 3 deletions
diff --git a/Zend/zend.h b/Zend/zend.h
index 27caadc51c..09db94d836 100644
--- a/Zend/zend.h
+++ b/Zend/zend.h
@@ -696,7 +696,10 @@ END_EXTERN_C()
zval *_zv = (zv); \
if (Z_REFCOUNTED_P(_zv)) { \
if (Z_REFCOUNT_P(_zv) > 1) { \
- if (Z_TYPE_P(_zv) == IS_OBJECT || \
+ if (Z_ISREF_P(_zv)) { \
+ Z_DELREF_P(_zv); \
+ ZVAL_DUP(_zv, Z_REFVAL_P(_zv)); \
+ } else if (Z_TYPE_P(_zv) == IS_OBJECT ||\
Z_TYPE_P(_zv) == IS_RESOURCE) { \
Z_ADDREF_P(_zv); \
} else { \
diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c
index de5da28e6a..2205ab2f1e 100644
--- a/Zend/zend_object_handlers.c
+++ b/Zend/zend_object_handlers.c
@@ -638,9 +638,10 @@ found:
} else if (EXPECTED(property_info != NULL)) {
/* if we assign referenced variable, we should separate it */
if (IS_REFCOUNTED(Z_TYPE_P(value))) {
- Z_ADDREF_P(value);
if (Z_ISREF_P(value)) {
- SEPARATE_ZVAL(value);
+ ZVAL_DUP(value, Z_REFVAL_P(value));
+ } else {
+ Z_ADDREF_P(value);
}
}
if (EXPECTED((property_info->flags & ZEND_ACC_STATIC) == 0) &&