@@ -1612,7 +1612,7 @@ static zend_never_inline void zend_unset_object_dim(zend_object *obj, zval *offs
1612
1612
if (EXPECTED (obj -> ce -> dimension_handlers )) {
1613
1613
if (EXPECTED (obj -> ce -> dimension_handlers -> unset_dimension )) {
1614
1614
ZVAL_DEREF (offset );
1615
- obj -> ce -> dimension_handlers -> unset_dimension (obj , offset );
1615
+ zend_class_unset_dimension (obj , offset );
1616
1616
} else {
1617
1617
zend_invalid_use_of_object_as_array (obj , /* has_offset */ true, BP_VAR_UNSET );
1618
1618
}
@@ -1629,12 +1629,12 @@ static zend_never_inline void zend_assign_to_object_dim(zend_object *obj, zval *
1629
1629
&& obj -> ce -> dimension_handlers -> write_dimension
1630
1630
) {
1631
1631
ZVAL_DEREF (offset );
1632
- obj -> ce -> dimension_handlers -> write_dimension (obj , offset , value );
1632
+ zend_class_write_dimension (obj , offset , value );
1633
1633
} else if (
1634
1634
!offset
1635
1635
&& obj -> ce -> dimension_handlers -> append
1636
1636
) {
1637
- obj -> ce -> dimension_handlers -> append (obj , value );
1637
+ zend_class_append (obj , value );
1638
1638
} else {
1639
1639
zend_invalid_use_of_object_as_array (obj , /* has_offset */ offset , BP_VAR_W );
1640
1640
}
@@ -1752,8 +1752,7 @@ static zend_never_inline void zend_binary_assign_op_obj_dim(zend_object *obj, zv
1752
1752
if (zend_binary_op (& res , & zref , value OPLINE_CC ) == SUCCESS ) {
1753
1753
zval tmp ;
1754
1754
ZVAL_NULL (& tmp );
1755
-
1756
- obj -> ce -> dimension_handlers -> write_dimension (obj , & tmp , & res );
1755
+ zend_class_write_dimension (obj , & tmp , & res );
1757
1756
}
1758
1757
1759
1758
if (UNEXPECTED (RETURN_VALUE_USED (opline ))) {
@@ -1828,7 +1827,7 @@ static zend_never_inline void zend_binary_assign_op_obj_dim(zend_object *obj, zv
1828
1827
zval * z ;
1829
1828
zval rv , res ;
1830
1829
1831
- z = obj -> ce -> dimension_handlers -> read_dimension (obj , dim , & rv );
1830
+ z = zend_class_read_dimension (obj , dim , & rv );
1832
1831
if (UNEXPECTED (z == NULL )) {
1833
1832
ZEND_ASSERT (EG (exception ) && "returned NULL without exception" );
1834
1833
if (UNEXPECTED (RETURN_VALUE_USED (opline ))) {
@@ -1837,7 +1836,7 @@ static zend_never_inline void zend_binary_assign_op_obj_dim(zend_object *obj, zv
1837
1836
goto clean_up ;
1838
1837
} else {
1839
1838
if (zend_binary_op (& res , z , value OPLINE_CC ) == SUCCESS ) {
1840
- obj -> ce -> dimension_handlers -> write_dimension (obj , dim , & res );
1839
+ zend_class_write_dimension (obj , dim , & res );
1841
1840
}
1842
1841
}
1843
1842
@@ -3009,15 +3008,15 @@ static zend_never_inline void zend_fetch_object_dimension_address(zval *result,
3009
3008
if (UNEXPECTED (type == BP_VAR_IS )) {
3010
3009
ZEND_ASSERT (obj -> ce -> dimension_handlers -> has_dimension );
3011
3010
/* The key does not exist */
3012
- if (!obj -> ce -> dimension_handlers -> has_dimension (obj , offset )) {
3011
+ if (!zend_class_has_dimension (obj , offset )) {
3013
3012
ZVAL_UNDEF (result );
3014
3013
goto clean_up ;
3015
3014
}
3016
3015
} else if (UNEXPECTED (type == BP_VAR_RW )) {
3017
3016
/* RW semantics dictate that the offset must actually exists, otherwise a warning is emitted */
3018
- offset_exists = obj -> ce -> dimension_handlers -> has_dimension (obj , offset );
3017
+ offset_exists = zend_class_has_dimension (obj , offset );
3019
3018
}
3020
- retval = obj -> ce -> dimension_handlers -> fetch_dimension (obj , offset , result );
3019
+ retval = zend_class_fetch_dimension (obj , offset , result );
3021
3020
if (UNEXPECTED (type == BP_VAR_RW && !offset_exists && !EG (exception ))) {
3022
3021
// TODO Better warning?
3023
3022
zend_error (E_WARNING , "Undefined offset" );
@@ -3029,7 +3028,7 @@ static zend_never_inline void zend_fetch_object_dimension_address(zval *result,
3029
3028
} else if (!offset && obj -> ce -> dimension_handlers -> fetch_append ) {
3030
3029
ZEND_ASSERT (zend_check_dimension_interfaces_implemented (obj , /* has_offset */ false, BP_VAR_FETCH ));
3031
3030
ZEND_ASSERT (type != BP_VAR_IS );
3032
- retval = obj -> ce -> dimension_handlers -> fetch_append (obj , result );
3031
+ retval = zend_class_fetch_append (obj , result );
3033
3032
} else {
3034
3033
zend_invalid_use_of_object_as_array (obj , /* has_offset */ offset , BP_VAR_FETCH );
3035
3034
ZVAL_UNDEF (result );
@@ -3235,15 +3234,16 @@ static zend_never_inline void zend_fetch_object_dimension_address_read(zval *res
3235
3234
ZEND_ASSERT (zend_check_dimension_interfaces_implemented (obj , /* has_offset */ true, BP_VAR_R ));
3236
3235
3237
3236
ZVAL_DEREF (offset );
3237
+ // TODO Same logic as isset() here?
3238
3238
if (UNEXPECTED (
3239
3239
is_bp_var_is
3240
- && !obj -> ce -> dimension_handlers -> has_dimension (obj , offset )
3240
+ && !zend_class_has_dimension (obj , offset )
3241
3241
)) {
3242
3242
ZVAL_NULL (result );
3243
3243
goto end ;
3244
3244
}
3245
3245
3246
- retval = obj -> ce -> dimension_handlers -> read_dimension (obj , offset , result );
3246
+ retval = zend_class_read_dimension (obj , offset , result );
3247
3247
3248
3248
ZEND_ASSERT (result != NULL );
3249
3249
if (EXPECTED (retval )) {
@@ -3253,7 +3253,7 @@ static zend_never_inline void zend_fetch_object_dimension_address_read(zval *res
3253
3253
zend_unwrap_reference (result );
3254
3254
}
3255
3255
} else {
3256
- ZEND_ASSERT (EG (exception ) && "read_dimension () returned NULL without exception" );
3256
+ ZEND_ASSERT (EG (exception ) && "zend_class_read_dimension () returned NULL without exception" );
3257
3257
ZVAL_NULL (result );
3258
3258
}
3259
3259
} else {
@@ -3423,29 +3423,10 @@ static zend_never_inline bool ZEND_FASTCALL zend_isset_dim_slow(zval *container,
3423
3423
3424
3424
ZVAL_DEREF (offset );
3425
3425
3426
- /* Object handler can modify the value of the object via globals; thus take a copy */
3427
- zval copy ;
3428
- ZVAL_COPY (& copy , container );
3429
- const zend_class_entry * ce = obj -> ce ;
3430
- bool exists = ce -> dimension_handlers -> has_dimension (Z_OBJ (copy ), offset );
3431
- if (!exists ) {
3432
- zval_ptr_dtor (& copy );
3433
- return false;
3434
- }
3435
-
3436
- zval * retval ;
3437
- zval slot ;
3438
- retval = ce -> dimension_handlers -> read_dimension (Z_OBJ (copy ), offset , & slot );
3426
+ GC_ADDREF (obj );
3427
+ bool result = zend_class_isset_empty_dimension (obj , offset , /* is_empty */ false);
3428
+ GC_DELREF (obj );
3439
3429
3440
- zval_ptr_dtor (& copy );
3441
- if (UNEXPECTED (!retval )) {
3442
- ZEND_ASSERT (EG (exception ) && "read_dimension() returned NULL without exception" );
3443
- return true;
3444
- }
3445
- ZEND_ASSERT (Z_TYPE_P (retval ) != IS_UNDEF );
3446
- /* Check if value is null, if it is we consider it to not be set */
3447
- bool result = Z_TYPE_P (retval ) != IS_NULL ;
3448
- zval_ptr_dtor (retval );
3449
3430
return result ;
3450
3431
} else {
3451
3432
zend_invalid_use_of_object_as_array (obj , /* has_offset */ true, BP_VAR_IS );
@@ -3497,29 +3478,10 @@ static zend_never_inline bool ZEND_FASTCALL zend_isempty_dim_slow(zval *containe
3497
3478
3498
3479
ZVAL_DEREF (offset );
3499
3480
3500
- /* Object handler can modify the value of the object via globals; thus take a copy */
3501
- zval copy ;
3502
- ZVAL_COPY (& copy , container );
3503
- const zend_class_entry * ce = obj -> ce ;
3504
- bool exists = ce -> dimension_handlers -> has_dimension (Z_OBJ (copy ), offset );
3505
- if (!exists ) {
3506
- zval_ptr_dtor (& copy );
3507
- return true;
3508
- }
3509
-
3510
- zval * retval ;
3511
- zval slot ;
3512
- retval = ce -> dimension_handlers -> read_dimension (Z_OBJ (copy ), offset , & slot );
3481
+ GC_ADDREF (obj );
3482
+ bool result = zend_class_isset_empty_dimension (obj , offset , /* is_empty */ true);
3483
+ GC_DELREF (obj );
3513
3484
3514
- zval_ptr_dtor (& copy );
3515
- if (UNEXPECTED (!retval )) {
3516
- ZEND_ASSERT (EG (exception ) && "read_dimension() returned NULL without exception" );
3517
- return true;
3518
- }
3519
- ZEND_ASSERT (Z_TYPE_P (retval ) != IS_UNDEF );
3520
- /* Check if value is empty, which it is when it is falsy, i.e. not truthy */
3521
- bool result = !i_zend_is_true (retval );
3522
- zval_ptr_dtor (retval );
3523
3485
return result ;
3524
3486
} else {
3525
3487
zend_invalid_use_of_object_as_array (obj , /* has_offset */ true, BP_VAR_IS );
0 commit comments