@@ -830,6 +830,23 @@ ZEND_COLD zend_never_inline void zend_verify_property_type_error(zend_property_i
830
830
zend_string_release (type_str );
831
831
}
832
832
833
+ ZEND_COLD zend_never_inline void zend_magic_get_property_type_inconsistency_error (zend_property_info * info , zval * property )
834
+ {
835
+ /* we _may_ land here in case reading already errored and runtime cache thus has not been updated (i.e. it contains a valid but unrelated info) */
836
+ if (EG (exception )) {
837
+ return ;
838
+ }
839
+
840
+ zend_string * type_str = zend_type_to_string (info -> type );
841
+ zend_type_error ("Value of type %s returned from %s::__get() must be compatible with unset property %s::$%s of type %s" ,
842
+ zend_zval_type_name (property ),
843
+ ZSTR_VAL (info -> ce -> name ),
844
+ ZSTR_VAL (info -> ce -> name ),
845
+ zend_get_unmangled_property_name (info -> name ),
846
+ ZSTR_VAL (type_str ));
847
+ zend_string_release (type_str );
848
+ }
849
+
833
850
ZEND_COLD void zend_match_unhandled_error (zval * value )
834
851
{
835
852
smart_str msg = {0 };
@@ -3560,7 +3577,7 @@ ZEND_API zval* zend_assign_to_typed_ref(zval *variable_ptr, zval *orig_value, ze
3560
3577
return variable_ptr ;
3561
3578
}
3562
3579
3563
- ZEND_API bool ZEND_FASTCALL zend_verify_prop_assignable_by_ref (zend_property_info * prop_info , zval * orig_val , bool strict ) {
3580
+ ZEND_API bool ZEND_FASTCALL zend_verify_prop_assignable_by_ref_ex (zend_property_info * prop_info , zval * orig_val , bool strict , zend_verify_prop_assignable_by_ref_context context ) {
3564
3581
zval * val = orig_val ;
3565
3582
if (Z_ISREF_P (val ) && ZEND_REF_HAS_TYPE_SOURCES (Z_REF_P (val ))) {
3566
3583
int result ;
@@ -3591,10 +3608,20 @@ ZEND_API bool ZEND_FASTCALL zend_verify_prop_assignable_by_ref(zend_property_inf
3591
3608
}
3592
3609
}
3593
3610
3594
- zend_verify_property_type_error (prop_info , val );
3611
+ if (EXPECTED (context == ZEND_VERIFY_PROP_ASSIGNABLE_BY_REF_CONTEXT_ASSIGNMENT )) {
3612
+ zend_verify_property_type_error (prop_info , val );
3613
+ } else {
3614
+ ZEND_ASSERT (context == ZEND_VERIFY_PROP_ASSIGNABLE_BY_REF_CONTEXT_MAGIC_GET );
3615
+ zend_magic_get_property_type_inconsistency_error (prop_info , val );
3616
+ }
3617
+
3595
3618
return 0 ;
3596
3619
}
3597
3620
3621
+ ZEND_API bool ZEND_FASTCALL zend_verify_prop_assignable_by_ref (zend_property_info * prop_info , zval * orig_val , bool strict ) {
3622
+ return zend_verify_prop_assignable_by_ref_ex (prop_info , orig_val , strict , ZEND_VERIFY_PROP_ASSIGNABLE_BY_REF_CONTEXT_ASSIGNMENT );
3623
+ }
3624
+
3598
3625
ZEND_API void ZEND_FASTCALL zend_ref_add_type_source (zend_property_info_source_list * source_list , zend_property_info * prop )
3599
3626
{
3600
3627
zend_property_info_list * list ;
0 commit comments