@@ -908,7 +908,9 @@ ZEND_API zval *zend_std_read_dimension(zend_object *object, zval *offset, int ty
908
908
zend_class_entry * ce = object -> ce ;
909
909
zval tmp_offset ;
910
910
911
- if (EXPECTED (zend_class_implements_interface (ce , zend_ce_arrayaccess ) != 0 )) {
911
+ /* arrayaccess_funcs_ptr is set if (and only if) the class implements zend_ce_arrayaccess */
912
+ zend_class_arrayaccess_funcs * funcs = ce -> arrayaccess_funcs_ptr ;
913
+ if (EXPECTED (funcs )) {
912
914
if (offset == NULL ) {
913
915
/* [] construct */
914
916
ZVAL_NULL (& tmp_offset );
@@ -918,9 +920,7 @@ ZEND_API zval *zend_std_read_dimension(zend_object *object, zval *offset, int ty
918
920
919
921
GC_ADDREF (object );
920
922
if (type == BP_VAR_IS ) {
921
- zend_function * offsetexists =
922
- zend_hash_find_ptr (& ce -> function_table , ZSTR_KNOWN (ZEND_STR_OFFSETEXISTS ));
923
- zend_call_known_instance_method_with_1_params (offsetexists , object , rv , & tmp_offset );
923
+ zend_call_known_instance_method_with_1_params (funcs -> zf_offsetexists , object , rv , & tmp_offset );
924
924
if (UNEXPECTED (Z_ISUNDEF_P (rv ))) {
925
925
OBJ_RELEASE (object );
926
926
zval_ptr_dtor (& tmp_offset );
@@ -935,9 +935,7 @@ ZEND_API zval *zend_std_read_dimension(zend_object *object, zval *offset, int ty
935
935
zval_ptr_dtor (rv );
936
936
}
937
937
938
- zend_function * offsetget =
939
- zend_hash_find_ptr (& ce -> function_table , ZSTR_KNOWN (ZEND_STR_OFFSETGET ));
940
- zend_call_known_instance_method_with_1_params (offsetget , object , rv , & tmp_offset );
938
+ zend_call_known_instance_method_with_1_params (funcs -> zf_offsetget , object , rv , & tmp_offset );
941
939
942
940
OBJ_RELEASE (object );
943
941
zval_ptr_dtor (& tmp_offset );
@@ -961,16 +959,15 @@ ZEND_API void zend_std_write_dimension(zend_object *object, zval *offset, zval *
961
959
zend_class_entry * ce = object -> ce ;
962
960
zval tmp_offset ;
963
961
964
- if (EXPECTED (zend_class_implements_interface (ce , zend_ce_arrayaccess ) != 0 )) {
962
+ zend_class_arrayaccess_funcs * funcs = ce -> arrayaccess_funcs_ptr ;
963
+ if (EXPECTED (funcs )) {
965
964
if (!offset ) {
966
965
ZVAL_NULL (& tmp_offset );
967
966
} else {
968
967
ZVAL_COPY_DEREF (& tmp_offset , offset );
969
968
}
970
969
GC_ADDREF (object );
971
- zend_function * offsetset =
972
- zend_hash_find_ptr (& ce -> function_table , ZSTR_KNOWN (ZEND_STR_OFFSETSET ));
973
- zend_call_known_instance_method_with_2_params (offsetset , object , NULL , & tmp_offset , value );
970
+ zend_call_known_instance_method_with_2_params (funcs -> zf_offsetset , object , NULL , & tmp_offset , value );
974
971
OBJ_RELEASE (object );
975
972
zval_ptr_dtor (& tmp_offset );
976
973
} else {
@@ -985,18 +982,15 @@ ZEND_API int zend_std_has_dimension(zend_object *object, zval *offset, int check
985
982
zval retval , tmp_offset ;
986
983
int result ;
987
984
988
- if (EXPECTED (zend_class_implements_interface (ce , zend_ce_arrayaccess ) != 0 )) {
985
+ zend_class_arrayaccess_funcs * funcs = ce -> arrayaccess_funcs_ptr ;
986
+ if (EXPECTED (funcs )) {
989
987
ZVAL_COPY_DEREF (& tmp_offset , offset );
990
988
GC_ADDREF (object );
991
- zend_function * offsetexists =
992
- zend_hash_find_ptr (& ce -> function_table , ZSTR_KNOWN (ZEND_STR_OFFSETEXISTS ));
993
- zend_call_known_instance_method_with_1_params (offsetexists , object , & retval , & tmp_offset );
989
+ zend_call_known_instance_method_with_1_params (funcs -> zf_offsetexists , object , & retval , & tmp_offset );
994
990
result = i_zend_is_true (& retval );
995
991
zval_ptr_dtor (& retval );
996
992
if (check_empty && result && EXPECTED (!EG (exception ))) {
997
- zend_function * offsetget =
998
- zend_hash_find_ptr (& ce -> function_table , ZSTR_KNOWN (ZEND_STR_OFFSETGET ));
999
- zend_call_known_instance_method_with_1_params (offsetget , object , & retval , & tmp_offset );
993
+ zend_call_known_instance_method_with_1_params (funcs -> zf_offsetget , object , & retval , & tmp_offset );
1000
994
result = i_zend_is_true (& retval );
1001
995
zval_ptr_dtor (& retval );
1002
996
}
@@ -1170,12 +1164,11 @@ ZEND_API void zend_std_unset_dimension(zend_object *object, zval *offset) /* {{{
1170
1164
zend_class_entry * ce = object -> ce ;
1171
1165
zval tmp_offset ;
1172
1166
1173
- if (zend_class_implements_interface (ce , zend_ce_arrayaccess )) {
1167
+ zend_class_arrayaccess_funcs * funcs = ce -> arrayaccess_funcs_ptr ;
1168
+ if (EXPECTED (funcs )) {
1174
1169
ZVAL_COPY_DEREF (& tmp_offset , offset );
1175
1170
GC_ADDREF (object );
1176
- zend_function * offsetunset =
1177
- zend_hash_find_ptr (& ce -> function_table , ZSTR_KNOWN (ZEND_STR_OFFSETUNSET ));
1178
- zend_call_known_instance_method_with_1_params (offsetunset , object , NULL , & tmp_offset );
1171
+ zend_call_known_instance_method_with_1_params (funcs -> zf_offsetunset , object , NULL , & tmp_offset );
1179
1172
OBJ_RELEASE (object );
1180
1173
zval_ptr_dtor (& tmp_offset );
1181
1174
} else {
0 commit comments