@@ -2777,10 +2777,12 @@ func addstr(n *Node, init *Nodes) *Node {
2777
2777
// expand append(l1, l2...) to
2778
2778
// init {
2779
2779
// s := l1
2780
- // if n := len(l1) + len(l2) - cap(s); n > 0 {
2781
- // s = growslice_n(s, n)
2780
+ // n := len(s) + len(l2)
2781
+ // // Compare as uint so growslice can panic on overflow.
2782
+ // if uint(n) > uint(cap(s)) {
2783
+ // s = growslice(s, n)
2782
2784
// }
2783
- // s = s[:len(l1)+len(l2) ]
2785
+ // s = s[:n ]
2784
2786
// memmove(&s[len(l1)], &l2[0], len(l2)*sizeof(T))
2785
2787
// }
2786
2788
// s
@@ -2800,33 +2802,38 @@ func appendslice(n *Node, init *Nodes) *Node {
2800
2802
l1 := n .List .First ()
2801
2803
l2 := n .List .Second ()
2802
2804
2803
- s := temp (l1 .Type ) // var s []T
2804
2805
var l []* Node
2806
+
2807
+ // var s []T
2808
+ s := temp (l1 .Type )
2805
2809
l = append (l , Nod (OAS , s , l1 )) // s = l1
2806
2810
2807
- nt := temp (Types [TINT ])
2811
+ // n := len(s) + len(l2)
2812
+ nn := temp (Types [TINT ])
2813
+ l = append (l , Nod (OAS , nn , Nod (OADD , Nod (OLEN , s , nil ), Nod (OLEN , l2 , nil ))))
2808
2814
2815
+ // if uint(n) > uint(cap(s))
2809
2816
nif := Nod (OIF , nil , nil )
2817
+ nif .Left = Nod (OGT , Nod (OCONV , nn , nil ), Nod (OCONV , Nod (OCAP , s , nil ), nil ))
2818
+ nif .Left .Left .Type = Types [TUINT ]
2819
+ nif .Left .Right .Type = Types [TUINT ]
2810
2820
2811
- // n := len(s) + len(l2) - cap(s)
2812
- nif .Ninit .Set1 (Nod (OAS , nt , Nod (OSUB ,
2813
- Nod (OADD , Nod (OLEN , s , nil ), Nod (OLEN , l2 , nil )),
2814
- Nod (OCAP , s , nil ))))
2815
-
2816
- nif .Left = Nod (OGT , nt , Nodintconst (0 ))
2817
-
2818
- // instantiate growslice_n(Type*, []any, int) []any
2819
- fn := syslook ("growslice_n" ) // growslice_n(<type>, old []T, n int64) (ret []T)
2821
+ // instantiate growslice(Type*, []any, int) []any
2822
+ fn := syslook ("growslice" )
2820
2823
substArgTypes (& fn , s .Type .Type , s .Type .Type )
2821
2824
2822
- // s = growslice_n(T, s, n)
2823
- nif .Nbody .Set1 (Nod (OAS , s , mkcall1 (fn , s .Type , & nif .Ninit , typename (s .Type ), s , nt )))
2824
-
2825
+ // s = growslice(T, s, n)
2826
+ nif .Nbody .Set1 (Nod (OAS , s , mkcall1 (fn , s .Type , & nif .Ninit , typename (s .Type ), s , nn )))
2825
2827
l = append (l , nif )
2826
2828
2829
+ // s = s[:n]
2830
+ nt := Nod (OSLICE , s , Nod (OKEY , nil , nn ))
2831
+ nt .Etype = 1
2832
+ l = append (l , Nod (OAS , s , nt ))
2833
+
2827
2834
if haspointers (l1 .Type .Type ) {
2828
- // copy(s[len(l1):len(l1)+len(l2) ], l2)
2829
- nptr1 := Nod (OSLICE , s , Nod (OKEY , Nod (OLEN , l1 , nil ), Nod ( OADD , Nod ( OLEN , l1 , nil ), Nod ( OLEN , l2 , nil )) ))
2835
+ // copy(s[len(l1):], l2)
2836
+ nptr1 := Nod (OSLICE , s , Nod (OKEY , Nod (OLEN , l1 , nil ), nil ))
2830
2837
2831
2838
nptr1 .Etype = 1
2832
2839
nptr2 := l2
@@ -2838,8 +2845,8 @@ func appendslice(n *Node, init *Nodes) *Node {
2838
2845
l = append (ln .Slice (), nt )
2839
2846
} else if instrumenting {
2840
2847
// rely on runtime to instrument copy.
2841
- // copy(s[len(l1):len(l1)+len(l2) ], l2)
2842
- nptr1 := Nod (OSLICE , s , Nod (OKEY , Nod (OLEN , l1 , nil ), Nod ( OADD , Nod ( OLEN , l1 , nil ), Nod ( OLEN , l2 , nil )) ))
2848
+ // copy(s[len(l1):], l2)
2849
+ nptr1 := Nod (OSLICE , s , Nod (OKEY , Nod (OLEN , l1 , nil ), nil ))
2843
2850
2844
2851
nptr1 .Etype = 1
2845
2852
nptr2 := l2
@@ -2857,8 +2864,8 @@ func appendslice(n *Node, init *Nodes) *Node {
2857
2864
} else {
2858
2865
// memmove(&s[len(l1)], &l2[0], len(l2)*sizeof(T))
2859
2866
nptr1 := Nod (OINDEX , s , Nod (OLEN , l1 , nil ))
2860
-
2861
2867
nptr1 .Bounded = true
2868
+
2862
2869
nptr1 = Nod (OADDR , nptr1 , nil )
2863
2870
2864
2871
nptr2 := Nod (OSPTR , l2 , nil )
@@ -2875,13 +2882,6 @@ func appendslice(n *Node, init *Nodes) *Node {
2875
2882
l = append (ln .Slice (), nt )
2876
2883
}
2877
2884
2878
- // s = s[:len(l1)+len(l2)]
2879
- nt = Nod (OADD , Nod (OLEN , l1 , nil ), Nod (OLEN , l2 , nil ))
2880
-
2881
- nt = Nod (OSLICE , s , Nod (OKEY , nil , nt ))
2882
- nt .Etype = 1
2883
- l = append (l , Nod (OAS , s , nt ))
2884
-
2885
2885
typechecklist (l , Etop )
2886
2886
walkstmtlist (l )
2887
2887
init .Append (l ... )
0 commit comments