@@ -1394,9 +1394,9 @@ static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_illegal_string_offset
1394
1394
zend_type_error ("Cannot access offset of type %s on string" , zend_zval_type_name (offset ));
1395
1395
}
1396
1396
1397
- static zend_never_inline void zend_assign_to_object_dim (zval * object , zval * dim , zval * value OPLINE_DC EXECUTE_DATA_DC )
1397
+ static zend_never_inline void zend_assign_to_object_dim (zend_object * obj , zval * dim , zval * value OPLINE_DC EXECUTE_DATA_DC )
1398
1398
{
1399
- Z_OBJ_HT_P ( object ) -> write_dimension (Z_OBJ_P ( object ) , dim , value );
1399
+ obj -> handlers -> write_dimension (obj , dim , value );
1400
1400
1401
1401
if (UNEXPECTED (RETURN_VALUE_USED (opline ))) {
1402
1402
ZVAL_COPY (EX_VAR (opline -> result .var ), value );
@@ -1431,6 +1431,7 @@ static zend_never_inline void zend_binary_assign_op_obj_dim(zend_object *obj, zv
1431
1431
zval * z ;
1432
1432
zval rv , res ;
1433
1433
1434
+ GC_ADDREF (obj );
1434
1435
value = get_op_data_zval_ptr_r ((opline + 1 )-> op1_type , (opline + 1 )-> op1 );
1435
1436
if ((z = obj -> handlers -> read_dimension (obj , property , BP_VAR_R , & rv )) != NULL ) {
1436
1437
@@ -1451,6 +1452,9 @@ static zend_never_inline void zend_binary_assign_op_obj_dim(zend_object *obj, zv
1451
1452
}
1452
1453
}
1453
1454
FREE_OP ((opline + 1 )-> op1_type , (opline + 1 )-> op1 .var );
1455
+ if (UNEXPECTED (GC_DELREF (obj ) == 0 )) {
1456
+ zend_objects_store_del (obj );
1457
+ }
1454
1458
}
1455
1459
1456
1460
static zend_never_inline void zend_binary_assign_op_typed_ref (zend_reference * ref , zval * value OPLINE_DC EXECUTE_DATA_DC )
@@ -2464,22 +2468,17 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval *
2464
2468
}
2465
2469
ZVAL_UNDEF (result );
2466
2470
} else if (EXPECTED (Z_TYPE_P (container ) == IS_OBJECT )) {
2471
+ zend_object * obj = Z_OBJ_P (container );
2472
+ GC_ADDREF (obj );
2467
2473
if (ZEND_CONST_COND (dim_type == IS_CV , dim != NULL ) && UNEXPECTED (Z_TYPE_P (dim ) == IS_UNDEF )) {
2468
- zend_object * obj = Z_OBJ_P (container );
2469
- GC_ADDREF (obj );
2470
2474
dim = ZVAL_UNDEFINED_OP2 ();
2471
- if (UNEXPECTED (GC_DELREF (obj ) == 0 )) {
2472
- zend_objects_store_del (obj );
2473
- ZVAL_NULL (result );
2474
- return ;
2475
- }
2476
2475
} else if (dim_type == IS_CONST && Z_EXTRA_P (dim ) == ZEND_EXTRA_VALUE ) {
2477
2476
dim ++ ;
2478
2477
}
2479
- retval = Z_OBJ_HT_P ( container ) -> read_dimension (Z_OBJ_P ( container ) , dim , type , result );
2478
+ retval = obj -> handlers -> read_dimension (obj , dim , type , result );
2480
2479
2481
2480
if (UNEXPECTED (retval == & EG (uninitialized_zval ))) {
2482
- zend_class_entry * ce = Z_OBJCE_P ( container ) ;
2481
+ zend_class_entry * ce = obj -> ce ;
2483
2482
2484
2483
ZVAL_NULL (result );
2485
2484
zend_error (E_NOTICE , "Indirect modification of overloaded element of %s has no effect" , ZSTR_VAL (ce -> name ));
@@ -2490,7 +2489,7 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval *
2490
2489
retval = result ;
2491
2490
}
2492
2491
if (Z_TYPE_P (retval ) != IS_OBJECT ) {
2493
- zend_class_entry * ce = Z_OBJCE_P ( container ) ;
2492
+ zend_class_entry * ce = obj -> ce ;
2494
2493
zend_error (E_NOTICE , "Indirect modification of overloaded element of %s has no effect" , ZSTR_VAL (ce -> name ));
2495
2494
}
2496
2495
} else if (UNEXPECTED (Z_REFCOUNT_P (retval ) == 1 )) {
@@ -2503,6 +2502,9 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval *
2503
2502
ZEND_ASSERT (EG (exception ) && "read_dimension() returned NULL without exception" );
2504
2503
ZVAL_UNDEF (result );
2505
2504
}
2505
+ if (UNEXPECTED (GC_DELREF (obj ) == 0 )) {
2506
+ zend_objects_store_del (obj );
2507
+ }
2506
2508
} else {
2507
2509
if (EXPECTED (Z_TYPE_P (container ) <= IS_FALSE )) {
2508
2510
if (type != BP_VAR_W && UNEXPECTED (Z_TYPE_P (container ) == IS_UNDEF )) {
@@ -2670,13 +2672,16 @@ static zend_always_inline void zend_fetch_dimension_address_read(zval *result, z
2670
2672
ZVAL_CHAR (result , c );
2671
2673
}
2672
2674
} else if (EXPECTED (Z_TYPE_P (container ) == IS_OBJECT )) {
2675
+ zend_object * obj = Z_OBJ_P (container );
2676
+
2677
+ GC_ADDREF (obj );
2673
2678
if (ZEND_CONST_COND (dim_type == IS_CV , 1 ) && UNEXPECTED (Z_TYPE_P (dim ) == IS_UNDEF )) {
2674
2679
dim = ZVAL_UNDEFINED_OP2 ();
2675
2680
}
2676
2681
if (dim_type == IS_CONST && Z_EXTRA_P (dim ) == ZEND_EXTRA_VALUE ) {
2677
2682
dim ++ ;
2678
2683
}
2679
- retval = Z_OBJ_HT_P ( container ) -> read_dimension (Z_OBJ_P ( container ) , dim , type , result );
2684
+ retval = obj -> handlers -> read_dimension (obj , dim , type , result );
2680
2685
2681
2686
ZEND_ASSERT (result != NULL );
2682
2687
if (retval ) {
@@ -2688,6 +2693,9 @@ static zend_always_inline void zend_fetch_dimension_address_read(zval *result, z
2688
2693
} else {
2689
2694
ZVAL_NULL (result );
2690
2695
}
2696
+ if (UNEXPECTED (GC_DELREF (obj ) == 0 )) {
2697
+ zend_objects_store_del (obj );
2698
+ }
2691
2699
} else {
2692
2700
if (type != BP_VAR_IS && UNEXPECTED (Z_TYPE_P (container ) == IS_UNDEF )) {
2693
2701
container = ZVAL_UNDEFINED_OP1 ();
0 commit comments