cmd/compile: add Type.Elem
This removes almost all direct access to
Type’s heavily overloaded Type field.
Mostly generated by eg, manually checked.
Significant manual changes:
* reflect.go's typPkg used Type indiscriminately.
Use it only for specific etypes.
* gen.go's visitComponents contained a usage of Type
with structs. Using Type for structs no longer
occurs, and the Fatal contained therein has not triggered,
so it has been axed.
* Scary code in cgen.go's cgen_slice is now explicitly scary.
Passes toolstash -cmp.
Change-Id: I2dbfb3c959da7ae239f964d83898c204affcabc6
Reviewed-on: https://go-review.googlesource.com/21331
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go
index 7180538..54aa52a 100644
--- a/src/cmd/compile/internal/gc/walk.go
+++ b/src/cmd/compile/internal/gc/walk.go
@@ -365,7 +365,7 @@
}
t := n.Type
- return Smallintconst(l) && Smallintconst(r) && (t.Type.Width == 0 || r.Val().U.(*Mpint).Int64() < (1<<16)/t.Type.Width)
+ return Smallintconst(l) && Smallintconst(r) && (t.Elem().Width == 0 || r.Val().U.(*Mpint).Int64() < (1<<16)/t.Elem().Width)
}
// walk the whole tree of the body of an
@@ -518,7 +518,7 @@
case ODOTPTR:
usefield(n)
- if n.Op == ODOTPTR && n.Left.Type.Type.Width == 0 {
+ if n.Op == ODOTPTR && n.Left.Type.Elem().Width == 0 {
// No actual copy will be generated, so emit an explicit nil check.
n.Left = cheapexpr(n.Left, init)
@@ -542,7 +542,7 @@
t := n.Left.Type
if Isptr[t.Etype] {
- t = t.Type
+ t = t.Elem()
}
if Isfixedarray(t) {
safeexpr(n.Left, init)
@@ -1155,7 +1155,7 @@
}
t := n.Left.Type
if t != nil && Isptr[t.Etype] {
- t = t.Type
+ t = t.Elem()
}
if Isfixedarray(t) {
n.Bounded = bounded(r, t.Bound)
@@ -1268,10 +1268,10 @@
case ONEW:
if n.Esc == EscNone {
- if n.Type.Type.Width >= 1<<16 {
+ if n.Type.Elem().Width >= 1<<16 {
Fatalf("large ONEW with EscNone: %v", n)
}
- r := temp(n.Type.Type)
+ r := temp(n.Type.Elem())
r = Nod(OAS, r, nil) // zero temp
r = typecheck(r, Etop)
init.Append(r)
@@ -1279,7 +1279,7 @@
r = typecheck(r, Erv)
n = r
} else {
- n = callnew(n.Type.Type)
+ n = callnew(n.Type.Elem())
}
// If one argument to the comparison is an empty string,
@@ -1410,7 +1410,7 @@
}
// var arr [r]T
// n = arr[:l]
- t = aindex(r, t.Type) // [r]T
+ t = aindex(r, t.Elem()) // [r]T
var_ := temp(t)
a := Nod(OAS, var_, nil) // zero temp
a = typecheck(a, Etop)
@@ -1424,7 +1424,7 @@
// makeslice(t *Type, nel int64, max int64) (ary []any)
fn := syslook("makeslice")
- fn = substArgTypes(fn, t.Type) // any-1
+ fn = substArgTypes(fn, t.Elem()) // any-1
n = mkcall1(fn, n.Type, init, typename(n.Type), conv(l, Types[TINT64]), conv(r, Types[TINT64]))
}
@@ -1538,7 +1538,7 @@
case OSEND:
n1 := n.Right
- n1 = assignconv(n1, n.Left.Type.Type, "chan send")
+ n1 = assignconv(n1, n.Left.Type.Elem(), "chan send")
n1 = walkexpr(n1, init)
n1 = Nod(OADDR, n1, nil)
n = mkcall1(chanfn("chansend1", 2, n.Left.Type), nil, init, typename(n.Left.Type), n.Left, n1)
@@ -1715,7 +1715,7 @@
esc = ddd.Esc
}
- tslice := typSlice(l.Type.Type)
+ tslice := typSlice(l.Type.Elem())
var n *Node
if len(lr0) == 0 {
@@ -2633,9 +2633,9 @@
default:
Fatalf("chanfn %d", n)
case 1:
- fn = substArgTypes(fn, t.Type)
+ fn = substArgTypes(fn, t.Elem())
case 2:
- fn = substArgTypes(fn, t.Type, t.Type)
+ fn = substArgTypes(fn, t.Elem(), t.Elem())
}
return fn
}
@@ -2772,7 +2772,7 @@
// instantiate growslice(Type*, []any, int) []any
fn := syslook("growslice")
- fn = substArgTypes(fn, s.Type.Type, s.Type.Type)
+ fn = substArgTypes(fn, s.Type.Elem(), s.Type.Elem())
// s = growslice(T, s, n)
nif.Nbody.Set1(Nod(OAS, s, mkcall1(fn, s.Type, &nif.Ninit, typename(s.Type), s, nn)))
@@ -2783,7 +2783,7 @@
nt.Etype = 1
l = append(l, Nod(OAS, s, nt))
- if haspointers(l1.Type.Type) {
+ if haspointers(l1.Type.Elem()) {
// copy(s[len(l1):], l2)
nptr1 := Nod(OSLICE, s, Nod(OKEY, Nod(OLEN, l1, nil), nil))
@@ -2793,7 +2793,7 @@
fn = substArgTypes(fn, l1.Type, l2.Type)
var ln Nodes
ln.Set(l)
- nt := mkcall1(fn, Types[TINT], &ln, typename(l1.Type.Type), nptr1, nptr2)
+ nt := mkcall1(fn, Types[TINT], &ln, typename(l1.Type.Elem()), nptr1, nptr2)
l = append(ln.Slice(), nt)
} else if instrumenting {
// rely on runtime to instrument copy.
@@ -2811,7 +2811,7 @@
fn = substArgTypes(fn, l1.Type, l2.Type)
var ln Nodes
ln.Set(l)
- nt := mkcall1(fn, Types[TINT], &ln, nptr1, nptr2, Nodintconst(s.Type.Type.Width))
+ nt := mkcall1(fn, Types[TINT], &ln, nptr1, nptr2, Nodintconst(s.Type.Elem().Width))
l = append(ln.Slice(), nt)
} else {
// memmove(&s[len(l1)], &l2[0], len(l2)*sizeof(T))
@@ -2823,13 +2823,13 @@
nptr2 := Nod(OSPTR, l2, nil)
fn := syslook("memmove")
- fn = substArgTypes(fn, s.Type.Type, s.Type.Type)
+ fn = substArgTypes(fn, s.Type.Elem(), s.Type.Elem())
var ln Nodes
ln.Set(l)
nwid := cheapexpr(conv(Nod(OLEN, l2, nil), Types[TUINTPTR]), &ln)
- nwid = Nod(OMUL, nwid, Nodintconst(s.Type.Type.Width))
+ nwid = Nod(OMUL, nwid, Nodintconst(s.Type.Elem().Width))
nt := mkcall1(fn, nil, &ln, nptr1, nptr2, nwid)
l = append(ln.Slice(), nt)
}
@@ -2883,7 +2883,7 @@
// Resolve slice type of multi-valued return.
if Istype(nsrc.Type, TSTRUCT) {
- nsrc.Type = nsrc.Type.Type.Type
+ nsrc.Type = nsrc.Type.Elem().Elem()
}
argc := n.List.Len() - 1
if argc < 1 {
@@ -2906,7 +2906,7 @@
nx.Left = Nod(OLT, Nod(OSUB, Nod(OCAP, ns, nil), Nod(OLEN, ns, nil)), na)
fn := syslook("growslice") // growslice(<type>, old []T, mincap int) (ret []T)
- fn = substArgTypes(fn, ns.Type.Type, ns.Type.Type)
+ fn = substArgTypes(fn, ns.Type.Elem(), ns.Type.Elem())
nx.Nbody.Set1(Nod(OAS, ns,
mkcall1(fn, ns.Type, &nx.Ninit, typename(ns.Type), ns,
@@ -2949,9 +2949,9 @@
// Also works if b is a string.
//
func copyany(n *Node, init *Nodes, runtimecall bool) *Node {
- if haspointers(n.Left.Type.Type) {
+ if haspointers(n.Left.Type.Elem()) {
fn := writebarrierfn("typedslicecopy", n.Left.Type, n.Right.Type)
- return mkcall1(fn, n.Type, init, typename(n.Left.Type.Type), n.Left, n.Right)
+ return mkcall1(fn, n.Type, init, typename(n.Left.Type.Elem()), n.Left, n.Right)
}
if runtimecall {
@@ -2962,7 +2962,7 @@
fn = syslook("slicecopy")
}
fn = substArgTypes(fn, n.Left.Type, n.Right.Type)
- return mkcall1(fn, n.Type, init, n.Left, n.Right, Nodintconst(n.Left.Type.Type.Width))
+ return mkcall1(fn, n.Type, init, n.Left, n.Right, Nodintconst(n.Left.Type.Elem().Width))
}
n.Left = walkexpr(n.Left, init)
@@ -2991,10 +2991,10 @@
// Call memmove.
fn := syslook("memmove")
- fn = substArgTypes(fn, nl.Type.Type, nl.Type.Type)
+ fn = substArgTypes(fn, nl.Type.Elem(), nl.Type.Elem())
nwid := temp(Types[TUINTPTR])
l = append(l, Nod(OAS, nwid, conv(nlen, Types[TUINTPTR])))
- nwid = Nod(OMUL, nwid, Nodintconst(nl.Type.Type.Width))
+ nwid = Nod(OMUL, nwid, Nodintconst(nl.Type.Elem().Width))
l = append(l, mkcall1(fn, nil, init, nto, nfrm, nwid))
typecheckslice(l, Etop)
@@ -3136,7 +3136,7 @@
}
var expr *Node
- if t.Etype == TARRAY && t.Bound <= 4 && issimple[t.Type.Etype] {
+ if t.Etype == TARRAY && t.Bound <= 4 && issimple[t.Elem().Etype] {
// Four or fewer elements of a basic type.
// Unroll comparisons.
var li *Node
@@ -3773,7 +3773,7 @@
t := n.Left.Type
if Isptr[t.Etype] {
- t = t.Type
+ t = t.Elem()
}
field := dotField[typeSym{t.Orig, n.Sym}]
if field == nil {
@@ -3785,7 +3785,7 @@
outer := n.Left.Type
if Isptr[outer.Etype] {
- outer = outer.Type
+ outer = outer.Elem()
}
if outer.Sym == nil {
Yyerror("tracked field must be in named struct type")