@@ -1380,9 +1380,9 @@ static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_illegal_string_offset
1380
1380
zend_type_error ("Cannot access offset of type %s on string" , zend_zval_type_name (offset ));
1381
1381
}
1382
1382
1383
- static zend_never_inline void zend_assign_to_object_dim (zval * object , zval * dim , zval * value OPLINE_DC EXECUTE_DATA_DC )
1383
+ static zend_never_inline void zend_assign_to_object_dim (zend_object * obj , zval * dim , zval * value OPLINE_DC EXECUTE_DATA_DC )
1384
1384
{
1385
- Z_OBJ_HT_P ( object ) -> write_dimension (Z_OBJ_P ( object ) , dim , value );
1385
+ obj -> handlers -> write_dimension (obj , dim , value );
1386
1386
1387
1387
if (UNEXPECTED (RETURN_VALUE_USED (opline ))) {
1388
1388
ZVAL_COPY (EX_VAR (opline -> result .var ), value );
@@ -1417,6 +1417,7 @@ static zend_never_inline void zend_binary_assign_op_obj_dim(zend_object *obj, zv
1417
1417
zval * z ;
1418
1418
zval rv , res ;
1419
1419
1420
+ GC_ADDREF (obj );
1420
1421
value = get_op_data_zval_ptr_r ((opline + 1 )-> op1_type , (opline + 1 )-> op1 );
1421
1422
if ((z = obj -> handlers -> read_dimension (obj , property , BP_VAR_R , & rv )) != NULL ) {
1422
1423
@@ -1437,6 +1438,9 @@ static zend_never_inline void zend_binary_assign_op_obj_dim(zend_object *obj, zv
1437
1438
}
1438
1439
}
1439
1440
FREE_OP ((opline + 1 )-> op1_type , (opline + 1 )-> op1 .var );
1441
+ if (UNEXPECTED (GC_DELREF (obj ) == 0 )) {
1442
+ zend_objects_store_del (obj );
1443
+ }
1440
1444
}
1441
1445
1442
1446
static zend_never_inline void zend_binary_assign_op_typed_ref (zend_reference * ref , zval * value OPLINE_DC EXECUTE_DATA_DC )
@@ -2390,22 +2394,17 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval *
2390
2394
}
2391
2395
ZVAL_UNDEF (result );
2392
2396
} else if (EXPECTED (Z_TYPE_P (container ) == IS_OBJECT )) {
2397
+ zend_object * obj = Z_OBJ_P (container );
2398
+ GC_ADDREF (obj );
2393
2399
if (ZEND_CONST_COND (dim_type == IS_CV , dim != NULL ) && UNEXPECTED (Z_TYPE_P (dim ) == IS_UNDEF )) {
2394
- zend_object * obj = Z_OBJ_P (container );
2395
- GC_ADDREF (obj );
2396
2400
dim = ZVAL_UNDEFINED_OP2 ();
2397
- if (UNEXPECTED (GC_DELREF (obj ) == 0 )) {
2398
- zend_objects_store_del (obj );
2399
- ZVAL_NULL (result );
2400
- return ;
2401
- }
2402
2401
} else if (dim_type == IS_CONST && Z_EXTRA_P (dim ) == ZEND_EXTRA_VALUE ) {
2403
2402
dim ++ ;
2404
2403
}
2405
- retval = Z_OBJ_HT_P ( container ) -> read_dimension (Z_OBJ_P ( container ) , dim , type , result );
2404
+ retval = obj -> handlers -> read_dimension (obj , dim , type , result );
2406
2405
2407
2406
if (UNEXPECTED (retval == & EG (uninitialized_zval ))) {
2408
- zend_class_entry * ce = Z_OBJCE_P ( container ) ;
2407
+ zend_class_entry * ce = obj -> ce ;
2409
2408
2410
2409
ZVAL_NULL (result );
2411
2410
zend_error (E_NOTICE , "Indirect modification of overloaded element of %s has no effect" , ZSTR_VAL (ce -> name ));
@@ -2416,7 +2415,7 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval *
2416
2415
retval = result ;
2417
2416
}
2418
2417
if (Z_TYPE_P (retval ) != IS_OBJECT ) {
2419
- zend_class_entry * ce = Z_OBJCE_P ( container ) ;
2418
+ zend_class_entry * ce = obj -> ce ;
2420
2419
zend_error (E_NOTICE , "Indirect modification of overloaded element of %s has no effect" , ZSTR_VAL (ce -> name ));
2421
2420
}
2422
2421
} else if (UNEXPECTED (Z_REFCOUNT_P (retval ) == 1 )) {
@@ -2429,6 +2428,9 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval *
2429
2428
ZEND_ASSERT (EG (exception ) && "read_dimension() returned NULL without exception" );
2430
2429
ZVAL_UNDEF (result );
2431
2430
}
2431
+ if (UNEXPECTED (GC_DELREF (obj ) == 0 )) {
2432
+ zend_objects_store_del (obj );
2433
+ }
2432
2434
} else {
2433
2435
if (EXPECTED (Z_TYPE_P (container ) <= IS_FALSE )) {
2434
2436
if (type != BP_VAR_W && UNEXPECTED (Z_TYPE_P (container ) == IS_UNDEF )) {
@@ -2596,13 +2598,16 @@ static zend_always_inline void zend_fetch_dimension_address_read(zval *result, z
2596
2598
ZVAL_CHAR (result , c );
2597
2599
}
2598
2600
} else if (EXPECTED (Z_TYPE_P (container ) == IS_OBJECT )) {
2601
+ zend_object * obj = Z_OBJ_P (container );
2602
+
2603
+ GC_ADDREF (obj );
2599
2604
if (ZEND_CONST_COND (dim_type == IS_CV , 1 ) && UNEXPECTED (Z_TYPE_P (dim ) == IS_UNDEF )) {
2600
2605
dim = ZVAL_UNDEFINED_OP2 ();
2601
2606
}
2602
2607
if (dim_type == IS_CONST && Z_EXTRA_P (dim ) == ZEND_EXTRA_VALUE ) {
2603
2608
dim ++ ;
2604
2609
}
2605
- retval = Z_OBJ_HT_P ( container ) -> read_dimension (Z_OBJ_P ( container ) , dim , type , result );
2610
+ retval = obj -> handlers -> read_dimension (obj , dim , type , result );
2606
2611
2607
2612
ZEND_ASSERT (result != NULL );
2608
2613
if (retval ) {
@@ -2614,6 +2619,9 @@ static zend_always_inline void zend_fetch_dimension_address_read(zval *result, z
2614
2619
} else {
2615
2620
ZVAL_NULL (result );
2616
2621
}
2622
+ if (UNEXPECTED (GC_DELREF (obj ) == 0 )) {
2623
+ zend_objects_store_del (obj );
2624
+ }
2617
2625
} else {
2618
2626
if (type != BP_VAR_IS && UNEXPECTED (Z_TYPE_P (container ) == IS_UNDEF )) {
2619
2627
container = ZVAL_UNDEFINED_OP1 ();
0 commit comments