@@ -1099,23 +1099,9 @@ static zend_always_inline bool zend_value_instanceof_static(const zval *zv) {
10991099 return instanceof_function (Z_OBJCE_P (zv ), called_scope );
11001100}
11011101
1102- /* The cache_slot may only be NULL in debug builds, where arginfo verification of
1103- * internal functions is enabled. Avoid unnecessary checks in release builds. */
1104- #if ZEND_DEBUG
1105- # define HAVE_CACHE_SLOT (cache_slot != NULL)
1106- #else
1107- # define HAVE_CACHE_SLOT 1
1108- #endif
1109-
1110- #define PROGRESS_CACHE_SLOT () if (HAVE_CACHE_SLOT) {cache_slot++;}
1111-
1112- static zend_always_inline zend_class_entry * zend_fetch_ce_from_cache_slot (
1113- void * * cache_slot , const zend_type * type )
1102+ static zend_always_inline zend_class_entry * zend_fetch_ce_from_type (
1103+ const zend_type * type )
11141104{
1115- if (EXPECTED (HAVE_CACHE_SLOT && * cache_slot )) {
1116- return (zend_class_entry * ) * cache_slot ;
1117- }
1118-
11191105 zend_string * name = ZEND_TYPE_NAME (* type );
11201106 zend_class_entry * ce ;
11211107 if (ZSTR_HAS_CE_CACHE (name )) {
@@ -1134,68 +1120,54 @@ static zend_always_inline zend_class_entry *zend_fetch_ce_from_cache_slot(
11341120 return NULL ;
11351121 }
11361122 }
1137- if (HAVE_CACHE_SLOT ) {
1138- * cache_slot = (void * ) ce ;
1139- }
11401123 return ce ;
11411124}
11421125
1143- static bool zend_check_intersection_type_from_cache_slot (
1126+ static bool zend_check_intersection_type_from_list (
11441127 const zend_type_list * intersection_type_list ,
1145- const zend_class_entry * arg_ce ,
1146- void * * * cache_slot_ptr )
1128+ zend_class_entry * arg_ce )
11471129{
1148- void * * cache_slot = * cache_slot_ptr ;
1130+ zend_class_entry * ce ;
11491131 const zend_type * list_type ;
1150- bool status = true;
11511132 ZEND_TYPE_LIST_FOREACH (intersection_type_list , list_type ) {
1152- /* Only check classes if the type might be valid */
1153- if (status ) {
1154- zend_class_entry * ce = zend_fetch_ce_from_cache_slot (cache_slot , list_type );
1155- /* If type is not an instance of one of the types taking part in the
1156- * intersection it cannot be a valid instance of the whole intersection type. */
1157- if (!ce || !instanceof_function (arg_ce , ce )) {
1158- status = false;
1159- }
1133+ ce = zend_fetch_ce_from_type (list_type );
1134+ /* If type is not an instance of one of the types taking part in the
1135+ * intersection it cannot be a valid instance of the whole intersection type. */
1136+ if (!ce || !instanceof_function (arg_ce , ce )) {
1137+ return false;
11601138 }
1161- PROGRESS_CACHE_SLOT ();
11621139 } ZEND_TYPE_LIST_FOREACH_END ();
1163- if (HAVE_CACHE_SLOT ) {
1164- * cache_slot_ptr = cache_slot ;
1165- }
1166- return status ;
1140+ return true;
11671141}
11681142
11691143static zend_always_inline bool zend_check_type_slow (
1170- const zend_type * type , zval * arg , const zend_reference * ref , void * * cache_slot ,
1144+ const zend_type * type , zval * arg , const zend_reference * ref ,
11711145 bool is_return_type , bool is_internal )
11721146{
11731147 if (ZEND_TYPE_IS_COMPLEX (* type ) && EXPECTED (Z_TYPE_P (arg ) == IS_OBJECT )) {
11741148 zend_class_entry * ce ;
11751149 if (UNEXPECTED (ZEND_TYPE_HAS_LIST (* type ))) {
11761150 if (ZEND_TYPE_IS_INTERSECTION (* type )) {
1177- return zend_check_intersection_type_from_cache_slot (ZEND_TYPE_LIST (* type ), Z_OBJCE_P (arg ), & cache_slot );
1151+ return zend_check_intersection_type_from_list (ZEND_TYPE_LIST (* type ), Z_OBJCE_P (arg ));
11781152 } else {
11791153 const zend_type * list_type ;
11801154 ZEND_TYPE_LIST_FOREACH (ZEND_TYPE_LIST (* type ), list_type ) {
11811155 if (ZEND_TYPE_IS_INTERSECTION (* list_type )) {
1182- if (zend_check_intersection_type_from_cache_slot (ZEND_TYPE_LIST (* list_type ), Z_OBJCE_P (arg ), & cache_slot )) {
1156+ if (zend_check_intersection_type_from_list (ZEND_TYPE_LIST (* list_type ), Z_OBJCE_P (arg ))) {
11831157 return true;
11841158 }
1185- /* The cache_slot is progressed in zend_check_intersection_type_from_cache_slot() */
11861159 } else {
11871160 ZEND_ASSERT (!ZEND_TYPE_HAS_LIST (* list_type ));
1188- ce = zend_fetch_ce_from_cache_slot ( cache_slot , list_type );
1161+ ce = zend_fetch_ce_from_type ( list_type );
11891162 /* Instance of a single type part of a union is sufficient to pass the type check */
11901163 if (ce && instanceof_function (Z_OBJCE_P (arg ), ce )) {
11911164 return true;
11921165 }
1193- PROGRESS_CACHE_SLOT ();
11941166 }
11951167 } ZEND_TYPE_LIST_FOREACH_END ();
11961168 }
11971169 } else {
1198- ce = zend_fetch_ce_from_cache_slot ( cache_slot , type );
1170+ ce = zend_fetch_ce_from_type ( type );
11991171 /* If we have a CE we check if it satisfies the type constraint,
12001172 * otherwise it will check if a standard type satisfies it. */
12011173 if (ce && instanceof_function (Z_OBJCE_P (arg ), ce )) {
@@ -1232,7 +1204,7 @@ static zend_always_inline bool zend_check_type_slow(
12321204}
12331205
12341206static zend_always_inline bool zend_check_type (
1235- const zend_type * type , zval * arg , void * * cache_slot , zend_class_entry * scope ,
1207+ const zend_type * type , zval * arg , zend_class_entry * scope ,
12361208 bool is_return_type , bool is_internal )
12371209{
12381210 const zend_reference * ref = NULL ;
@@ -1247,25 +1219,25 @@ static zend_always_inline bool zend_check_type(
12471219 return 1 ;
12481220 }
12491221
1250- return zend_check_type_slow (type , arg , ref , cache_slot , is_return_type , is_internal );
1222+ return zend_check_type_slow (type , arg , ref , is_return_type , is_internal );
12511223}
12521224
12531225ZEND_API bool zend_check_user_type_slow (
1254- const zend_type * type , zval * arg , const zend_reference * ref , void * * cache_slot , bool is_return_type )
1226+ const zend_type * type , zval * arg , const zend_reference * ref , bool is_return_type )
12551227{
12561228 return zend_check_type_slow (
1257- type , arg , ref , cache_slot , is_return_type , /* is_internal */ false);
1229+ type , arg , ref , is_return_type , /* is_internal */ false);
12581230}
12591231
1260- static zend_always_inline bool zend_verify_recv_arg_type (const zend_function * zf , uint32_t arg_num , zval * arg , void * * cache_slot )
1232+ static zend_always_inline bool zend_verify_recv_arg_type (const zend_function * zf , uint32_t arg_num , zval * arg )
12611233{
12621234 const zend_arg_info * cur_arg_info ;
12631235
12641236 ZEND_ASSERT (arg_num <= zf -> common .num_args );
12651237 cur_arg_info = & zf -> common .arg_info [arg_num - 1 ];
12661238
12671239 if (ZEND_TYPE_IS_SET (cur_arg_info -> type )
1268- && UNEXPECTED (!zend_check_type (& cur_arg_info -> type , arg , cache_slot , zf -> common .scope , 0 , 0 ))) {
1240+ && UNEXPECTED (!zend_check_type (& cur_arg_info -> type , arg , zf -> common .scope , 0 , 0 ))) {
12691241 zend_verify_arg_error (zf , cur_arg_info , arg_num , arg );
12701242 return 0 ;
12711243 }
@@ -1274,10 +1246,10 @@ static zend_always_inline bool zend_verify_recv_arg_type(const zend_function *zf
12741246}
12751247
12761248static zend_always_inline bool zend_verify_variadic_arg_type (
1277- const zend_function * zf , const zend_arg_info * arg_info , uint32_t arg_num , zval * arg , void * * cache_slot )
1249+ const zend_function * zf , const zend_arg_info * arg_info , uint32_t arg_num , zval * arg )
12781250{
12791251 ZEND_ASSERT (ZEND_TYPE_IS_SET (arg_info -> type ));
1280- if (UNEXPECTED (!zend_check_type (& arg_info -> type , arg , cache_slot , zf -> common .scope , 0 , 0 ))) {
1252+ if (UNEXPECTED (!zend_check_type (& arg_info -> type , arg , zf -> common .scope , 0 , 0 ))) {
12811253 zend_verify_arg_error (zf , arg_info , arg_num , arg );
12821254 return 0 ;
12831255 }
@@ -1302,7 +1274,7 @@ static zend_never_inline ZEND_ATTRIBUTE_UNUSED bool zend_verify_internal_arg_typ
13021274 }
13031275
13041276 if (ZEND_TYPE_IS_SET (cur_arg_info -> type )
1305- && UNEXPECTED (!zend_check_type (& cur_arg_info -> type , arg , /* cache_slot */ NULL , fbc -> common .scope , 0 , /* is_internal */ 1 ))) {
1277+ && UNEXPECTED (!zend_check_type (& cur_arg_info -> type , arg , fbc -> common .scope , 0 , /* is_internal */ 1 ))) {
13061278 return 0 ;
13071279 }
13081280 arg ++ ;
@@ -1508,7 +1480,7 @@ ZEND_API bool zend_verify_internal_return_type(const zend_function *zf, zval *re
15081480 return 1 ;
15091481 }
15101482
1511- if (UNEXPECTED (!zend_check_type (& ret_info -> type , ret , /* cache_slot */ NULL , NULL , 1 , /* is_internal */ 1 ))) {
1483+ if (UNEXPECTED (!zend_check_type (& ret_info -> type , ret , NULL , 1 , /* is_internal */ 1 ))) {
15121484 zend_verify_internal_return_error (zf , ret );
15131485 return 0 ;
15141486 }
0 commit comments