]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/gc: don't iterate over field list twice
authorDave Cheney <dave@cheney.net>
Wed, 30 Mar 2016 23:30:04 +0000 (10:30 +1100)
committerDave Cheney <dave@cheney.net>
Thu, 31 Mar 2016 00:21:37 +0000 (00:21 +0000)
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>
src/cmd/compile/internal/gc/dcl.go

index f107a4e2844763127ea68ffddfa07e02b5668fad..7adaa0ea2d102e6f192f362aa0fcc34e60a46c15 100644 (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
 }