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 { \
} 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) &&