}
if (!zobj->ce->__set) {
- zval *ref = NULL;
+ zend_reference *ref = NULL;
if (EXPECTED(zobj->properties == NULL)) {
rebuild_object_properties(zobj);
}
} else if (value_type != IS_TMP_VAR) {
if (Z_ISREF_P(value)) {
- if (value_type == IS_CV) {
- ref = value;
+ if (value_type == IS_VAR) {
+ ref = Z_REF_P(value);
}
value = Z_REFVAL_P(value);
if (Z_REFCOUNTED_P(value)) {
ZVAL_COPY(retval, value);
}
if (/*value_type == IS_VAR &&*/ ref) {
- efree_size(ref, sizeof(zend_reference));
+ if (UNEXPECTED(--GC_REFCOUNT(ref) == 0)) {
+ efree_size(ref, sizeof(zend_reference));
+ }
}
return;
}