@@ -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