@@ -3022,16 +3022,29 @@ static zend_always_inline zend_result _zend_update_type_info(
3022
3022
UPDATE_SSA_TYPE (tmp , ssa_op -> op1_def );
3023
3023
}
3024
3024
break ;
3025
- case ZEND_ASSIGN_OBJ :
3025
+ case ZEND_ASSIGN_OBJ : {
3026
+ const zend_property_info * prop_info = NULL ;
3026
3027
if (opline -> op1_type == IS_CV ) {
3027
- tmp = (t1 & (MAY_BE_REF |MAY_BE_OBJECT ))|MAY_BE_RC1 |MAY_BE_RCN ;
3028
+ bool add_rc = false;
3029
+ if (t1 & MAY_BE_OBJECT ) {
3030
+ prop_info = zend_fetch_prop_info (op_array , ssa , opline , ssa_op );
3031
+ if (!prop_info ) {
3032
+ zend_class_entry * ce = ssa_var_info [ssa_op -> op1_use ].ce ;
3033
+ if (!ce || ce -> __set || !(ce -> ce_flags & ZEND_ACC_FINAL )) {
3034
+ add_rc = true;
3035
+ }
3036
+ }
3037
+ }
3038
+ tmp = (t1 & (MAY_BE_REF |MAY_BE_OBJECT |MAY_BE_RC1 |MAY_BE_RCN ))|(add_rc ? (MAY_BE_RC1 |MAY_BE_RCN ) : 0 );
3028
3039
UPDATE_SSA_TYPE (tmp , ssa_op -> op1_def );
3029
3040
COPY_SSA_OBJ_TYPE (ssa_op -> op1_use , ssa_op -> op1_def );
3030
3041
}
3031
3042
if (ssa_op -> result_def >= 0 ) {
3032
3043
// TODO: If there is no __set we might do better
3033
- tmp = zend_fetch_prop_type (script ,
3034
- zend_fetch_prop_info (op_array , ssa , opline , ssa_op ), & ce );
3044
+ if (!prop_info ) {
3045
+ prop_info = zend_fetch_prop_info (op_array , ssa , opline , ssa_op );
3046
+ }
3047
+ tmp = zend_fetch_prop_type (script , prop_info , & ce );
3035
3048
UPDATE_SSA_TYPE (tmp , ssa_op -> result_def );
3036
3049
if (ce ) {
3037
3050
UPDATE_SSA_OBJ_TYPE (ce , 1 , ssa_op -> result_def );
@@ -3047,6 +3060,7 @@ static zend_always_inline zend_result _zend_update_type_info(
3047
3060
UPDATE_SSA_TYPE (tmp , ssa_op -> op1_def );
3048
3061
}
3049
3062
break ;
3063
+ }
3050
3064
case ZEND_ASSIGN_STATIC_PROP :
3051
3065
if (ssa_op -> result_def >= 0 ) {
3052
3066
tmp = MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_RC1 | MAY_BE_RCN ;
@@ -3157,15 +3171,6 @@ static zend_always_inline zend_result _zend_update_type_info(
3157
3171
}
3158
3172
break ;
3159
3173
case ZEND_ASSIGN_OBJ_REF :
3160
- if (opline -> op1_type == IS_CV && ssa_op -> op1_def >= 0 ) {
3161
- tmp = t1 ;
3162
- if (tmp & MAY_BE_OBJECT ) {
3163
- tmp |= MAY_BE_RC1 | MAY_BE_RCN ;
3164
- }
3165
- UPDATE_SSA_TYPE (tmp , ssa_op -> op1_def );
3166
- COPY_SSA_OBJ_TYPE (ssa_op -> op1_use , ssa_op -> op1_def );
3167
- }
3168
-
3169
3174
t2 = OP1_DATA_INFO ();
3170
3175
if ((opline + 1 )-> op1_type == IS_VAR && (opline -> extended_value & ZEND_RETURNS_FUNCTION )) {
3171
3176
tmp = (MAY_BE_REF | MAY_BE_RCN | MAY_BE_RC1 | t2 ) & ~MAY_BE_UNDEF ;
0 commit comments