@@ -1264,9 +1264,9 @@ static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_illegal_string_offset
1264
1264
zend_type_error ("Cannot access offset of type %s on string" , zend_zval_type_name (offset ));
1265
1265
}
1266
1266
1267
- static zend_never_inline void zend_assign_to_object_dim (zval * object , zval * dim , zval * value OPLINE_DC EXECUTE_DATA_DC )
1267
+ static zend_never_inline void zend_assign_to_object_dim (zend_object * obj , zval * dim , zval * value OPLINE_DC EXECUTE_DATA_DC )
1268
1268
{
1269
- Z_OBJ_HT_P ( object ) -> write_dimension (Z_OBJ_P ( object ) , dim , value );
1269
+ obj -> handlers -> write_dimension (obj , dim , value );
1270
1270
1271
1271
if (UNEXPECTED (RETURN_VALUE_USED (opline ))) {
1272
1272
ZVAL_COPY (EX_VAR (opline -> result .var ), value );
@@ -1300,12 +1300,14 @@ static zend_never_inline void zend_binary_assign_op_obj_dim(zval *object, zval *
1300
1300
zval * value ;
1301
1301
zval * z ;
1302
1302
zval rv , res ;
1303
+ zend_object * obj = Z_OBJ_P (object );
1303
1304
1305
+ GC_ADDREF (obj );
1304
1306
value = get_op_data_zval_ptr_r ((opline + 1 )-> op1_type , (opline + 1 )-> op1 );
1305
- if ((z = Z_OBJ_HT_P ( object ) -> read_dimension (Z_OBJ_P ( object ) , property , BP_VAR_R , & rv )) != NULL ) {
1307
+ if ((z = obj -> handlers -> read_dimension (obj , property , BP_VAR_R , & rv )) != NULL ) {
1306
1308
1307
1309
if (zend_binary_op (& res , z , value OPLINE_CC ) == SUCCESS ) {
1308
- Z_OBJ_HT_P ( object ) -> write_dimension (Z_OBJ_P ( object ) , property , & res );
1310
+ obj -> handlers -> write_dimension (obj , property , & res );
1309
1311
}
1310
1312
if (z == & rv ) {
1311
1313
zval_ptr_dtor (& rv );
@@ -1321,6 +1323,9 @@ static zend_never_inline void zend_binary_assign_op_obj_dim(zval *object, zval *
1321
1323
}
1322
1324
}
1323
1325
FREE_OP ((opline + 1 )-> op1_type , (opline + 1 )-> op1 .var );
1326
+ if (UNEXPECTED (GC_DELREF (obj ) == 0 )) {
1327
+ zend_objects_store_del (obj );
1328
+ }
1324
1329
}
1325
1330
1326
1331
static zend_never_inline void zend_binary_assign_op_typed_ref (zend_reference * ref , zval * value OPLINE_DC EXECUTE_DATA_DC )
@@ -2317,22 +2322,17 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval *
2317
2322
}
2318
2323
ZVAL_UNDEF (result );
2319
2324
} else if (EXPECTED (Z_TYPE_P (container ) == IS_OBJECT )) {
2325
+ zend_object * obj = Z_OBJ_P (container );
2326
+ GC_ADDREF (obj );
2320
2327
if (ZEND_CONST_COND (dim_type == IS_CV , dim != NULL ) && UNEXPECTED (Z_TYPE_P (dim ) == IS_UNDEF )) {
2321
- zend_object * obj = Z_OBJ_P (container );
2322
- GC_ADDREF (obj );
2323
2328
dim = ZVAL_UNDEFINED_OP2 ();
2324
- if (UNEXPECTED (GC_DELREF (obj ) == 0 )) {
2325
- zend_objects_store_del (obj );
2326
- ZVAL_NULL (result );
2327
- return ;
2328
- }
2329
2329
} else if (dim_type == IS_CONST && Z_EXTRA_P (dim ) == ZEND_EXTRA_VALUE ) {
2330
2330
dim ++ ;
2331
2331
}
2332
- retval = Z_OBJ_HT_P ( container ) -> read_dimension (Z_OBJ_P ( container ) , dim , type , result );
2332
+ retval = obj -> handlers -> read_dimension (obj , dim , type , result );
2333
2333
2334
2334
if (UNEXPECTED (retval == & EG (uninitialized_zval ))) {
2335
- zend_class_entry * ce = Z_OBJCE_P ( container ) ;
2335
+ zend_class_entry * ce = obj -> ce ;
2336
2336
2337
2337
ZVAL_NULL (result );
2338
2338
zend_error (E_NOTICE , "Indirect modification of overloaded element of %s has no effect" , ZSTR_VAL (ce -> name ));
@@ -2343,7 +2343,7 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval *
2343
2343
retval = result ;
2344
2344
}
2345
2345
if (Z_TYPE_P (retval ) != IS_OBJECT ) {
2346
- zend_class_entry * ce = Z_OBJCE_P ( container ) ;
2346
+ zend_class_entry * ce = obj -> ce ;
2347
2347
zend_error (E_NOTICE , "Indirect modification of overloaded element of %s has no effect" , ZSTR_VAL (ce -> name ));
2348
2348
}
2349
2349
} else if (UNEXPECTED (Z_REFCOUNT_P (retval ) == 1 )) {
@@ -2356,6 +2356,9 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval *
2356
2356
ZEND_ASSERT (EG (exception ) && "read_dimension() returned NULL without exception" );
2357
2357
ZVAL_UNDEF (result );
2358
2358
}
2359
+ if (UNEXPECTED (GC_DELREF (obj ) == 0 )) {
2360
+ zend_objects_store_del (obj );
2361
+ }
2359
2362
} else {
2360
2363
if (EXPECTED (Z_TYPE_P (container ) <= IS_FALSE )) {
2361
2364
if (type != BP_VAR_W && UNEXPECTED (Z_TYPE_P (container ) == IS_UNDEF )) {
@@ -2508,13 +2511,16 @@ static zend_always_inline void zend_fetch_dimension_address_read(zval *result, z
2508
2511
ZVAL_CHAR (result , c );
2509
2512
}
2510
2513
} else if (EXPECTED (Z_TYPE_P (container ) == IS_OBJECT )) {
2514
+ zend_object * obj = Z_OBJ_P (container );
2515
+
2516
+ GC_ADDREF (obj );
2511
2517
if (ZEND_CONST_COND (dim_type == IS_CV , 1 ) && UNEXPECTED (Z_TYPE_P (dim ) == IS_UNDEF )) {
2512
2518
dim = ZVAL_UNDEFINED_OP2 ();
2513
2519
}
2514
2520
if (dim_type == IS_CONST && Z_EXTRA_P (dim ) == ZEND_EXTRA_VALUE ) {
2515
2521
dim ++ ;
2516
2522
}
2517
- retval = Z_OBJ_HT_P ( container ) -> read_dimension (Z_OBJ_P ( container ) , dim , type , result );
2523
+ retval = obj -> handlers -> read_dimension (obj , dim , type , result );
2518
2524
2519
2525
ZEND_ASSERT (result != NULL );
2520
2526
if (retval ) {
@@ -2526,6 +2532,9 @@ static zend_always_inline void zend_fetch_dimension_address_read(zval *result, z
2526
2532
} else {
2527
2533
ZVAL_NULL (result );
2528
2534
}
2535
+ if (UNEXPECTED (GC_DELREF (obj ) == 0 )) {
2536
+ zend_objects_store_del (obj );
2537
+ }
2529
2538
} else {
2530
2539
if (type != BP_VAR_IS && UNEXPECTED (Z_TYPE_P (container ) == IS_UNDEF )) {
2531
2540
container = ZVAL_UNDEFINED_OP1 ();
0 commit comments