1
0
mirror of https://github.com/golang/go synced 2024-10-01 12:28:37 -06:00

cmd/compile: encapsulate reads of gc.Type.Funarg

Changes generated with eg and then manually
checked and in some cases simplified.

Passes toolstash -cmp.

Change-Id: I2119f37f003368ce1884d2863b406d6ffbfe38c7
Reviewed-on: https://go-review.googlesource.com/21563
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
Josh Bleecher Snyder 2016-04-05 16:44:07 -07:00
parent e0307c25be
commit fda831ed3f
10 changed files with 19 additions and 14 deletions

View File

@ -263,7 +263,7 @@ func dowidth(t *Type) {
}
case TSTRUCT:
if t.Funarg {
if t.IsFuncArgStruct() {
Fatalf("dowidth fn struct %v", t)
}
w = widstruct(t, t, 0, 1)
@ -335,7 +335,7 @@ func checkwidth(t *Type) {
// function arg structs should not be checked
// outside of the enclosing function.
if t.Funarg {
if t.IsFuncArgStruct() {
Fatalf("checkwidth %v", t)
}

View File

@ -742,7 +742,7 @@ func basetypeName(t *Type) string {
}
func (p *exporter) paramList(params *Type, numbered bool) {
if !params.IsStruct() || !params.Funarg {
if !params.IsFuncArgStruct() {
Fatalf("exporter: parameter list expected")
}

View File

@ -1435,7 +1435,7 @@ func esccall(e *EscState, n *Node, up *Node) {
ll := n.List
if n.List.Len() == 1 {
a := n.List.First()
if a.Type.IsStruct() && a.Type.Funarg { // f(g()).
if a.Type.IsFuncArgStruct() { // f(g())
ll = e.nodeEscState(a).Escretval
}
}

View File

@ -592,7 +592,7 @@ func dumpasmhdr() {
case OTYPE:
t := n.Type
if !t.IsStruct() || t.Map != nil || t.Funarg {
if !t.IsStruct() || t.Map != nil || t.IsFuncArgStruct() {
break
}
fmt.Fprintf(b, "#define %s__size %d\n", t.Sym.Name, int(t.Width))

View File

@ -690,7 +690,7 @@ func typefmt(t *Type, flag FmtFlag) string {
}
var buf bytes.Buffer
if t.Funarg {
if t.IsFuncArgStruct() {
buf.WriteString("(")
var flag1 FmtFlag
if fmtmode == FTypeId || fmtmode == FErr { // no argument names on function signature, and no "noescape"/"nosplit" tags

View File

@ -541,7 +541,7 @@ func nodarg(t interface{}, fp int) *Node {
switch t := t.(type) {
case *Type:
// entire argument struct, not just one arg
if !t.IsStruct() || !t.Funarg {
if !t.IsFuncArgStruct() {
Fatalf("nodarg: bad type %v", t)
}
n = Nod(ONAME, nil, nil)

View File

@ -324,7 +324,7 @@ func ismulticall(l Nodes) bool {
// Copyret emits t1, t2, ... = n, where n is a function call,
// and then returns the list t1, t2, ....
func copyret(n *Node, order *Order) []*Node {
if !n.Type.IsStruct() || !n.Type.Funarg {
if !n.Type.IsFuncArgStruct() {
Fatalf("copyret %v %d", n.Type, n.Left.Type.Results().NumFields())
}

View File

@ -127,7 +127,7 @@ type Type struct {
Chan ChanDir
Trecur uint8 // to detect loops
Printed bool
Funarg bool // on TSTRUCT and TFIELD
Funarg bool // TSTRUCT only: whether this struct represents function parameters
Local bool // created in this file
Deferwidth bool
Broke bool // broken type definition.
@ -566,6 +566,11 @@ func (t *Type) SetNname(n *Node) {
t.nname = n
}
// IsFuncArgStruct reports whether t is a struct representing function parameters.
func (t *Type) IsFuncArgStruct() bool {
return t.Etype == TSTRUCT && t.Funarg
}
func (t *Type) Methods() *Fields {
// TODO(mdempsky): Validate t?
return &t.methods

View File

@ -1607,7 +1607,7 @@ OpSwitch:
// Unpack multiple-return result before type-checking.
var funarg *Type
if t.IsStruct() && t.Funarg {
if t.IsFuncArgStruct() {
funarg = t
t = t.Field(0).Type
}
@ -2159,7 +2159,7 @@ OpSwitch:
}
t := n.Type
if t != nil && !t.Funarg && n.Op != OTYPE {
if t != nil && !t.IsFuncArgStruct() && n.Op != OTYPE {
switch t.Etype {
case TFUNC, // might have TANY; wait until its called
TANY,
@ -2611,7 +2611,7 @@ func typecheckaste(op Op, call *Node, isddd bool, tstruct *Type, nl Nodes, desc
if nl.Len() == 1 {
n = nl.First()
if n.Type != nil {
if n.Type.IsStruct() && n.Type.Funarg {
if n.Type.IsFuncArgStruct() {
if !hasddd(tstruct) {
n1 := tstruct.NumFields()
n2 := n.Type.NumFields()
@ -3359,7 +3359,7 @@ func typecheckas2(n *Node) {
}
switch r.Op {
case OCALLMETH, OCALLINTER, OCALLFUNC:
if !r.Type.IsStruct() || !r.Type.Funarg {
if !r.Type.IsFuncArgStruct() {
break
}
cr = r.Type.NumFields()

View File

@ -1783,7 +1783,7 @@ func ascompatte(op Op, call *Node, isddd bool, nl *Type, lr []*Node, fp int, ini
var nn []*Node
// f(g()) where g has multiple return values
if r != nil && len(lr) <= 1 && r.Type.IsStruct() && r.Type.Funarg {
if r != nil && len(lr) <= 1 && r.Type.IsFuncArgStruct() {
// optimization - can do block copy
if eqtypenoname(r.Type, nl) {
arg := nodarg(nl, fp)