mirror of
https://github.com/golang/go
synced 2024-11-12 05:30:21 -07:00
cmd/compile: eliminate IterParams
It's only used once, so just make the caller responsible for iterating both the receiver and input params. Change-Id: Icb34f3f0cf96e80fbe27f3f49d12eddc26599b92 Reviewed-on: https://go-review.googlesource.com/20454 Reviewed-by: Dave Cheney <dave@cheney.net>
This commit is contained in:
parent
33fd4535a4
commit
aa3650f019
@ -618,15 +618,11 @@ func typeinit() {
|
|||||||
func Argsize(t *Type) int {
|
func Argsize(t *Type) int {
|
||||||
var w int64
|
var w int64
|
||||||
|
|
||||||
for fp, ip := IterFields(t.Results()); fp != nil; fp = ip.Next() {
|
for _, p := range recvParamsResults {
|
||||||
if x := fp.Width + fp.Type.Width; x > w {
|
for f, it := IterFields(p(t)); f != nil; f = it.Next() {
|
||||||
w = x
|
if x := f.Width + f.Type.Width; x > w {
|
||||||
}
|
w = x
|
||||||
}
|
}
|
||||||
|
|
||||||
for fp, ip := IterParams(t); fp != nil; fp = ip.Next() {
|
|
||||||
if x := fp.Width + fp.Type.Width; x > w {
|
|
||||||
w = x
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -164,10 +164,10 @@ type Type struct {
|
|||||||
Lastfn *Node // for usefield
|
Lastfn *Node // for usefield
|
||||||
}
|
}
|
||||||
|
|
||||||
// Iter provides an abstraction for iterating across struct fields,
|
// Iter provides an abstraction for iterating across struct fields and
|
||||||
// interface methods, and function parameters.
|
// interface methods.
|
||||||
type Iter struct {
|
type Iter struct {
|
||||||
a, b *Type
|
x *Type
|
||||||
}
|
}
|
||||||
|
|
||||||
// IterFields returns the first field or method in struct or interface type t
|
// IterFields returns the first field or method in struct or interface type t
|
||||||
@ -176,35 +176,21 @@ func IterFields(t *Type) (*Type, Iter) {
|
|||||||
if t.Etype != TSTRUCT && t.Etype != TINTER {
|
if t.Etype != TSTRUCT && t.Etype != TINTER {
|
||||||
Fatalf("IterFields: type %v does not have fields", t)
|
Fatalf("IterFields: type %v does not have fields", t)
|
||||||
}
|
}
|
||||||
i := Iter{a: t.Type}
|
i := Iter{x: t.Type}
|
||||||
f := i.Next()
|
f := i.Next()
|
||||||
return f, i
|
return f, i
|
||||||
}
|
}
|
||||||
|
|
||||||
// IterParams returns the first reeiver or input parameter in function type t
|
// Next returns the next field or method, if any.
|
||||||
// and an Iter value to continue iterating across the rest.
|
|
||||||
func IterParams(t *Type) (*Type, Iter) {
|
|
||||||
if t.Etype != TFUNC {
|
|
||||||
Fatalf("IterParams: type %v does not have params", t)
|
|
||||||
}
|
|
||||||
i := Iter{a: t.Recv().Type, b: t.Params().Type}
|
|
||||||
f := i.Next()
|
|
||||||
return f, i
|
|
||||||
}
|
|
||||||
|
|
||||||
// Next returns the next field, method, or parameter, if any.
|
|
||||||
func (i *Iter) Next() *Type {
|
func (i *Iter) Next() *Type {
|
||||||
if i.a == nil {
|
if i.x == nil {
|
||||||
if i.b == nil {
|
return nil
|
||||||
return nil
|
|
||||||
}
|
|
||||||
i.a, i.b = i.b, nil
|
|
||||||
}
|
}
|
||||||
t := i.a
|
t := i.x
|
||||||
if t.Etype != TFIELD {
|
if t.Etype != TFIELD {
|
||||||
Fatalf("Iter.Next: type %v is not a field", t)
|
Fatalf("Iter.Next: type %v is not a field", t)
|
||||||
}
|
}
|
||||||
i.a = t.Down
|
i.x = t.Down
|
||||||
return t
|
return t
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -233,6 +219,13 @@ func (t *Type) Recv() *Type { return *t.RecvP() }
|
|||||||
func (t *Type) Params() *Type { return *t.ParamsP() }
|
func (t *Type) Params() *Type { return *t.ParamsP() }
|
||||||
func (t *Type) Results() *Type { return *t.ResultsP() }
|
func (t *Type) Results() *Type { return *t.ResultsP() }
|
||||||
|
|
||||||
|
// recvParamsResults stores the accessor functions for a function Type's
|
||||||
|
// receiver, parameters, and result parameters, in that order.
|
||||||
|
// It can be used to iterate over all of a function's parameter lists.
|
||||||
|
var recvParamsResults = [3]func(*Type) *Type{
|
||||||
|
(*Type).Recv, (*Type).Params, (*Type).Results,
|
||||||
|
}
|
||||||
|
|
||||||
func (t *Type) Size() int64 {
|
func (t *Type) Size() int64 {
|
||||||
dowidth(t)
|
dowidth(t)
|
||||||
return t.Width
|
return t.Width
|
||||||
|
Loading…
Reference in New Issue
Block a user