Commit 03731283 authored by Dave Cheney's avatar Dave Cheney

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/21350Reviewed-by: default avatarMatthew Dempsky <mdempsky@google.com>
Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
parent e76fc1b9
......@@ -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
}
......
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