@@ -3398,10 +3398,26 @@ static zend_always_inline int _zend_update_type_info(
3398
3398
case ZEND_FETCH_OBJ_UNSET :
3399
3399
case ZEND_FETCH_OBJ_FUNC_ARG :
3400
3400
if (ssa_op -> result_def >= 0 ) {
3401
- tmp = zend_fetch_prop_type (script ,
3402
- zend_fetch_prop_info (op_array , ssa , opline , ssa_op ), & ce );
3401
+ zend_property_info * prop_info = zend_fetch_prop_info (op_array , ssa , opline , ssa_op );
3402
+
3403
+ tmp = zend_fetch_prop_type (script , prop_info , & ce );
3403
3404
if (opline -> result_type != IS_TMP_VAR ) {
3404
3405
tmp |= MAY_BE_REF | MAY_BE_INDIRECT ;
3406
+ } else if (prop_info ) {
3407
+ /* FETCH_OBJ_R/IS for plain property increments reference counter,
3408
+ so it can't be 1 */
3409
+ tmp &= ~MAY_BE_RC1 ;
3410
+ } else {
3411
+ zend_class_entry * ce = NULL ;
3412
+
3413
+ if (opline -> op1_type == IS_UNUSED ) {
3414
+ ce = op_array -> scope ;
3415
+ } else if (ssa_op -> op1_use >= 0 && !ssa -> var_info [ssa_op -> op1_use ].is_instanceof ) {
3416
+ ce = ssa -> var_info [ssa_op -> op1_use ].ce ;
3417
+ }
3418
+ if (ce && !ce -> create_object && !ce -> __get ) {
3419
+ tmp &= ~MAY_BE_RC1 ;
3420
+ }
3405
3421
}
3406
3422
UPDATE_SSA_TYPE (tmp , ssa_op -> result_def );
3407
3423
if (ce ) {
@@ -3419,6 +3435,8 @@ static zend_always_inline int _zend_update_type_info(
3419
3435
zend_fetch_static_prop_info (script , op_array , ssa , opline ), & ce );
3420
3436
if (opline -> result_type != IS_TMP_VAR ) {
3421
3437
tmp |= MAY_BE_REF | MAY_BE_INDIRECT ;
3438
+ } else {
3439
+ tmp &= ~MAY_BE_RC1 ;
3422
3440
}
3423
3441
UPDATE_SSA_TYPE (tmp , ssa_op -> result_def );
3424
3442
if (ce ) {
@@ -3523,7 +3541,11 @@ static zend_always_inline int _zend_update_type_info(
3523
3541
if (ssa_op -> result_def >= 0 ) {
3524
3542
tmp = MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF ;
3525
3543
if (opline -> result_type == IS_TMP_VAR ) {
3526
- tmp |= MAY_BE_RC1 | MAY_BE_RCN ;
3544
+ if (opline -> opcode == ZEND_FETCH_R || opline -> opcode == ZEND_FETCH_IS ) {
3545
+ tmp |= MAY_BE_RCN ;
3546
+ } else {
3547
+ tmp |= MAY_BE_RC1 | MAY_BE_RCN ;
3548
+ }
3527
3549
} else {
3528
3550
tmp |= MAY_BE_REF | MAY_BE_RC1 | MAY_BE_RCN ;
3529
3551
switch (opline -> opcode ) {
0 commit comments