cmd/compile/internal/gc: don't iterate over field list twice

In tostruct0 and tofunargs we take a list of nodes, transform them into
a slice of Fields, set the fields on a type, then use the IterFields
iterator to iterate over the list again to see if any of them are
broken.

As we know the slice of fielde-we just created it-we can combine these two
interations into one pass over the fields.

Change-Id: I8b04c90fb32fd6c3b1752cfc607128a634ee06c5
Reviewed-on: https://go-review.googlesource.com/21350
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
Dave Cheney 2016-03-31 10:30:04 +11:00
parent e76fc1b921
commit 0373128318

View file

@ -819,15 +819,13 @@ func tostruct0(t *Type, l []*Node) {
var fields []*Field
for _, n := range l {
fields = append(fields, structfield(n))
}
t.SetFields(fields)
for f, it := IterFields(t); f != nil && !t.Broke; f = it.Next() {
f := structfield(n)
if f.Broke {
t.Broke = true
}
fields = append(fields, f)
}
t.SetFields(fields)
checkdupfields("field", t)
@ -849,17 +847,12 @@ func tofunargs(l []*Node) *Type {
if n.Left != nil && n.Left.Class == PPARAM {
n.Left.Name.Param.Field = f
}
fields = append(fields, f)
}
t.SetFields(fields)
for f, it := IterFields(t); f != nil && !t.Broke; f = it.Next() {
if f.Broke {
t.Broke = true
}
fields = append(fields, f)
}
t.SetFields(fields)
return t
}