@@ -2513,7 +2513,7 @@ static void ZEND_FASTCALL zend_jit_assign_to_typed_prop(zval *property_val, zend
2513
2513
value = & EG (uninitialized_zval );
2514
2514
}
2515
2515
2516
- if (UNEXPECTED (info -> flags & ZEND_ACC_READONLY )) {
2516
+ if (UNEXPECTED (( info -> flags & ZEND_ACC_READONLY ) && !( Z_PROP_FLAG_P ( property_val ) & IS_PROP_REINITABLE ) )) {
2517
2517
zend_readonly_property_modification_error (info );
2518
2518
if (result ) {
2519
2519
ZVAL_UNDEF (result );
@@ -2532,6 +2532,8 @@ static void ZEND_FASTCALL zend_jit_assign_to_typed_prop(zval *property_val, zend
2532
2532
return ;
2533
2533
}
2534
2534
2535
+ Z_PROP_FLAG_P (property_val ) &= ~IS_PROP_REINITABLE ;
2536
+
2535
2537
value = zend_assign_to_variable (property_val , & tmp , IS_TMP_VAR , EX_USES_STRICT_TYPES ());
2536
2538
if (result ) {
2537
2539
ZVAL_COPY_DEREF (result , value );
@@ -2570,7 +2572,7 @@ static void ZEND_FASTCALL zend_jit_assign_op_to_typed_prop(zval *zptr, zend_prop
2570
2572
zend_execute_data * execute_data = EG (current_execute_data );
2571
2573
zval z_copy ;
2572
2574
2573
- if (UNEXPECTED (prop_info -> flags & ZEND_ACC_READONLY )) {
2575
+ if (UNEXPECTED (( prop_info -> flags & ZEND_ACC_READONLY ) && !( Z_PROP_FLAG_P ( zptr ) & IS_PROP_REINITABLE ) )) {
2574
2576
zend_readonly_property_modification_error (prop_info );
2575
2577
return ;
2576
2578
}
@@ -2585,6 +2587,7 @@ static void ZEND_FASTCALL zend_jit_assign_op_to_typed_prop(zval *zptr, zend_prop
2585
2587
2586
2588
binary_op (& z_copy , zptr , value );
2587
2589
if (EXPECTED (zend_verify_property_type (prop_info , & z_copy , EX_USES_STRICT_TYPES ()))) {
2590
+ Z_PROP_FLAG_P (zptr ) &= ~IS_PROP_REINITABLE ;
2588
2591
zval_ptr_dtor (zptr );
2589
2592
ZVAL_COPY_VALUE (zptr , & z_copy );
2590
2593
} else {
@@ -2664,7 +2667,7 @@ static void ZEND_FASTCALL zend_jit_inc_typed_prop(zval *var_ptr, zend_property_i
2664
2667
{
2665
2668
ZEND_ASSERT (Z_TYPE_P (var_ptr ) != IS_UNDEF );
2666
2669
2667
- if (UNEXPECTED ((prop_info -> flags & ZEND_ACC_READONLY ))) {
2670
+ if (UNEXPECTED ((prop_info -> flags & ZEND_ACC_READONLY ) && !( Z_PROP_FLAG_P ( var_ptr ) & IS_PROP_REINITABLE ) )) {
2668
2671
zend_readonly_property_modification_error (prop_info );
2669
2672
return ;
2670
2673
}
@@ -2681,11 +2684,14 @@ static void ZEND_FASTCALL zend_jit_inc_typed_prop(zval *var_ptr, zend_property_i
2681
2684
if (!(ZEND_TYPE_FULL_MASK (prop_info -> type ) & MAY_BE_DOUBLE )) {
2682
2685
zend_long val = _zend_jit_throw_inc_prop_error (prop_info );
2683
2686
ZVAL_LONG (var_ptr , val );
2687
+ } else {
2688
+ Z_PROP_FLAG_P (var_ptr ) &= ~IS_PROP_REINITABLE ;
2684
2689
}
2685
2690
} else if (UNEXPECTED (!zend_verify_property_type (prop_info , var_ptr , EX_USES_STRICT_TYPES ()))) {
2686
2691
zval_ptr_dtor (var_ptr );
2687
2692
ZVAL_COPY_VALUE (var_ptr , & tmp );
2688
2693
} else {
2694
+ Z_PROP_FLAG_P (var_ptr ) &= ~IS_PROP_REINITABLE ;
2689
2695
zval_ptr_dtor (& tmp );
2690
2696
}
2691
2697
}
@@ -2694,7 +2700,7 @@ static void ZEND_FASTCALL zend_jit_dec_typed_prop(zval *var_ptr, zend_property_i
2694
2700
{
2695
2701
ZEND_ASSERT (Z_TYPE_P (var_ptr ) != IS_UNDEF );
2696
2702
2697
- if (UNEXPECTED ((prop_info -> flags & ZEND_ACC_READONLY ))) {
2703
+ if (UNEXPECTED ((prop_info -> flags & ZEND_ACC_READONLY ) && !( Z_PROP_FLAG_P ( var_ptr ) & IS_PROP_REINITABLE ) )) {
2698
2704
zend_readonly_property_modification_error (prop_info );
2699
2705
return ;
2700
2706
}
@@ -2711,11 +2717,14 @@ static void ZEND_FASTCALL zend_jit_dec_typed_prop(zval *var_ptr, zend_property_i
2711
2717
if (!(ZEND_TYPE_FULL_MASK (prop_info -> type ) & MAY_BE_DOUBLE )) {
2712
2718
zend_long val = _zend_jit_throw_dec_prop_error (prop_info );
2713
2719
ZVAL_LONG (var_ptr , val );
2720
+ } else {
2721
+ Z_PROP_FLAG_P (var_ptr ) &= ~IS_PROP_REINITABLE ;
2714
2722
}
2715
2723
} else if (UNEXPECTED (!zend_verify_property_type (prop_info , var_ptr , EX_USES_STRICT_TYPES ()))) {
2716
2724
zval_ptr_dtor (var_ptr );
2717
2725
ZVAL_COPY_VALUE (var_ptr , & tmp );
2718
2726
} else {
2727
+ Z_PROP_FLAG_P (var_ptr ) &= ~IS_PROP_REINITABLE ;
2719
2728
zval_ptr_dtor (& tmp );
2720
2729
}
2721
2730
}
@@ -2738,7 +2747,7 @@ static void ZEND_FASTCALL zend_jit_post_inc_typed_prop(zval *var_ptr, zend_prope
2738
2747
{
2739
2748
ZEND_ASSERT (Z_TYPE_P (var_ptr ) != IS_UNDEF );
2740
2749
2741
- if (UNEXPECTED ((prop_info -> flags & ZEND_ACC_READONLY ))) {
2750
+ if (UNEXPECTED ((prop_info -> flags & ZEND_ACC_READONLY ) && !( Z_PROP_FLAG_P ( var_ptr ) & IS_PROP_REINITABLE ) )) {
2742
2751
zend_readonly_property_modification_error (prop_info );
2743
2752
if (result ) {
2744
2753
ZVAL_UNDEF (result );
@@ -2757,19 +2766,23 @@ static void ZEND_FASTCALL zend_jit_post_inc_typed_prop(zval *var_ptr, zend_prope
2757
2766
if (!(ZEND_TYPE_FULL_MASK (prop_info -> type ) & MAY_BE_DOUBLE )) {
2758
2767
zend_long val = _zend_jit_throw_inc_prop_error (prop_info );
2759
2768
ZVAL_LONG (var_ptr , val );
2769
+ } else {
2770
+ Z_PROP_FLAG_P (var_ptr ) &= ~IS_PROP_REINITABLE ;
2760
2771
}
2761
2772
} else if (UNEXPECTED (!zend_verify_property_type (prop_info , var_ptr , EX_USES_STRICT_TYPES ()))) {
2762
2773
zval_ptr_dtor (var_ptr );
2763
2774
ZVAL_COPY_VALUE (var_ptr , result );
2764
2775
ZVAL_UNDEF (result );
2776
+ } else {
2777
+ Z_PROP_FLAG_P (var_ptr ) &= ~IS_PROP_REINITABLE ;
2765
2778
}
2766
2779
}
2767
2780
2768
2781
static void ZEND_FASTCALL zend_jit_post_dec_typed_prop (zval * var_ptr , zend_property_info * prop_info , zval * result )
2769
2782
{
2770
2783
ZEND_ASSERT (Z_TYPE_P (var_ptr ) != IS_UNDEF );
2771
2784
2772
- if (UNEXPECTED ((prop_info -> flags & ZEND_ACC_READONLY ))) {
2785
+ if (UNEXPECTED ((prop_info -> flags & ZEND_ACC_READONLY ) && !( Z_PROP_FLAG_P ( var_ptr ) & IS_PROP_REINITABLE ) )) {
2773
2786
zend_readonly_property_modification_error (prop_info );
2774
2787
if (result ) {
2775
2788
ZVAL_UNDEF (result );
@@ -2788,11 +2801,15 @@ static void ZEND_FASTCALL zend_jit_post_dec_typed_prop(zval *var_ptr, zend_prope
2788
2801
if (!(ZEND_TYPE_FULL_MASK (prop_info -> type ) & MAY_BE_DOUBLE )) {
2789
2802
zend_long val = _zend_jit_throw_dec_prop_error (prop_info );
2790
2803
ZVAL_LONG (var_ptr , val );
2804
+ } else {
2805
+ Z_PROP_FLAG_P (var_ptr ) &= ~IS_PROP_REINITABLE ;
2791
2806
}
2792
2807
} else if (UNEXPECTED (!zend_verify_property_type (prop_info , var_ptr , EX_USES_STRICT_TYPES ()))) {
2793
2808
zval_ptr_dtor (var_ptr );
2794
2809
ZVAL_COPY_VALUE (var_ptr , result );
2795
2810
ZVAL_UNDEF (result );
2811
+ } else {
2812
+ Z_PROP_FLAG_P (var_ptr ) &= ~IS_PROP_REINITABLE ;
2796
2813
}
2797
2814
}
2798
2815
0 commit comments