mirror of
https://github.com/golang/go
synced 2024-11-19 01:04:40 -07:00
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:
parent
e76fc1b921
commit
0373128318
@ -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
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user