Skip to content

Commit 9806445

Browse files
committed
wip
1 parent 00affe4 commit 9806445

File tree

13 files changed

+244
-143
lines changed

13 files changed

+244
-143
lines changed

Zend/zend_API.c

+97-73
Original file line numberDiff line numberDiff line change
@@ -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

793811
ZEND_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

Comments
 (0)