cmd/compile: remove remaining nodeSeqIterate calls

Mix in several other minor cleanups, including adding some new methods
to Nodes: Index, Addr, SetIndex, SetNodes.

Passes toolstash -cmp.

Update #14473.

Change-Id: I8bd4ae3fde7c5e20ba66e7dd1654fbc70c3ddeb8
Reviewed-on: https://go-review.googlesource.com/20491
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go
index a53d1bd..c1f1931 100644
--- a/src/cmd/compile/internal/gc/walk.go
+++ b/src/cmd/compile/internal/gc/walk.go
@@ -321,8 +321,9 @@
 
 			ll := ascompatee(n.Op, rl, n.List.Slice(), &n.Ninit)
 			n.List.Set(reorder3(ll))
-			for i1 := range n.List.Slice() {
-				n.List.Slice()[i1] = applywritebarrier(n.List.Slice()[i1])
+			ls := n.List.Slice()
+			for i, n := range ls {
+				ls[i] = applywritebarrier(n)
 			}
 			break
 		}
@@ -884,8 +885,7 @@
 		if !isblank(a) {
 			var_ := temp(Ptrto(t.Type))
 			var_.Typecheck = 1
-			it := nodeSeqIterate(n.List)
-			*it.P() = var_
+			n.List.SetIndex(0, var_)
 			walkexpr(&n, init)
 			init.Append(n)
 			n = Nod(OAS, a, Nod(OIND, var_, nil))
@@ -1661,20 +1661,20 @@
 	}
 
 	var nn []*Node
-	nlit := nodeSeqIterate(nl)
-	nrit := nodeSeqIterate(nr)
-	for ; !nlit.Done() && !nrit.Done(); nlit.Next() {
+	i := 0
+	for ; i < len(nl); i++ {
+		if i >= len(nr) {
+			break
+		}
 		// Do not generate 'x = x' during return. See issue 4014.
-		if op == ORETURN && nlit.N() == nrit.N() {
-			nrit.Next()
+		if op == ORETURN && nl[i] == nr[i] {
 			continue
 		}
-		nn = append(nn, ascompatee1(op, nlit.N(), nrit.N(), init))
-		nrit.Next()
+		nn = append(nn, ascompatee1(op, nl[i], nr[i], init))
 	}
 
 	// cannot happen: caller checked that lists had same length
-	if !nlit.Done() || !nrit.Done() {
+	if i < len(nl) || i < len(nr) {
 		var nln, nrn Nodes
 		nln.Set(nl)
 		nrn.Set(nr)
@@ -1714,12 +1714,12 @@
 	var nn []*Node
 	var mm []*Node
 	ucount := 0
-	it := nodeSeqIterate(nl)
-	for ; !it.Done(); it.Next() {
+	var i int
+	for i = 0; i < nl.Len(); i++ {
 		if r == nil {
 			break
 		}
-		l = it.N()
+		l = nl.Index(i)
 		if isblank(l) {
 			r = saver.Next()
 			continue
@@ -1749,7 +1749,7 @@
 		r = saver.Next()
 	}
 
-	if !it.Done() || r != nil {
+	if i < nl.Len() || r != nil {
 		Yyerror("ascompatet: assignment count mismatch: %d = %d", nl.Len(), structcount(*nr))
 	}
 
@@ -1985,7 +1985,7 @@
 			defaultlit(&n, Types[TINT64])
 		}
 		defaultlit(&n, nil)
-		all.Slice()[i1] = n
+		all.SetIndex(i1, n)
 		if n.Type == nil || n.Type.Etype == TFORW {
 			continue
 		}
@@ -2811,14 +2811,13 @@
 // l2 is allowed to be a string.
 func appendslice(n *Node, init *Nodes) *Node {
 	walkexprlistsafe(n.List.Slice(), init)
-	for i1 := range
 
 	// walkexprlistsafe will leave OINDEX (s[n]) alone if both s
 	// and n are name or literal, but those may index the slice we're
 	// modifying here. Fix explicitly.
-	n.List.Slice() {
-		n.List.Slice()[i1] = cheapexpr(n.List.Slice()[i1],
-			init)
+	ls := n.List.Slice()
+	for i1, n1 := range ls {
+		ls[i1] = cheapexpr(n1, init)
 	}
 
 	l1 := n.List.First()
@@ -2933,9 +2932,8 @@
 //   s
 func walkappend(n *Node, init *Nodes, dst *Node) *Node {
 	if !samesafeexpr(dst, n.List.First()) {
-		it := nodeSeqIterate(n.List)
-		*it.P() = safeexpr(it.N(), init)
-		walkexpr(it.P(), init)
+		n.List.SetIndex(0, safeexpr(n.List.Index(0), init))
+		walkexpr(n.List.Addr(0), init)
 	}
 	walkexprlistsafe(n.List.Slice()[1:], init)
 
@@ -2945,10 +2943,9 @@
 	// Using cheapexpr also makes sure that the evaluation
 	// of all arguments (and especially any panics) happen
 	// before we begin to modify the slice in a visible way.
-	it := nodeSeqIterate(n.List)
-	it.Next()
-	for ; !it.Done(); it.Next() {
-		*it.P() = cheapexpr(it.N(), init)
+	ls := n.List.Slice()[1:]
+	for i, n := range ls {
+		ls[i] = cheapexpr(n, init)
 	}
 
 	nsrc := n.List.First()
@@ -2991,13 +2988,12 @@
 	nx.Etype = 1
 	l = append(l, Nod(OAS, ns, nx)) // s = s[:n+argc]
 
-	it = nodeSeqIterate(n.List)
-	it.Next()
-	for ; !it.Done(); it.Next() {
+	ls = n.List.Slice()[1:]
+	for i, n := range ls {
 		nx = Nod(OINDEX, ns, nn) // s[n] ...
 		nx.Bounded = true
-		l = append(l, Nod(OAS, nx, it.N())) // s[n] = arg
-		if it.Len() > 1 {
+		l = append(l, Nod(OAS, nx, n)) // s[n] = arg
+		if i+1 < len(ls) {
 			l = append(l, Nod(OAS, nn, Nod(OADD, nn, Nodintconst(1)))) // n = n + 1
 		}
 	}