static inline void zend_assign_to_variable_reference(zval *variable_ptr, zval *value_ptr)
{
zend_reference *ref;
- zval garbage;
if (EXPECTED(!Z_ISREF_P(value_ptr))) {
ZVAL_NEW_REF(value_ptr, value_ptr);
ref = Z_REF_P(value_ptr);
GC_REFCOUNT(ref)++;
- ZVAL_COPY_VALUE(&garbage, variable_ptr);
+ if (Z_REFCOUNTED_P(variable_ptr)) {
+ zend_refcounted *garbage = Z_COUNTED_P(variable_ptr);
+
+ if (--GC_REFCOUNT(garbage) == 0) {
+ ZVAL_REF(variable_ptr, ref);
+ zval_dtor_func_for_ptr(garbage);
+ return;
+ } else {
+ GC_ZVAL_CHECK_POSSIBLE_ROOT(variable_ptr);
+ }
+ }
ZVAL_REF(variable_ptr, ref);
- zval_ptr_dtor(&garbage);
}
/* this should modify object only if it's empty */