@@ -675,9 +675,9 @@ ZEND_API int zend_try_assign_typed_ref_res(zend_reference *ref, zend_resource *r
675
675
ZEND_API int zend_try_assign_typed_ref_zval (zend_reference * ref , zval * zv );
676
676
ZEND_API int zend_try_assign_typed_ref_zval_ex (zend_reference * ref , zval * zv , zend_bool strict );
677
677
678
- #define ZEND_TRY_ASSIGN_NULL (zv ) do { \
678
+ #define _ZEND_TRY_ASSIGN_NULL (zv , is_ref ) do { \
679
679
zval *_zv = zv; \
680
- if (EXPECTED (Z_ISREF_P(_zv))) { \
680
+ if (is_ref || UNEXPECTED (Z_ISREF_P(_zv))) { \
681
681
zend_reference *ref = Z_REF_P(_zv); \
682
682
if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \
683
683
zend_try_assign_typed_ref_null(ref); \
@@ -689,9 +689,17 @@ ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, ze
689
689
ZVAL_NULL(_zv); \
690
690
} while (0)
691
691
692
- #define ZEND_TRY_ASSIGN_FALSE (zv ) do { \
692
+ #define ZEND_TRY_ASSIGN_NULL (zv ) \
693
+ _ZEND_TRY_ASSIGN_NULL(zv, 0)
694
+
695
+ #define ZEND_TRY_ASSIGN_REF_NULL (zv ) do { \
696
+ ZEND_ASSERT(Z_ISREF_P(zv)); \
697
+ _ZEND_TRY_ASSIGN_NULL(zv, 1); \
698
+ } while (0)
699
+
700
+ #define _ZEND_TRY_ASSIGN_FALSE (zv , is_ref ) do { \
693
701
zval *_zv = zv; \
694
- if (EXPECTED (Z_ISREF_P(_zv))) { \
702
+ if (is_ref || UNEXPECTED (Z_ISREF_P(_zv))) { \
695
703
zend_reference *ref = Z_REF_P(_zv); \
696
704
if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \
697
705
zend_try_assign_typed_ref_bool(ref, 0); \
@@ -703,9 +711,17 @@ ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, ze
703
711
ZVAL_FALSE(_zv); \
704
712
} while (0)
705
713
706
- #define ZEND_TRY_ASSIGN_TRUE (zv ) do { \
714
+ #define ZEND_TRY_ASSIGN_FASLE (zv ) \
715
+ _ZEND_TRY_ASSIGN_FALSE(zv, 0)
716
+
717
+ #define ZEND_TRY_ASSIGN_REF_FALSE (zv ) do { \
718
+ ZEND_ASSERT(Z_ISREF_P(zv)); \
719
+ _ZEND_TRY_ASSIGN_FALSE(zv, 1); \
720
+ } while (0)
721
+
722
+ #define _ZEND_TRY_ASSIGN_TRUE (zv , is_ref ) do { \
707
723
zval *_zv = zv; \
708
- if (EXPECTED (Z_ISREF_P(_zv))) { \
724
+ if (is_ref || UNEXPECTED (Z_ISREF_P(_zv))) { \
709
725
zend_reference *ref = Z_REF_P(_zv); \
710
726
if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \
711
727
zend_try_assign_typed_ref_bool(ref, 1); \
@@ -717,9 +733,17 @@ ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, ze
717
733
ZVAL_TRUE(_zv); \
718
734
} while (0)
719
735
720
- #define ZEND_TRY_ASSIGN_BOOL (zv , bval ) do { \
736
+ #define ZEND_TRY_ASSIGN_TRUE (zv ) \
737
+ _ZEND_TRY_ASSIGN_TRUE(zv, 0)
738
+
739
+ #define ZEND_TRY_ASSIGN_REF_TRUE (zv ) do { \
740
+ ZEND_ASSERT(Z_ISREF_P(zv)); \
741
+ _ZEND_TRY_ASSIGN_TRUE(zv, 1); \
742
+ } while (0)
743
+
744
+ #define _ZEND_TRY_ASSIGN_BOOL (zv , bval , is_ref ) do { \
721
745
zval *_zv = zv; \
722
- if (EXPECTED (Z_ISREF_P(_zv))) { \
746
+ if (is_ref || UNEXPECTED (Z_ISREF_P(_zv))) { \
723
747
zend_reference *ref = Z_REF_P(_zv); \
724
748
if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \
725
749
zend_try_assign_typed_ref_bool(ref, 1); \
@@ -731,9 +755,17 @@ ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, ze
731
755
ZVAL_BOOL(_zv, bval); \
732
756
} while (0)
733
757
734
- #define ZEND_TRY_ASSIGN_LONG (zv , lval ) do { \
758
+ #define ZEND_TRY_ASSIGN_BOOL (zv , bval ) \
759
+ _ZEND_TRY_ASSIGN_BOOL(zv, bval, 0)
760
+
761
+ #define ZEND_TRY_ASSIGN_REF_BOOL (zv , bval ) do { \
762
+ ZEND_ASSERT(Z_ISREF_P(zv)); \
763
+ _ZEND_TRY_ASSIGN_BOOL(zv, bval, 1); \
764
+ } while (0)
765
+
766
+ #define _ZEND_TRY_ASSIGN_LONG (zv , lval , is_ref ) do { \
735
767
zval *_zv = zv; \
736
- if (EXPECTED (Z_ISREF_P(_zv))) { \
768
+ if (is_ref || UNEXPECTED (Z_ISREF_P(_zv))) { \
737
769
zend_reference *ref = Z_REF_P(_zv); \
738
770
if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \
739
771
zend_try_assign_typed_ref_long(ref, lval); \
@@ -745,9 +777,17 @@ ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, ze
745
777
ZVAL_LONG(_zv, lval); \
746
778
} while (0)
747
779
748
- #define ZEND_TRY_ASSIGN_DOUBLE (zv , dval ) do { \
780
+ #define ZEND_TRY_ASSIGN_LONG (zv , lval ) \
781
+ _ZEND_TRY_ASSIGN_LONG(zv, lval, 0)
782
+
783
+ #define ZEND_TRY_ASSIGN_REF_LONG (zv , lval ) do { \
784
+ ZEND_ASSERT(Z_ISREF_P(zv)); \
785
+ _ZEND_TRY_ASSIGN_LONG(zv, lval, 1); \
786
+ } while (0)
787
+
788
+ #define _ZEND_TRY_ASSIGN_DOUBLE (zv , dval , is_ref ) do { \
749
789
zval *_zv = zv; \
750
- if (EXPECTED (Z_ISREF_P(_zv))) { \
790
+ if (is_ref || UNEXPECTED (Z_ISREF_P(_zv))) { \
751
791
zend_reference *ref = Z_REF_P(_zv); \
752
792
if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \
753
793
zend_try_assign_typed_ref_double(ref, dval); \
@@ -759,9 +799,17 @@ ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, ze
759
799
ZVAL_DOUBLE(_zv, dval); \
760
800
} while (0)
761
801
762
- #define ZEND_TRY_ASSIGN_EMPTY_STRING (zv ) do { \
802
+ #define ZEND_TRY_ASSIGN_DOUBLE (zv , dval ) \
803
+ _ZEND_TRY_ASSIGN_DOUBLE(zv, dval, 0)
804
+
805
+ #define ZEND_TRY_ASSIGN_REF_DOUBLE (zv , dval ) do { \
806
+ ZEND_ASSERT(Z_ISREF_P(zv)); \
807
+ _ZEND_TRY_ASSIGN_DOUBLE(zv, dval, 1); \
808
+ } while (0)
809
+
810
+ #define _ZEND_TRY_ASSIGN_EMPTY_STRING (zv , is_ref ) do { \
763
811
zval *_zv = zv; \
764
- if (EXPECTED (Z_ISREF_P(_zv))) { \
812
+ if (is_ref || UNEXPECTED (Z_ISREF_P(_zv))) { \
765
813
zend_reference *ref = Z_REF_P(_zv); \
766
814
if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \
767
815
zend_try_assign_typed_ref_empty_string(ref); \
@@ -773,9 +821,17 @@ ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, ze
773
821
ZVAL_EMPTY_STRING(_zv); \
774
822
} while (0)
775
823
776
- #define ZEND_TRY_ASSIGN_STR (zv , str ) do { \
824
+ #define ZEND_TRY_ASSIGN_EMPTY_STRING (zv ) \
825
+ _ZEND_TRY_ASSIGN_EMPTY_STRING(zv, 0)
826
+
827
+ #define ZEND_TRY_ASSIGN_REF_EMPTY_STRING (zv ) do { \
828
+ ZEND_ASSERT(Z_ISREF_P(zv)); \
829
+ _ZEND_TRY_ASSIGN_EMPTY_STRING(zv, 1); \
830
+ } while (0)
831
+
832
+ #define _ZEND_TRY_ASSIGN_STR (zv , str , is_ref ) do { \
777
833
zval *_zv = zv; \
778
- if (EXPECTED (Z_ISREF_P(_zv))) { \
834
+ if (is_ref || UNEXPECTED (Z_ISREF_P(_zv))) { \
779
835
zend_reference *ref = Z_REF_P(_zv); \
780
836
if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \
781
837
zend_try_assign_typed_ref_str(ref, str); \
@@ -787,9 +843,17 @@ ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, ze
787
843
ZVAL_STR(_zv, str); \
788
844
} while (0)
789
845
790
- #define ZEND_TRY_ASSIGN_NEW_STR (zv , str ) do { \
846
+ #define ZEND_TRY_ASSIGN_STR (zv , str ) \
847
+ _ZEND_TRY_ASSIGN_STR(zv, str, 0)
848
+
849
+ #define ZEND_TRY_ASSIGN_REF_STR (zv , str ) do { \
850
+ ZEND_ASSERT(Z_ISREF_P(zv)); \
851
+ _ZEND_TRY_ASSIGN_STR(zv, str, 1); \
852
+ } while (0)
853
+
854
+ #define _ZEND_TRY_ASSIGN_NEW_STR (zv , str , is_str ) do { \
791
855
zval *_zv = zv; \
792
- if (EXPECTED (Z_ISREF_P(_zv))) { \
856
+ if (is_str || UNEXPECTED (Z_ISREF_P(_zv))) { \
793
857
zend_reference *ref = Z_REF_P(_zv); \
794
858
if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \
795
859
zend_try_assign_typed_ref_str(ref, str); \
@@ -801,9 +865,17 @@ ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, ze
801
865
ZVAL_NEW_STR(_zv, str); \
802
866
} while (0)
803
867
804
- #define ZEND_TRY_ASSIGN_STRING (zv , string ) do { \
868
+ #define ZEND_TRY_ASSIGN_NEW_STR (zv , str ) \
869
+ _ZEND_TRY_ASSIGN_NEW_STR(zv, str, 0)
870
+
871
+ #define ZEND_TRY_ASSIGN_REF_NEW_STR (zv , str ) do { \
872
+ ZEND_ASSERT(Z_ISREF_P(zv)); \
873
+ _ZEND_TRY_ASSIGN_NEW_STR(zv, str, 1); \
874
+ } while (0)
875
+
876
+ #define _ZEND_TRY_ASSIGN_STRING (zv , string , is_ref ) do { \
805
877
zval *_zv = zv; \
806
- if (EXPECTED (Z_ISREF_P(_zv))) { \
878
+ if (is_ref || UNEXPECTED (Z_ISREF_P(_zv))) { \
807
879
zend_reference *ref = Z_REF_P(_zv); \
808
880
if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \
809
881
zend_try_assign_typed_ref_string(ref, string); \
@@ -815,9 +887,17 @@ ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, ze
815
887
ZVAL_STRING(_zv, string); \
816
888
} while (0)
817
889
818
- #define ZEND_TRY_ASSIGN_STRINGL (zv , string , len ) do { \
890
+ #define ZEND_TRY_ASSIGN_STRING (zv , string ) \
891
+ _ZEND_TRY_ASSIGN_STRING(zv, string, 0)
892
+
893
+ #define ZEND_TRY_ASSIGN_REF_STRING (zv , string ) do { \
894
+ ZEND_ASSERT(Z_ISREF_P(zv)); \
895
+ _ZEND_TRY_ASSIGN_STRING(zv, string, 1); \
896
+ } while (0)
897
+
898
+ #define _ZEND_TRY_ASSIGN_STRINGL (zv , string , len , is_ref ) do { \
819
899
zval *_zv = zv; \
820
- if (EXPECTED (Z_ISREF_P(_zv))) { \
900
+ if (is_ref || UNEXPECTED (Z_ISREF_P(_zv))) { \
821
901
zend_reference *ref = Z_REF_P(_zv); \
822
902
if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \
823
903
zend_try_assign_typed_ref_stringl(ref, string, len); \
@@ -829,9 +909,17 @@ ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, ze
829
909
ZVAL_STRINGL(_zv, string, len); \
830
910
} while (0)
831
911
832
- #define ZEND_TRY_ASSIGN_ARR (zv , arr ) do { \
912
+ #define ZEND_TRY_ASSIGN_STRINGL (zv , string , len ) \
913
+ _ZEND_TRY_ASSIGN_STRINGL(zv, string, len, 0)
914
+
915
+ #define ZEND_TRY_ASSIGN_REF_STRINGL (zv , string , len ) do { \
916
+ ZEND_ASSERT(Z_ISREF_P(zv)); \
917
+ _ZEND_TRY_ASSIGN_STRINGL(zv, string, len, 1); \
918
+ } while (0)
919
+
920
+ #define _ZEND_TRY_ASSIGN_ARR (zv , arr , is_ref ) do { \
833
921
zval *_zv = zv; \
834
- if (EXPECTED (Z_ISREF_P(_zv))) { \
922
+ if (is_ref || UNEXPECTED (Z_ISREF_P(_zv))) { \
835
923
zend_reference *ref = Z_REF_P(_zv); \
836
924
if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \
837
925
zend_try_assign_typed_ref_arr(ref, arr); \
@@ -843,9 +931,17 @@ ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, ze
843
931
ZVAL_ARR(_zv, arr); \
844
932
} while (0)
845
933
846
- #define ZEND_TRY_ASSIGN_RES (zv , res ) do { \
934
+ #define ZEND_TRY_ASSIGN_ARR (zv , arr ) \
935
+ _ZEND_TRY_ASSIGN_ARR(zv, arr, 0)
936
+
937
+ #define ZEND_TRY_ASSIGN_REF_ARR (zv , arr ) do { \
938
+ ZEND_ASSERT(Z_ISREF_P(zv)); \
939
+ _ZEND_TRY_ASSIGN_ARR(zv, arr, 1); \
940
+ } while (0)
941
+
942
+ #define _ZEND_TRY_ASSIGN_RES (zv , res , is_ref ) do { \
847
943
zval *_zv = zv; \
848
- if (EXPECTED (Z_ISREF_P(_zv))) { \
944
+ if (is_ref || UNEXPECTED (Z_ISREF_P(_zv))) { \
849
945
zend_reference *ref = Z_REF_P(_zv); \
850
946
if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \
851
947
zend_try_assign_typed_ref_res(ref, res); \
@@ -857,9 +953,17 @@ ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, ze
857
953
ZVAL_RES(_zv, res); \
858
954
} while (0)
859
955
860
- #define ZEND_TRY_ASSIGN_TMP (zv , other_zv ) do { \
956
+ #define ZEND_TRY_ASSIGN_RES (zv , res ) \
957
+ _ZEND_TRY_ASSIGN_RES(zv, res, 0)
958
+
959
+ #define ZEND_TRY_ASSIGN_REF_RES (zv , res ) do { \
960
+ ZEND_ASSERT(Z_ISREF_P(zv)); \
961
+ _ZEND_TRY_ASSIGN_RES(zv, res, 1); \
962
+ } while (0)
963
+
964
+ #define _ZEND_TRY_ASSIGN_TMP (zv , other_zv , is_ref ) do { \
861
965
zval *_zv = zv; \
862
- if (EXPECTED (Z_ISREF_P(_zv))) { \
966
+ if (is_ref || UNEXPECTED (Z_ISREF_P(_zv))) { \
863
967
zend_reference *ref = Z_REF_P(_zv); \
864
968
if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \
865
969
zend_try_assign_typed_ref(ref, other_zv); \
@@ -871,9 +975,17 @@ ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, ze
871
975
ZVAL_COPY_VALUE(_zv, other_zv); \
872
976
} while (0)
873
977
874
- #define ZEND_TRY_ASSIGN_VALUE (zv , other_zv ) do { \
978
+ #define ZEND_TRY_ASSIGN_TMP (zv , other_zv ) \
979
+ _ZEND_TRY_ASSIGN_TMP(zv, other_zv, 0)
980
+
981
+ #define ZEND_TRY_ASSIGN_REF_TMP (zv , other_zv ) do { \
982
+ ZEND_ASSERT(Z_ISREF_P(zv)); \
983
+ _ZEND_TRY_ASSIGN_TMP(zv, other_zv, 1); \
984
+ } while (0)
985
+
986
+ #define _ZEND_TRY_ASSIGN_VALUE (zv , other_zv , is_ref ) do { \
875
987
zval *_zv = zv; \
876
- if (EXPECTED (Z_ISREF_P(_zv))) { \
988
+ if (is_ref || UNEXPECTED (Z_ISREF_P(_zv))) { \
877
989
zend_reference *ref = Z_REF_P(_zv); \
878
990
if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \
879
991
zend_try_assign_typed_ref_zval(ref, other_zv); \
@@ -885,14 +997,27 @@ ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, ze
885
997
ZVAL_COPY_VALUE(_zv, other_zv); \
886
998
} while (0)
887
999
1000
+ #define ZEND_TRY_ASSIGN_VALUE (zv , other_zv ) \
1001
+ _ZEND_TRY_ASSIGN_VALUE(zv, other_zv, 0)
1002
+
1003
+ #define ZEND_TRY_ASSIGN_REF_VALUE (zv , other_zv ) do { \
1004
+ ZEND_ASSERT(Z_ISREF_P(zv)); \
1005
+ _ZEND_TRY_ASSIGN_VALUE(zv, other_zv, 1); \
1006
+ } while (0)
1007
+
888
1008
#define ZEND_TRY_ASSIGN_COPY (zv , other_zv ) do { \
889
1009
Z_TRY_ADDREF_P(other_zv); \
890
1010
ZEND_TRY_ASSIGN_VALUE(zv, other_zv); \
891
1011
} while (0)
892
1012
893
- #define ZEND_TRY_ASSIGN_VALUE_EX (zv , other_zv , strict ) do { \
1013
+ #define ZEND_TRY_ASSIGN_REF_COPY (zv , other_zv ) do { \
1014
+ Z_TRY_ADDREF_P(other_zv); \
1015
+ ZEND_TRY_ASSIGN_REF_VALUE(zv, other_zv); \
1016
+ } while (0)
1017
+
1018
+ #define _ZEND_TRY_ASSIGN_VALUE_EX (zv , other_zv , strict , is_ref ) do { \
894
1019
zval *_zv = zv; \
895
- if (EXPECTED (Z_ISREF_P(_zv))) { \
1020
+ if (is_ref || UNEXPECTED (Z_ISREF_P(_zv))) { \
896
1021
zend_reference *ref = Z_REF_P(_zv); \
897
1022
if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \
898
1023
zend_try_assign_typed_ref_zval_ex(ref, other_zv, strict); \
@@ -904,11 +1029,24 @@ ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, ze
904
1029
ZVAL_COPY_VALUE(_zv, other_zv); \
905
1030
} while (0)
906
1031
1032
+ #define ZEND_TRY_ASSIGN_VALUE_EX (zv , other_zv , strict ) \
1033
+ _ZEND_TRY_ASSIGN_VALUE_EX(zv, other_zv, strict, 0)
1034
+
1035
+ #define ZEND_TRY_ASSIGN_REF_VALUE_EX (zv , other_zv , strict ) do { \
1036
+ ZEND_ASSERT(Z_ISREF_P(zv)); \
1037
+ _ZEND_TRY_ASSIGN_VALUE_EX(zv, other_zv, strict, 1); \
1038
+ } while (0)
1039
+
907
1040
#define ZEND_TRY_ASSIGN_COPY_EX (zv , other_zv , strict ) do { \
908
1041
Z_TRY_ADDREF_P(other_zv); \
909
1042
ZEND_TRY_ASSIGN_VALUE_EX(zv, other_zv, strict); \
910
1043
} while (0)
911
1044
1045
+ #define ZEND_TRY_ASSIGN_REF_COPY_EX (zv , other_zv , strict ) do { \
1046
+ Z_TRY_ADDREF_P(other_zv); \
1047
+ ZEND_TRY_ASSIGN_REF_VALUE_EX(zv, other_zv, strict); \
1048
+ } while (0)
1049
+
912
1050
/* Initializes a reference to an empty array and returns dereferenced zval,
913
1051
* or NULL if the initialization failed. */
914
1052
static zend_always_inline zval * zend_try_array_init_size (zval * zv , uint32_t size )
0 commit comments