@@ -523,45 +523,55 @@ static ZEND_COLD bool zend_null_arg_deprecated(const char *fallback_type, uint32
523523	return  !EG (exception );
524524}
525525
526- ZEND_API  bool  ZEND_FASTCALL  zend_parse_arg_bool_weak (const  zval  * arg ,  bool   * dest , uint32_t  arg_num ) /* {{{ */ 
526+ ZEND_API  zend_opt_bool  ZEND_FASTCALL  zend_parse_arg_bool_weak (const  zval  * arg , uint32_t  arg_num ) /* {{{ */ 
527527{
528+ 	zend_opt_bool  result ;
528529	if  (EXPECTED (Z_TYPE_P (arg ) <= IS_STRING )) {
529530		if  (UNEXPECTED (Z_TYPE_P (arg ) ==  IS_NULL ) &&  !zend_null_arg_deprecated ("bool" , arg_num )) {
530- 			return  0 ;
531+ 			result .has_value  =  false;
532+ 			return  result ;
531533		}
532- 		* dest  =  zend_is_true (arg );
534+ 		result .value  =  zend_is_true (arg );
535+ 		result .has_value  =  true;
533536	} else  {
534- 		return   0 ;
537+ 		result . has_value   =  false ;
535538	}
536- 	return  1 ;
539+ 	return  result ;
537540}
538541/* }}} */ 
539542
540- ZEND_API  bool  ZEND_FASTCALL  zend_parse_arg_bool_slow (const  zval  * arg ,  bool   * dest , uint32_t  arg_num ) /* {{{ */ 
543+ ZEND_API  zend_opt_bool  ZEND_FASTCALL  zend_parse_arg_bool_slow (const  zval  * arg , uint32_t  arg_num ) /* {{{ */ 
541544{
542545	if  (UNEXPECTED (ZEND_ARG_USES_STRICT_TYPES ())) {
543- 		return  0 ;
546+ 		zend_opt_bool  result ;
547+ 		result .has_value  =  false;
548+ 		return  result ;
544549	}
545- 	return  zend_parse_arg_bool_weak (arg , dest ,  arg_num );
550+ 	return  zend_parse_arg_bool_weak (arg , arg_num );
546551}
547552/* }}} */ 
548553
549- ZEND_API  bool  ZEND_FASTCALL  zend_flf_parse_arg_bool_slow (const  zval  * arg ,  bool   * dest , uint32_t  arg_num )
554+ ZEND_API  zend_opt_bool  ZEND_FASTCALL  zend_flf_parse_arg_bool_slow (const  zval  * arg , uint32_t  arg_num )
550555{
551556	if  (UNEXPECTED (ZEND_FLF_ARG_USES_STRICT_TYPES ())) {
552- 		return  0 ;
557+ 		zend_opt_bool  result ;
558+ 		result .has_value  =  false;
559+ 		return  result ;
553560	}
554- 	return  zend_parse_arg_bool_weak (arg , dest ,  arg_num );
561+ 	return  zend_parse_arg_bool_weak (arg , arg_num );
555562}
556563
557- ZEND_API  bool  ZEND_FASTCALL  zend_parse_arg_long_weak (const  zval  * arg ,  zend_long   * dest , uint32_t  arg_num ) /* {{{ */ 
564+ ZEND_API  zend_opt_long  ZEND_FASTCALL  zend_parse_arg_long_weak (const  zval  * arg , uint32_t  arg_num ) /* {{{ */ 
558565{
566+ 	zend_opt_long  result ;
567+ 	result .has_value  =  false;
568+ 
559569	if  (EXPECTED (Z_TYPE_P (arg ) ==  IS_DOUBLE )) {
560570		if  (UNEXPECTED (zend_isnan (Z_DVAL_P (arg )))) {
561- 			return  0 ;
571+ 			return  result ;
562572		}
563573		if  (UNEXPECTED (!ZEND_DOUBLE_FITS_LONG (Z_DVAL_P (arg )))) {
564- 			return  0 ;
574+ 			return  result ;
565575		} else  {
566576			zend_long  lval  =  zend_dval_to_lval (Z_DVAL_P (arg ));
567577			if  (UNEXPECTED (!zend_is_long_compatible (Z_DVAL_P (arg ), lval ))) {
@@ -571,23 +581,23 @@ ZEND_API bool ZEND_FASTCALL zend_parse_arg_long_weak(const zval *arg, zend_long
571581					zend_incompatible_double_to_long_error (Z_DVAL_P (arg ));
572582				}
573583				if  (UNEXPECTED (EG (exception ))) {
574- 					return  0 ;
584+ 					return  result ;
575585				}
576586			}
577- 			* dest  =  lval ;
587+ 			result . value  =  lval ;
578588		}
579589	} else  if  (EXPECTED (Z_TYPE_P (arg ) ==  IS_STRING )) {
580590		double  d ;
581591		uint8_t  type ;
582592
583- 		if  (UNEXPECTED ((type  =  is_numeric_str_function (Z_STR_P (arg ), dest , & d )) !=  IS_LONG )) {
593+ 		if  (UNEXPECTED ((type  =  is_numeric_str_function (Z_STR_P (arg ), & result . value , & d )) !=  IS_LONG )) {
584594			if  (EXPECTED (type  !=  0 )) {
585595				zend_long  lval ;
586596				if  (UNEXPECTED (zend_isnan (d ))) {
587- 					return  0 ;
597+ 					return  result ;
588598				}
589599				if  (UNEXPECTED (!ZEND_DOUBLE_FITS_LONG (d ))) {
590- 					return  0 ;
600+ 					return  result ;
591601				}
592602
593603				lval  =  zend_dval_to_lval (d );
@@ -599,93 +609,106 @@ ZEND_API bool ZEND_FASTCALL zend_parse_arg_long_weak(const zval *arg, zend_long
599609						zend_incompatible_string_to_long_error (Z_STR_P (arg ));
600610					}
601611					if  (UNEXPECTED (EG (exception ))) {
602- 						return  0 ;
612+ 						return  result ;
603613					}
604614				}
605- 				* dest  =  lval ;
615+ 				result . value  =  lval ;
606616			} else  {
607- 				return  0 ;
617+ 				return  result ;
608618			}
609619		}
610620		if  (UNEXPECTED (EG (exception ))) {
611- 			return  0 ;
621+ 			return  result ;
612622		}
613623	} else  if  (EXPECTED (Z_TYPE_P (arg ) <  IS_TRUE )) {
614624		if  (UNEXPECTED (Z_TYPE_P (arg ) ==  IS_NULL ) &&  !zend_null_arg_deprecated ("int" , arg_num )) {
615- 			return  0 ;
625+ 			return  result ;
616626		}
617- 		* dest  =  0 ;
627+ 		result . value  =  0 ;
618628	} else  if  (EXPECTED (Z_TYPE_P (arg ) ==  IS_TRUE )) {
619- 		* dest  =  1 ;
629+ 		result . value  =  1 ;
620630	} else  {
621- 		return  0 ;
631+ 		return  result ;
622632	}
623- 	return  1 ;
633+ 	result .has_value  =  true;
634+ 	return  result ;
624635}
625636/* }}} */ 
626637
627- ZEND_API  bool  ZEND_FASTCALL  zend_parse_arg_long_slow (const  zval  * arg ,  zend_long   * dest , uint32_t  arg_num ) /* {{{ */ 
638+ ZEND_API  zend_opt_long  ZEND_FASTCALL  zend_parse_arg_long_slow (const  zval  * arg , uint32_t  arg_num ) /* {{{ */ 
628639{
629640	if  (UNEXPECTED (ZEND_ARG_USES_STRICT_TYPES ())) {
630- 		return  0 ;
641+ 		zend_opt_long  result ;
642+ 		result .has_value  =  false;
643+ 		return  result ;
631644	}
632- 	return  zend_parse_arg_long_weak (arg , dest ,  arg_num );
645+ 	return  zend_parse_arg_long_weak (arg , arg_num );
633646}
634647/* }}} */ 
635648
636- ZEND_API  bool  ZEND_FASTCALL  zend_flf_parse_arg_long_slow (const  zval  * arg ,  zend_long   * dest , uint32_t  arg_num )
649+ ZEND_API  zend_opt_long  ZEND_FASTCALL  zend_flf_parse_arg_long_slow (const  zval  * arg , uint32_t  arg_num )
637650{
638651	if  (UNEXPECTED (ZEND_FLF_ARG_USES_STRICT_TYPES ())) {
639- 		return  0 ;
652+ 		zend_opt_long  result ;
653+ 		result .has_value  =  false;
654+ 		return  result ;
640655	}
641- 	return  zend_parse_arg_long_weak (arg , dest ,  arg_num );
656+ 	return  zend_parse_arg_long_weak (arg , arg_num );
642657}
643658
644- ZEND_API  bool  ZEND_FASTCALL  zend_parse_arg_double_weak (const  zval  * arg ,  double   * dest , uint32_t  arg_num ) /* {{{ */ 
659+ ZEND_API  zend_opt_double  ZEND_FASTCALL  zend_parse_arg_double_weak (const  zval  * arg , uint32_t  arg_num ) /* {{{ */ 
645660{
661+ 	zend_opt_double  result ;
662+ 	result .has_value  =  false;
646663	if  (EXPECTED (Z_TYPE_P (arg ) ==  IS_LONG )) {
647- 		* dest  =  (double )Z_LVAL_P (arg );
664+ 		result . value  =  (double )Z_LVAL_P (arg );
648665	} else  if  (EXPECTED (Z_TYPE_P (arg ) ==  IS_STRING )) {
649666		zend_long  l ;
650667		uint8_t  type ;
651668
652- 		if  (UNEXPECTED ((type  =  is_numeric_str_function (Z_STR_P (arg ), & l , dest )) !=  IS_DOUBLE )) {
669+ 		if  (UNEXPECTED ((type  =  is_numeric_str_function (Z_STR_P (arg ), & l , & result . value )) !=  IS_DOUBLE )) {
653670			if  (EXPECTED (type  !=  0 )) {
654- 				* dest  =  (double )(l );
655- 			} else  {
656- 				return  0 ;
671+ 				result .value  =  (double )(l );
672+ 				result .has_value  =  true;
657673			}
674+ 			return  result ;
658675		}
659676		if  (UNEXPECTED (EG (exception ))) {
660- 			return  0 ;
677+ 			return  result ;
661678		}
662679	} else  if  (EXPECTED (Z_TYPE_P (arg ) <  IS_TRUE )) {
663680		if  (UNEXPECTED (Z_TYPE_P (arg ) ==  IS_NULL ) &&  !zend_null_arg_deprecated ("float" , arg_num )) {
664- 			return  0 ;
681+ 			return  result ;
665682		}
666- 		* dest  =  0.0 ;
683+ 		result . value  =  0.0 ;
667684	} else  if  (EXPECTED (Z_TYPE_P (arg ) ==  IS_TRUE )) {
668- 		* dest  =  1.0 ;
685+ 		result . value  =  1.0 ;
669686	} else  {
670- 		return  0 ;
687+ 		return  result ;
671688	}
672- 	return  1 ;
689+ 	result .has_value  =  true;
690+ 	return  result ;
673691}
674692/* }}} */ 
675693
676- ZEND_API  bool  ZEND_FASTCALL  zend_parse_arg_double_slow (const  zval  * arg ,  double   * dest , uint32_t  arg_num ) /* {{{ */ 
694+ ZEND_API  zend_opt_double  ZEND_FASTCALL  zend_parse_arg_double_slow (const  zval  * arg , uint32_t  arg_num ) /* {{{ */ 
677695{
678696	if  (EXPECTED (Z_TYPE_P (arg ) ==  IS_LONG )) {
679697		/* SSTH Exception: IS_LONG may be accepted instead as IS_DOUBLE */ 
680- 		* dest  =  (double )Z_LVAL_P (arg );
698+ 		zend_opt_double  result ;
699+ 		result .has_value  =  true;
700+ 		result .value  =  (double )Z_LVAL_P (arg );
701+ 		return  result ;
681702	} else  if  (UNEXPECTED (ZEND_ARG_USES_STRICT_TYPES ())) {
682- 		return  0 ;
703+ 		zend_opt_double  result ;
704+ 		result .has_value  =  false;
705+ 		return  result ;
683706	}
684- 	return  zend_parse_arg_double_weak (arg , dest ,  arg_num );
707+ 	return  zend_parse_arg_double_weak (arg , arg_num );
685708}
686709/* }}} */ 
687710
688- ZEND_API  bool  ZEND_FASTCALL  zend_parse_arg_number_slow (zval  * arg , zval   * * dest ,  uint32_t  arg_num ) /* {{{ */ 
711+ ZEND_API  bool  ZEND_FASTCALL  zend_parse_arg_number_slow (zval  * arg , uint32_t  arg_num ) /* {{{ */ 
689712{
690713	if  (UNEXPECTED (ZEND_ARG_USES_STRICT_TYPES ())) {
691714		return  0 ;
@@ -713,13 +736,12 @@ ZEND_API bool ZEND_FASTCALL zend_parse_arg_number_slow(zval *arg, zval **dest, u
713736	} else  {
714737		return  0 ;
715738	}
716- 	* dest  =  arg ;
717739	return  1 ;
718740}
719741/* }}} */ 
720742
721743
722- ZEND_API  bool  ZEND_FASTCALL  zend_parse_arg_number_or_str_slow (zval  * arg , zval   * * dest ,  uint32_t  arg_num ) /* {{{ */ 
744+ ZEND_API  bool  ZEND_FASTCALL  zend_parse_arg_number_or_str_slow (zval  * arg , uint32_t  arg_num ) /* {{{ */ 
723745{
724746	if  (UNEXPECTED (ZEND_ARG_USES_STRICT_TYPES ())) {
725747		return  false;
@@ -737,72 +759,74 @@ ZEND_API bool ZEND_FASTCALL zend_parse_arg_number_or_str_slow(zval *arg, zval **
737759		if  (zobj -> handlers -> cast_object (zobj , & obj , IS_STRING ) ==  SUCCESS ) {
738760			OBJ_RELEASE (zobj );
739761			ZVAL_COPY_VALUE (arg , & obj );
740- 			* dest  =  arg ;
741762			return  true;
742763		}
743764		return  false;
744765	} else  {
745766		return  false;
746767	}
747- 	* dest  =  arg ;
748768	return  true;
749769}
750770
751- ZEND_API  bool   ZEND_FASTCALL  zend_parse_arg_str_weak (zval  * arg ,  zend_string   * * dest , uint32_t  arg_num ) /* {{{ */ 
771+ ZEND_API  zend_string   *   ZEND_FASTCALL  zend_parse_arg_str_weak (zval  * arg , uint32_t  arg_num ) /* {{{ */ 
752772{
753773	if  (EXPECTED (Z_TYPE_P (arg ) <  IS_STRING )) {
754774		if  (UNEXPECTED (Z_TYPE_P (arg ) ==  IS_NULL ) &&  !zend_null_arg_deprecated ("string" , arg_num )) {
755- 			return  0 ;
775+ 			return  NULL ;
756776		}
757777		convert_to_string (arg );
758- 		* dest   =  Z_STR_P (arg );
778+ 		return  Z_STR_P (arg );
759779	} else  if  (UNEXPECTED (Z_TYPE_P (arg ) ==  IS_OBJECT )) {
760780		zend_object  * zobj  =  Z_OBJ_P (arg );
761781		zval  obj ;
762782		if  (zobj -> handlers -> cast_object (zobj , & obj , IS_STRING ) ==  SUCCESS ) {
763783			OBJ_RELEASE (zobj );
764784			ZVAL_COPY_VALUE (arg , & obj );
765- 			* dest  =  Z_STR_P (arg );
766- 			return  1 ;
785+ 			return  Z_STR_P (arg );
767786		}
768- 		return  0 ;
787+ 		return  NULL ;
769788	} else  {
770- 		return  0 ;
789+ 		return  NULL ;
771790	}
772- 	return  1 ;
773791}
774792/* }}} */ 
775793
776- ZEND_API  bool   ZEND_FASTCALL  zend_parse_arg_str_slow (zval  * arg ,  zend_string   * * dest , uint32_t  arg_num ) /* {{{ */ 
794+ ZEND_API  zend_string   *   ZEND_FASTCALL  zend_parse_arg_str_slow (zval  * arg , uint32_t  arg_num ) /* {{{ */ 
777795{
778796	if  (UNEXPECTED (ZEND_ARG_USES_STRICT_TYPES ())) {
779- 		return  0 ;
797+ 		return  NULL ;
780798	}
781- 	return  zend_parse_arg_str_weak (arg , dest ,  arg_num );
799+ 	return  zend_parse_arg_str_weak (arg , arg_num );
782800}
783801/* }}} */ 
784802
785- ZEND_API  bool   ZEND_FASTCALL  zend_flf_parse_arg_str_slow (zval  * arg ,  zend_string   * * dest , uint32_t  arg_num )
803+ ZEND_API  zend_string   *   ZEND_FASTCALL  zend_flf_parse_arg_str_slow (zval  * arg , uint32_t  arg_num )
786804{
787805	if  (UNEXPECTED (ZEND_FLF_ARG_USES_STRICT_TYPES ())) {
788806		return  0 ;
789807	}
790- 	return  zend_parse_arg_str_weak (arg , dest ,  arg_num );
808+ 	return  zend_parse_arg_str_weak (arg , arg_num );
791809}
792810
793811ZEND_API  bool  ZEND_FASTCALL  zend_parse_arg_str_or_long_slow (zval  * arg , zend_string  * * dest_str , zend_long  * dest_long , uint32_t  arg_num ) /* {{{ */ 
794812{
795813	if  (UNEXPECTED (ZEND_ARG_USES_STRICT_TYPES ())) {
796814		return  0 ;
797815	}
798- 	if  (zend_parse_arg_long_weak (arg , dest_long , arg_num )) {
816+ 	zend_opt_long  result  =  zend_parse_arg_long_weak (arg , arg_num );
817+ 	if  (result .has_value ) {
818+ 		* dest_long  =  result .value ;
799819		* dest_str  =  NULL ;
800820		return  1 ;
801- 	} else  if  (zend_parse_arg_str_weak (arg , dest_str , arg_num )) {
802- 		* dest_long  =  0 ;
803- 		return  1 ;
804821	} else  {
805- 		return  0 ;
822+ 		zend_string  * str  =  zend_parse_arg_str_weak (arg , arg_num );
823+ 		if  (str ) {
824+ 			* dest_long  =  0 ;
825+ 			* dest_str  =  str ;
826+ 			return  1 ;
827+ 		} else  {
828+ 			return  0 ;
829+ 		}
806830	}
807831}
808832/* }}} */ 
0 commit comments