Commit fe5b4a65 authored by Matthew Dempsky's avatar Matthew Dempsky

cmd/compile: more use of IterXXX functions

This CL was mostly produced by a one-off automated rewrite tool
looking for statements like "for X := T.Type; X != nil; X = X.Down"
and a few minor variations.

Passes toolstash -cmp.

Change-Id: Ib22705e37d078ef97841ee2e08f60bdbcabb94ad
Reviewed-on: https://go-review.googlesource.com/20520
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
parent c63dbd87
......@@ -135,7 +135,7 @@ func algtype1(t *Type, bad **Type) int {
}
ret := AMEM
for f := t.Type; f != nil; f = f.Down {
for f, it := IterFields(t); f != nil; f = it.Next() {
// All fields must be comparable.
a := algtype1(f.Type, bad)
if a == ANOEQ {
......
......@@ -19,7 +19,7 @@ func Rnd(o int64, r int64) int64 {
func offmod(t *Type) {
o := int32(0)
for f := t.Type; f != nil; f = f.Down {
for f, it := IterFields(t); f != nil; f = it.Next() {
if f.Etype != TFIELD {
Fatalf("offmod: not TFIELD: %v", Tconv(f, obj.FmtLong))
}
......@@ -40,7 +40,7 @@ func widstruct(errtype *Type, t *Type, o int64, flag int) int64 {
}
lastzero := int64(0)
var w int64
for f := t.Type; f != nil; f = f.Down {
for f, it := IterFields(t); f != nil; f = it.Next() {
if f.Etype != TFIELD {
Fatalf("widstruct: not TFIELD: %v", Tconv(f, obj.FmtLong))
}
......
......@@ -465,7 +465,7 @@ func (p *exporter) typ(t *Type) {
// TODO(gri) Determine if they are already sorted
// in which case we can drop this step.
var methods []*Type
for m := t.Method; m != nil; m = m.Down {
for m, it := IterMethods(t); m != nil; m = it.Next() {
methods = append(methods, m)
}
sort.Sort(methodbyname(methods))
......@@ -559,7 +559,7 @@ func (p *exporter) fieldList(t *Type) {
}
p.int(countfield(t))
for f := t.Type; f != nil; f = f.Down {
for f, it := IterFields(t); f != nil; f = it.Next() {
p.field(f)
if p.trace && f.Down != nil {
p.tracef("\n")
......@@ -592,7 +592,7 @@ func (p *exporter) methodList(t *Type) {
}
p.int(countfield(t))
for m := t.Type; m != nil; m = m.Down {
for m, it := IterFields(t); m != nil; m = it.Next() {
p.method(m)
if p.trace && m.Down != nil {
p.tracef("\n")
......@@ -657,7 +657,7 @@ func (p *exporter) paramList(params *Type) {
n = -n
}
p.int(n)
for q := params.Type; q != nil; q = q.Down {
for q, it := IterFields(params); q != nil; q = it.Next() {
p.param(q, n)
}
}
......
......@@ -834,7 +834,7 @@ func tostruct0(t *Type, l []*Node) {
tp = &f.Down
}
for f := t.Type; f != nil && !t.Broke; f = f.Down {
for f, it := IterFields(t); f != nil && !t.Broke; f = it.Next() {
if f.Broke {
t.Broke = true
}
......@@ -868,7 +868,7 @@ func tofunargs(l []*Node) *Type {
tp = &f.Down
}
for f := t.Type; f != nil && !t.Broke; f = f.Down {
for f, it := IterFields(t); f != nil && !t.Broke; f = it.Next() {
if f.Broke {
t.Broke = true
}
......@@ -961,7 +961,7 @@ func tointerface0(t *Type, l []*Node) *Type {
if n.Left == nil && f.Type.Etype == TINTER {
// embedded interface, inline methods
for t1 := f.Type.Type; t1 != nil; t1 = t1.Down {
for t1, it := IterFields(f.Type); t1 != nil; t1 = it.Next() {
f = typ(TFIELD)
f.Type = t1.Type
f.Broke = t1.Broke
......@@ -978,7 +978,7 @@ func tointerface0(t *Type, l []*Node) *Type {
}
}
for f := t.Type; f != nil && !t.Broke; f = f.Down {
for f, it := IterFields(t); f != nil && !t.Broke; f = it.Next() {
if f.Broke {
t.Broke = true
}
......@@ -1357,7 +1357,7 @@ func addmethod(sf *Sym, t *Type, local bool, nointerface bool) {
}
if pa.Etype == TSTRUCT {
for f := pa.Type; f != nil; f = f.Down {
for f, it := IterFields(pa); f != nil; f = it.Next() {
if f.Sym == sf {
Yyerror("type %v has both field and method named %v", pa, sf)
return
......@@ -1369,7 +1369,7 @@ func addmethod(sf *Sym, t *Type, local bool, nointerface bool) {
n.Type = t
var d *Type // last found
for f := pa.Method; f != nil; f = f.Down {
for f, it := IterMethods(pa); f != nil; f = it.Next() {
d = f
if f.Etype != TFIELD {
Fatalf("addmethod: not TFIELD: %v", Tconv(f, obj.FmtLong))
......
......@@ -296,7 +296,7 @@ func dumpexporttype(t *Type) {
}
var m []*Type
for f := t.Method; f != nil; f = f.Down {
for f, it := IterMethods(t); f != nil; f = it.Next() {
dumpexporttype(f)
m = append(m, f)
}
......@@ -584,7 +584,7 @@ func dumpasmhdr() {
break
}
fmt.Fprintf(b, "#define %s__size %d\n", t.Sym.Name, int(t.Width))
for t = t.Type; t != nil; t = t.Down {
for t, it := IterFields(t); t != nil; t = it.Next() {
if !isblanksym(t.Sym) {
fmt.Fprintf(b, "#define %s_%s %d\n", n.Sym.Name, t.Sym.Name, int(t.Width))
}
......
......@@ -585,7 +585,7 @@ func typefmt(t *Type, flag int) string {
case TINTER:
var buf bytes.Buffer
buf.WriteString("interface {")
for t1 := t.Type; t1 != nil; t1 = t1.Down {
for t1, it := IterFields(t); t1 != nil; t1 = it.Next() {
buf.WriteString(" ")
switch {
case t1.Sym == nil:
......@@ -663,14 +663,14 @@ func typefmt(t *Type, flag int) string {
if t.Funarg {
buf.WriteString("(")
if fmtmode == FTypeId || fmtmode == FErr { // no argument names on function signature, and no "noescape"/"nosplit" tags
for t1 := t.Type; t1 != nil; t1 = t1.Down {
for t1, it := IterFields(t); t1 != nil; t1 = it.Next() {
buf.WriteString(Tconv(t1, obj.FmtShort))
if t1.Down != nil {
buf.WriteString(", ")
}
}
} else {
for t1 := t.Type; t1 != nil; t1 = t1.Down {
for t1, it := IterFields(t); t1 != nil; t1 = it.Next() {
buf.WriteString(Tconv(t1, 0))
if t1.Down != nil {
buf.WriteString(", ")
......@@ -680,7 +680,7 @@ func typefmt(t *Type, flag int) string {
buf.WriteString(")")
} else {
buf.WriteString("struct {")
for t1 := t.Type; t1 != nil; t1 = t1.Down {
for t1, it := IterFields(t); t1 != nil; t1 = it.Next() {
buf.WriteString(" ")
buf.WriteString(Tconv(t1, obj.FmtLong))
if t1.Down != nil {
......
......@@ -1242,7 +1242,7 @@ func visitComponents(t *Type, startOffset int64, f func(elem *Type, elemOffset i
Fatalf("struct not at offset 0")
}
for field := t.Type; field != nil; field = field.Down {
for field, it := IterFields(t); field != nil; field = it.Next() {
if field.Etype != TFIELD {
Fatalf("bad struct")
}
......
......@@ -951,7 +951,7 @@ func onebitwalktype1(t *Type, xoffset *int64, bv Bvec) {
case TSTRUCT:
o := int64(0)
var fieldoffset int64
for t1 := t.Type; t1 != nil; t1 = t1.Down {
for t1, it := IterFields(t); t1 != nil; t1 = it.Next() {
fieldoffset = t1.Width
*xoffset += fieldoffset - o
onebitwalktype1(t1.Type, xoffset, bv)
......
......@@ -299,7 +299,7 @@ func methods(t *Type) []*Sig {
// make list of methods for t,
// generating code if necessary.
var ms []*Sig
for f := mt.Xmethod; f != nil; f = f.Down {
for f, it2 := IterAllMethods(mt); f != nil; f = it2.Next() {
if f.Etype != TFIELD {
Fatalf("methods: not field %v", f)
}
......
......@@ -2634,7 +2634,7 @@ func canSSAType(t *Type) bool {
if countfield(t) > ssa.MaxStruct {
return false
}
for t1 := t.Type; t1 != nil; t1 = t1.Down {
for t1, it := IterFields(t); t1 != nil; t1 = it.Next() {
if !canSSAType(t1.Type) {
return false
}
......@@ -5138,7 +5138,7 @@ func fieldIdx(n *Node) int64 {
}
var i int64
for t1 := t.Type; t1 != nil; t1 = t1.Down {
for t1, it := IterFields(t); t1 != nil; t1 = it.Next() {
if t1.Etype != TFIELD {
panic("non-TFIELD in TSTRUCT")
}
......
......@@ -1136,7 +1136,7 @@ func substAny(tp **Type, types *[]*Type) {
substAny(t.ResultsP(), types)
case TSTRUCT:
for t = t.Type; t != nil; t = t.Down {
for t, it := IterFields(t); t != nil; t = it.Next() {
substAny(&t.Type, types)
}
}
......@@ -1219,7 +1219,7 @@ func deep(t *Type) *Type {
nt.Type = t.Type.Copy()
xt := nt.Type
for t = t.Type; t != nil; t = t.Down {
for t, it := IterFields(t); t != nil; t = it.Next() {
xt.Type = deep(t.Type)
xt.Down = t.Down.Copy()
xt = xt.Down
......@@ -1588,7 +1588,7 @@ func lookdot0(s *Sym, t *Type, save **Type, ignorecase bool) int {
c := 0
if u.Etype == TSTRUCT || u.Etype == TINTER {
for f := u.Type; f != nil; f = f.Down {
for f, it := IterFields(u); f != nil; f = it.Next() {
if f.Sym == s || (ignorecase && f.Type.Etype == TFUNC && f.Type.Thistuple > 0 && strings.EqualFold(f.Sym.Name, s.Name)) {
if save != nil {
*save = f
......@@ -1600,7 +1600,7 @@ func lookdot0(s *Sym, t *Type, save **Type, ignorecase bool) int {
u = methtype(t, 0)
if u != nil {
for f := u.Method; f != nil; f = f.Down {
for f, it := IterMethods(u); f != nil; f = it.Next() {
if f.Embedded == 0 && (f.Sym == s || (ignorecase && strings.EqualFold(f.Sym.Name, s.Name))) {
if save != nil {
*save = f
......@@ -1645,7 +1645,7 @@ func adddot1(s *Sym, t *Type, d int, save **Type, ignorecase bool) (c int, more
goto out
}
for f := u.Type; f != nil; f = f.Down {
for f, it := IterFields(u); f != nil; f = it.Next() {
if f.Embedded == 0 || f.Sym == nil {
continue
}
......@@ -1759,7 +1759,7 @@ func expand0(t *Type, followptr bool) {
if u.Etype == TINTER {
var sl *Symlink
for f := u.Type; f != nil; f = f.Down {
for f, it := IterFields(u); f != nil; f = it.Next() {
if f.Sym.Flags&SymUniq != 0 {
continue
}
......@@ -1777,7 +1777,7 @@ func expand0(t *Type, followptr bool) {
u = methtype(t, 0)
if u != nil {
var sl *Symlink
for f := u.Method; f != nil; f = f.Down {
for f, it := IterMethods(u); f != nil; f = it.Next() {
if f.Sym.Flags&SymUniq != 0 {
continue
}
......@@ -1811,7 +1811,7 @@ func expand1(t *Type, top, followptr bool) {
goto out
}
for f := u.Type; f != nil; f = f.Down {
for f, it := IterFields(u); f != nil; f = it.Next() {
if f.Embedded == 0 {
continue
}
......@@ -1833,7 +1833,7 @@ func expandmeth(t *Type) {
// mark top-level method symbols
// so that expand1 doesn't consider them.
var f *Type
for f = t.Method; f != nil; f = f.Down {
for f, it := IterMethods(t); f != nil; f = it.Next() {
f.Sym.Flags |= SymUniq
}
......@@ -1855,7 +1855,7 @@ func expandmeth(t *Type) {
}
}
for f = t.Method; f != nil; f = f.Down {
for f, it := IterMethods(t); f != nil; f = it.Next() {
f.Sym.Flags &^= SymUniq
}
......@@ -2114,9 +2114,8 @@ func implements(t *Type, iface *Type, m **Type, samename **Type, ptr *int) bool
// and then do one loop.
if t.Etype == TINTER {
var tm *Type
for im := iface.Type; im != nil; im = im.Down {
for tm = t.Type; tm != nil; tm = tm.Down {
for im, it := IterFields(iface); im != nil; im = it.Next() {
for tm, it2 := IterFields(t); tm != nil; tm = it2.Next() {
if tm.Sym == im.Sym {
if Eqtype(tm.Type, im.Type) {
goto found
......@@ -2146,7 +2145,7 @@ func implements(t *Type, iface *Type, m **Type, samename **Type, ptr *int) bool
var imtype *Type
var followptr bool
var rcvr *Type
for im := iface.Type; im != nil; im = im.Down {
for im, it := IterFields(iface); im != nil; im = it.Next() {
if im.Broke {
continue
}
......
......@@ -200,7 +200,29 @@ func IterFields(t *Type) (*Type, Iter) {
if t.Etype != TSTRUCT && t.Etype != TINTER {
Fatalf("IterFields: type %v does not have fields", t)
}
i := Iter{x: t.Type}
return RawIter(t.Type)
}
// IterMethods returns the first method in type t's method set
// and an Iter value to continue iterating across the rest.
// IterMethods does not include promoted methods.
func IterMethods(t *Type) (*Type, Iter) {
// TODO(mdempsky): Validate t?
return RawIter(t.Method)
}
// IterAllMethods returns the first (possibly promoted) method in type t's
// method set and an Iter value to continue iterating across the rest.
func IterAllMethods(t *Type) (*Type, Iter) {
// TODO(mdempsky): Validate t?
return RawIter(t.Xmethod)
}
// RawIter returns field t and an Iter value to continue iterating across
// its successor fields. Most code should instead use one of the IterXXX
// functions above.
func RawIter(t *Type) (*Type, Iter) {
i := Iter{x: t}
f := i.Next()
return f, i
}
......
......@@ -2372,7 +2372,7 @@ func twoarg(n *Node) bool {
func lookdot1(errnode *Node, s *Sym, t *Type, f *Type, dostrcmp int) *Type {
var r *Type
for ; f != nil; f = f.Down {
for f, it := RawIter(f); f != nil; f = it.Next() {
if dostrcmp != 0 && f.Sym.Name == s.Name {
return f
}
......@@ -2577,7 +2577,7 @@ func nokeys(l Nodes) bool {
}
func hasddd(t *Type) bool {
for tl := t.Type; tl != nil; tl = tl.Down {
for tl, it := IterFields(t); tl != nil; tl = it.Next() {
if tl.Isddd {
return true
}
......@@ -2590,7 +2590,7 @@ func hasddd(t *Type) bool {
// TODO decide if we want both (for semantic reasons)
func downcount(t *Type) int {
n := 0
for tl := t.Type; tl != nil; tl = tl.Down {
for tl, it := IterFields(t); tl != nil; tl = it.Next() {
n++
}
......@@ -2629,7 +2629,7 @@ func typecheckaste(op Op, call *Node, isddd bool, tstruct *Type, nl Nodes, desc
tn := n.Type.Type
var why string
for tl := tstruct.Type; tl != nil; tl = tl.Down {
for tl, it2 := IterFields(tstruct); tl != nil; tl = it2.Next() {
if tl.Isddd {
for ; tn != nil; tn = tn.Down {
if assignop(tn.Type, tl.Type.Type, &why) == 0 {
......@@ -2691,7 +2691,7 @@ func typecheckaste(op Op, call *Node, isddd bool, tstruct *Type, nl Nodes, desc
}
i = 0
for tl := tstruct.Type; tl != nil; tl = tl.Down {
for tl, it := IterFields(tstruct); tl != nil; tl = it.Next() {
t = tl.Type
if tl.Isddd {
if isddd {
......
......@@ -3083,7 +3083,7 @@ func eqfor(t *Type, needsize *int) *Node {
func countfield(t *Type) int {
n := 0
for t1 := t.Type; t1 != nil; t1 = t1.Down {
for t1, it := IterFields(t); t1 != nil; t1 = it.Next() {
n++
}
return n
......@@ -3234,7 +3234,7 @@ func walkcompare(np **Node, init *Nodes) {
// Inline comparisons.
var li *Node
var ri *Node
for t1 := t.Type; t1 != nil; t1 = t1.Down {
for t1, it := IterFields(t); t1 != nil; t1 = it.Next() {
if isblanksym(t1.Sym) {
continue
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment