@@ -3587,7 +3587,7 @@ static zend_always_inline void i_zval_ptr_dtor_noref(zval *zval_ptr) {
3587
3587
}
3588
3588
}
3589
3589
3590
- ZEND_API zval * zend_assign_to_typed_ref (zval * variable_ptr , zval * orig_value , zend_uchar value_type , bool strict )
3590
+ ZEND_API zval * zend_assign_to_typed_ref_ex (zval * variable_ptr , zval * orig_value , zend_uchar value_type , bool strict , zend_refcounted * * garbage_ptr )
3591
3591
{
3592
3592
bool ret ;
3593
3593
zval value ;
@@ -3602,7 +3602,9 @@ ZEND_API zval* zend_assign_to_typed_ref(zval *variable_ptr, zval *orig_value, ze
3602
3602
ret = zend_verify_ref_assignable_zval (Z_REF_P (variable_ptr ), & value , strict );
3603
3603
variable_ptr = Z_REFVAL_P (variable_ptr );
3604
3604
if (EXPECTED (ret )) {
3605
- i_zval_ptr_dtor_noref (variable_ptr );
3605
+ if (Z_REFCOUNTED_P (variable_ptr )) {
3606
+ * garbage_ptr = Z_COUNTED_P (variable_ptr );
3607
+ }
3606
3608
ZVAL_COPY_VALUE (variable_ptr , & value );
3607
3609
} else {
3608
3610
zval_ptr_dtor_nogc (& value );
@@ -3620,6 +3622,20 @@ ZEND_API zval* zend_assign_to_typed_ref(zval *variable_ptr, zval *orig_value, ze
3620
3622
return variable_ptr ;
3621
3623
}
3622
3624
3625
+ ZEND_API zval * zend_assign_to_typed_ref (zval * variable_ptr , zval * orig_value , zend_uchar value_type , bool strict )
3626
+ {
3627
+ zend_refcounted * garbage = NULL ;
3628
+ zval * result = zend_assign_to_typed_ref_ex (variable_ptr , orig_value , value_type , strict , & garbage );
3629
+ if (garbage ) {
3630
+ if (GC_DELREF (garbage ) == 0 ) {
3631
+ rc_dtor_func (garbage );
3632
+ } else {
3633
+ gc_check_possible_root_no_ref (garbage );
3634
+ }
3635
+ }
3636
+ return result ;
3637
+ }
3638
+
3623
3639
ZEND_API bool ZEND_FASTCALL zend_verify_prop_assignable_by_ref_ex (const zend_property_info * prop_info , zval * orig_val , bool strict , zend_verify_prop_assignable_by_ref_context context ) {
3624
3640
zval * val = orig_val ;
3625
3641
if (Z_ISREF_P (val ) && ZEND_REF_HAS_TYPE_SOURCES (Z_REF_P (val ))) {
0 commit comments