Skip to content

Commit 12ad48c

Browse files
committed
wip
1 parent c919ab4 commit 12ad48c

File tree

13 files changed

+235
-151
lines changed

13 files changed

+235
-151
lines changed

Zend/zend_API.c

Lines changed: 90 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -523,71 +523,70 @@ 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
{
528528
if (EXPECTED(Z_TYPE_P(arg) <= IS_STRING)) {
529529
if (UNEXPECTED(Z_TYPE_P(arg) == IS_NULL) && !zend_null_arg_deprecated("bool", arg_num)) {
530-
return 0;
530+
return (zend_opt_bool){false, false};
531531
}
532-
*dest = zend_is_true(arg);
532+
return (zend_opt_bool){zend_is_true(arg), true};
533533
} else {
534-
return 0;
534+
return (zend_opt_bool){false, false};
535535
}
536-
return 1;
537536
}
538537
/* }}} */
539538

540-
ZEND_API bool ZEND_FASTCALL zend_parse_arg_bool_slow(const zval *arg, bool *dest, uint32_t arg_num) /* {{{ */
539+
ZEND_API zend_opt_bool ZEND_FASTCALL zend_parse_arg_bool_slow(const zval *arg, uint32_t arg_num) /* {{{ */
541540
{
542541
if (UNEXPECTED(ZEND_ARG_USES_STRICT_TYPES())) {
543-
return 0;
542+
return (zend_opt_bool){false, false};
544543
}
545-
return zend_parse_arg_bool_weak(arg, dest, arg_num);
544+
return zend_parse_arg_bool_weak(arg, arg_num);
546545
}
547546
/* }}} */
548547

549-
ZEND_API bool ZEND_FASTCALL zend_flf_parse_arg_bool_slow(const zval *arg, bool *dest, uint32_t arg_num)
548+
ZEND_API zend_opt_bool ZEND_FASTCALL zend_flf_parse_arg_bool_slow(const zval *arg, uint32_t arg_num)
550549
{
551550
if (UNEXPECTED(ZEND_FLF_ARG_USES_STRICT_TYPES())) {
552-
return 0;
551+
return (zend_opt_bool){false, false};
553552
}
554-
return zend_parse_arg_bool_weak(arg, dest, arg_num);
553+
return zend_parse_arg_bool_weak(arg, arg_num);
555554
}
556555

557-
ZEND_API bool ZEND_FASTCALL zend_parse_arg_long_weak(const zval *arg, zend_long *dest, uint32_t arg_num) /* {{{ */
556+
ZEND_API zend_opt_long ZEND_FASTCALL zend_parse_arg_long_weak(const zval *arg, uint32_t arg_num) /* {{{ */
558557
{
559558
if (EXPECTED(Z_TYPE_P(arg) == IS_DOUBLE)) {
560559
if (UNEXPECTED(zend_isnan(Z_DVAL_P(arg)))) {
561-
return 0;
560+
goto fail;
562561
}
563562
if (UNEXPECTED(!ZEND_DOUBLE_FITS_LONG(Z_DVAL_P(arg)))) {
564-
return 0;
563+
goto fail;
565564
} else {
566565
zend_long lval = zend_dval_to_lval(Z_DVAL_P(arg));
567566
if (UNEXPECTED(!zend_is_long_compatible(Z_DVAL_P(arg), lval))) {
568567
/* Check arg_num is not (uint32_t)-1, as otherwise its called by
569568
* zend_verify_weak_scalar_type_hint_no_sideeffect() */
570569
if (arg_num != (uint32_t)-1) {
571570
zend_incompatible_double_to_long_error(Z_DVAL_P(arg));
572-
}
573-
if (UNEXPECTED(EG(exception))) {
574-
return 0;
571+
if (UNEXPECTED(EG(exception))) {
572+
goto fail;
573+
}
575574
}
576575
}
577-
*dest = lval;
576+
return (zend_opt_long){lval, true};
578577
}
579578
} else if (EXPECTED(Z_TYPE_P(arg) == IS_STRING)) {
580579
double d;
581580
uint8_t type;
581+
zend_long lval;
582582

583-
if (UNEXPECTED((type = is_numeric_str_function(Z_STR_P(arg), dest, &d)) != IS_LONG)) {
583+
if (UNEXPECTED((type = is_numeric_str_function(Z_STR_P(arg), &lval, &d)) != IS_LONG)) {
584584
if (EXPECTED(type != 0)) {
585-
zend_long lval;
586585
if (UNEXPECTED(zend_isnan(d))) {
587-
return 0;
586+
goto fail;
588587
}
589588
if (UNEXPECTED(!ZEND_DOUBLE_FITS_LONG(d))) {
590-
return 0;
589+
goto fail;
591590
}
592591

593592
lval = zend_dval_to_lval(d);
@@ -597,95 +596,101 @@ ZEND_API bool ZEND_FASTCALL zend_parse_arg_long_weak(const zval *arg, zend_long
597596
* zend_verify_weak_scalar_type_hint_no_sideeffect() */
598597
if (arg_num != (uint32_t)-1) {
599598
zend_incompatible_string_to_long_error(Z_STR_P(arg));
600-
}
601-
if (UNEXPECTED(EG(exception))) {
602-
return 0;
599+
if (UNEXPECTED(EG(exception))) {
600+
goto fail;
601+
}
603602
}
604603
}
605-
*dest = lval;
606604
} else {
607-
return 0;
605+
goto fail;
608606
}
609607
}
610-
if (UNEXPECTED(EG(exception))) {
611-
return 0;
612-
}
608+
return (zend_opt_long){lval, true};
613609
} else if (EXPECTED(Z_TYPE_P(arg) < IS_TRUE)) {
614610
if (UNEXPECTED(Z_TYPE_P(arg) == IS_NULL) && !zend_null_arg_deprecated("int", arg_num)) {
615-
return 0;
611+
goto fail;
616612
}
617-
*dest = 0;
613+
return (zend_opt_long){0, true};
618614
} else if (EXPECTED(Z_TYPE_P(arg) == IS_TRUE)) {
619-
*dest = 1;
620-
} else {
621-
return 0;
615+
return (zend_opt_long){1, true};
622616
}
623-
return 1;
617+
618+
fail:;
619+
zend_opt_long result;
620+
result.has_value = false;
621+
return result;
624622
}
625623
/* }}} */
626624

627-
ZEND_API bool ZEND_FASTCALL zend_parse_arg_long_slow(const zval *arg, zend_long *dest, uint32_t arg_num) /* {{{ */
625+
ZEND_API zend_opt_long ZEND_FASTCALL zend_parse_arg_long_slow(const zval *arg, uint32_t arg_num) /* {{{ */
628626
{
629627
if (UNEXPECTED(ZEND_ARG_USES_STRICT_TYPES())) {
630-
return 0;
628+
zend_opt_long result;
629+
result.has_value = false;
630+
return result;
631631
}
632-
return zend_parse_arg_long_weak(arg, dest, arg_num);
632+
return zend_parse_arg_long_weak(arg, arg_num);
633633
}
634634
/* }}} */
635635

636-
ZEND_API bool ZEND_FASTCALL zend_flf_parse_arg_long_slow(const zval *arg, zend_long *dest, uint32_t arg_num)
636+
ZEND_API zend_opt_long ZEND_FASTCALL zend_flf_parse_arg_long_slow(const zval *arg, uint32_t arg_num)
637637
{
638638
if (UNEXPECTED(ZEND_FLF_ARG_USES_STRICT_TYPES())) {
639-
return 0;
639+
zend_opt_long result;
640+
result.has_value = false;
641+
return result;
640642
}
641-
return zend_parse_arg_long_weak(arg, dest, arg_num);
643+
return zend_parse_arg_long_weak(arg, arg_num);
642644
}
643645

644-
ZEND_API bool ZEND_FASTCALL zend_parse_arg_double_weak(const zval *arg, double *dest, uint32_t arg_num) /* {{{ */
646+
ZEND_API zend_opt_double ZEND_FASTCALL zend_parse_arg_double_weak(const zval *arg, uint32_t arg_num) /* {{{ */
645647
{
646648
if (EXPECTED(Z_TYPE_P(arg) == IS_LONG)) {
647-
*dest = (double)Z_LVAL_P(arg);
649+
return (zend_opt_double){(double)Z_LVAL_P(arg), true};
648650
} else if (EXPECTED(Z_TYPE_P(arg) == IS_STRING)) {
649651
zend_long l;
650652
uint8_t type;
653+
double d;
651654

652-
if (UNEXPECTED((type = is_numeric_str_function(Z_STR_P(arg), &l, dest)) != IS_DOUBLE)) {
655+
if (UNEXPECTED((type = is_numeric_str_function(Z_STR_P(arg), &l, &d)) != IS_DOUBLE)) {
653656
if (EXPECTED(type != 0)) {
654-
*dest = (double)(l);
655-
} else {
656-
return 0;
657+
return (zend_opt_double){(double)l, true};
657658
}
658-
}
659-
if (UNEXPECTED(EG(exception))) {
660-
return 0;
659+
goto fail;
660+
} else {
661+
return (zend_opt_double){d, true};
661662
}
662663
} else if (EXPECTED(Z_TYPE_P(arg) < IS_TRUE)) {
663664
if (UNEXPECTED(Z_TYPE_P(arg) == IS_NULL) && !zend_null_arg_deprecated("float", arg_num)) {
664-
return 0;
665+
goto fail;
665666
}
666-
*dest = 0.0;
667+
return (zend_opt_double){0.0, true};
667668
} else if (EXPECTED(Z_TYPE_P(arg) == IS_TRUE)) {
668-
*dest = 1.0;
669-
} else {
670-
return 0;
669+
return (zend_opt_double){1.0, true};
671670
}
672-
return 1;
671+
672+
fail:;
673+
zend_opt_double result;
674+
result.has_value = false;
675+
return result;
673676
}
674677
/* }}} */
675678

676-
ZEND_API bool ZEND_FASTCALL zend_parse_arg_double_slow(const zval *arg, double *dest, uint32_t arg_num) /* {{{ */
679+
ZEND_API zend_opt_double ZEND_FASTCALL zend_parse_arg_double_slow(const zval *arg, uint32_t arg_num) /* {{{ */
677680
{
678681
if (EXPECTED(Z_TYPE_P(arg) == IS_LONG)) {
679682
/* SSTH Exception: IS_LONG may be accepted instead as IS_DOUBLE */
680-
*dest = (double)Z_LVAL_P(arg);
683+
return (zend_opt_double){(double)Z_LVAL_P(arg), true};
681684
} else if (UNEXPECTED(ZEND_ARG_USES_STRICT_TYPES())) {
682-
return 0;
685+
zend_opt_double result;
686+
result.has_value = false;
687+
return result;
683688
}
684-
return zend_parse_arg_double_weak(arg, dest, arg_num);
689+
return zend_parse_arg_double_weak(arg, arg_num);
685690
}
686691
/* }}} */
687692

688-
ZEND_API bool ZEND_FASTCALL zend_parse_arg_number_slow(zval *arg, zval **dest, uint32_t arg_num) /* {{{ */
693+
ZEND_API bool ZEND_FASTCALL zend_parse_arg_number_slow(zval *arg, uint32_t arg_num) /* {{{ */
689694
{
690695
if (UNEXPECTED(ZEND_ARG_USES_STRICT_TYPES())) {
691696
return 0;
@@ -713,13 +718,12 @@ ZEND_API bool ZEND_FASTCALL zend_parse_arg_number_slow(zval *arg, zval **dest, u
713718
} else {
714719
return 0;
715720
}
716-
*dest = arg;
717721
return 1;
718722
}
719723
/* }}} */
720724

721725

722-
ZEND_API bool ZEND_FASTCALL zend_parse_arg_number_or_str_slow(zval *arg, zval **dest, uint32_t arg_num) /* {{{ */
726+
ZEND_API bool ZEND_FASTCALL zend_parse_arg_number_or_str_slow(zval *arg, uint32_t arg_num) /* {{{ */
723727
{
724728
if (UNEXPECTED(ZEND_ARG_USES_STRICT_TYPES())) {
725729
return false;
@@ -737,72 +741,74 @@ ZEND_API bool ZEND_FASTCALL zend_parse_arg_number_or_str_slow(zval *arg, zval **
737741
if (zobj->handlers->cast_object(zobj, &obj, IS_STRING) == SUCCESS) {
738742
OBJ_RELEASE(zobj);
739743
ZVAL_COPY_VALUE(arg, &obj);
740-
*dest = arg;
741744
return true;
742745
}
743746
return false;
744747
} else {
745748
return false;
746749
}
747-
*dest = arg;
748750
return true;
749751
}
750752

751-
ZEND_API bool ZEND_FASTCALL zend_parse_arg_str_weak(zval *arg, zend_string **dest, uint32_t arg_num) /* {{{ */
753+
ZEND_API zend_string * ZEND_FASTCALL zend_parse_arg_str_weak(zval *arg, uint32_t arg_num) /* {{{ */
752754
{
753755
if (EXPECTED(Z_TYPE_P(arg) < IS_STRING)) {
754756
if (UNEXPECTED(Z_TYPE_P(arg) == IS_NULL) && !zend_null_arg_deprecated("string", arg_num)) {
755-
return 0;
757+
return NULL;
756758
}
757759
convert_to_string(arg);
758-
*dest = Z_STR_P(arg);
760+
return Z_STR_P(arg);
759761
} else if (UNEXPECTED(Z_TYPE_P(arg) == IS_OBJECT)) {
760762
zend_object *zobj = Z_OBJ_P(arg);
761763
zval obj;
762764
if (zobj->handlers->cast_object(zobj, &obj, IS_STRING) == SUCCESS) {
763765
OBJ_RELEASE(zobj);
764766
ZVAL_COPY_VALUE(arg, &obj);
765-
*dest = Z_STR_P(arg);
766-
return 1;
767+
return Z_STR_P(arg);
767768
}
768-
return 0;
769+
return NULL;
769770
} else {
770-
return 0;
771+
return NULL;
771772
}
772-
return 1;
773773
}
774774
/* }}} */
775775

776-
ZEND_API bool ZEND_FASTCALL zend_parse_arg_str_slow(zval *arg, zend_string **dest, uint32_t arg_num) /* {{{ */
776+
ZEND_API zend_string * ZEND_FASTCALL zend_parse_arg_str_slow(zval *arg, uint32_t arg_num) /* {{{ */
777777
{
778778
if (UNEXPECTED(ZEND_ARG_USES_STRICT_TYPES())) {
779-
return 0;
779+
return NULL;
780780
}
781-
return zend_parse_arg_str_weak(arg, dest, arg_num);
781+
return zend_parse_arg_str_weak(arg, arg_num);
782782
}
783783
/* }}} */
784784

785-
ZEND_API bool ZEND_FASTCALL zend_flf_parse_arg_str_slow(zval *arg, zend_string **dest, uint32_t arg_num)
785+
ZEND_API zend_string * ZEND_FASTCALL zend_flf_parse_arg_str_slow(zval *arg, uint32_t arg_num)
786786
{
787787
if (UNEXPECTED(ZEND_FLF_ARG_USES_STRICT_TYPES())) {
788788
return 0;
789789
}
790-
return zend_parse_arg_str_weak(arg, dest, arg_num);
790+
return zend_parse_arg_str_weak(arg, arg_num);
791791
}
792792

793793
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) /* {{{ */
794794
{
795795
if (UNEXPECTED(ZEND_ARG_USES_STRICT_TYPES())) {
796796
return 0;
797797
}
798-
if (zend_parse_arg_long_weak(arg, dest_long, arg_num)) {
798+
zend_opt_long result = zend_parse_arg_long_weak(arg, arg_num);
799+
if (result.has_value) {
800+
*dest_long = result.value;
799801
*dest_str = NULL;
800802
return 1;
801-
} else if (zend_parse_arg_str_weak(arg, dest_str, arg_num)) {
802-
*dest_long = 0;
803-
return 1;
804803
} else {
805-
return 0;
804+
zend_string *str = zend_parse_arg_str_weak(arg, arg_num);
805+
if (str) {
806+
*dest_long = 0;
807+
*dest_str = str;
808+
return 1;
809+
} else {
810+
return 0;
811+
}
806812
}
807813
}
808814
/* }}} */

0 commit comments

Comments
 (0)