Skip to content

Commit

Permalink
cmd/compile/internal/gc: don't iterate over field list twice
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-by: Brad Fitzpatrick <[email protected]>
  • Loading branch information
davecheney committed Mar 31, 2016
1 parent e76fc1b commit 0373128
Showing 1 changed file with 5 additions and 12 deletions.
17 changes: 5 additions & 12 deletions src/cmd/compile/internal/gc/dcl.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand All @@ -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
}

Expand Down

0 comments on commit 0373128

Please sign in to comment.