type InstExpr struct {
miniExpr
X Node
- Targs []Node
+ Targs []Ntype
}
-func NewInstExpr(pos src.XPos, op Op, x Node, targs []Node) *InstExpr {
+func NewInstExpr(pos src.XPos, op Op, x Node, targs []Ntype) *InstExpr {
n := &InstExpr{X: x, Targs: targs}
n.pos = pos
n.op = op
func (n *InstExpr) copy() Node {
c := *n
c.init = copyNodes(c.init)
- c.Targs = copyNodes(c.Targs)
+ c.Targs = copyNtypes(c.Targs)
return &c
}
func (n *InstExpr) doChildren(do func(Node) bool) bool {
if n.X != nil && do(n.X) {
return true
}
- if doNodes(n.Targs, do) {
+ if doNtypes(n.Targs, do) {
return true
}
return false
if n.X != nil {
n.X = edit(n.X).(Node)
}
- editNodes(n.Targs, edit)
+ editNtypes(n.Targs, edit)
}
func (n *JumpTableStmt) Format(s fmt.State, verb rune) { fmtNode(n, s, verb) }
}
}
}
+
+func copyNtypes(list []Ntype) []Ntype {
+ if list == nil {
+ return nil
+ }
+ c := make([]Ntype, len(list))
+ copy(c, list)
+ return c
+}
+func doNtypes(list []Ntype, do func(Node) bool) bool {
+ for _, x := range list {
+ if x != nil && do(x) {
+ return true
+ }
+ }
+ return false
+}
+func editNtypes(list []Ntype, edit func(Node) Node) {
+ for i, x := range list {
+ if x != nil {
+ list[i] = edit(x).(Ntype)
+ }
+ }
+}
// substType does a normal type substition, but tparams is in the form of a field
// list, and targs is in terms of a slice of type nodes. substType records any newly
// instantiated types into g.instTypeList.
-func (g *irgen) substType(typ *types.Type, tparams *types.Type, targs []ir.Node) *types.Type {
+func (g *irgen) substType(typ *types.Type, tparams *types.Type, targs []ir.Ntype) *types.Type {
fields := tparams.FieldSlice()
tparams1 := make([]*types.Type, len(fields))
for i, f := range fields {
typed(method.Type(), n)
xt := deref(x.Type())
- targs := make([]ir.Node, len(xt.RParams()))
+ targs := make([]ir.Ntype, len(xt.RParams()))
for i := range targs {
targs[i] = ir.TypeNode(xt.RParams()[i])
}
if inst, ok := g.info.Instances[name]; ok {
// This is the case where inferring types required the
// types of the function arguments.
- targs := make([]ir.Node, inst.TypeArgs.Len())
+ targs := make([]ir.Ntype, inst.TypeArgs.Len())
for i := range targs {
targs[i] = ir.TypeNode(g.typ(inst.TypeArgs.At(i)))
}
}
// hasShapeNodes returns true if the type of any node in targs has a shape.
-func hasShapeNodes(targs []ir.Node) bool {
+func hasShapeNodes(targs []ir.Ntype) bool {
for _, n := range targs {
if n.Type().HasShape() {
return true
case ir.OFUNCINST:
pos := r.pos()
x := r.expr()
- ntargs := r.uint64()
- var targs []ir.Node
- if ntargs > 0 {
- targs = make([]ir.Node, ntargs)
- for i := range targs {
- targs[i] = ir.TypeNode(r.typ())
- }
+ targs := make([]ir.Ntype, r.uint64())
+ for i := range targs {
+ targs[i] = ir.TypeNode(r.typ())
}
n := ir.NewInstExpr(pos, ir.OFUNCINST, x, targs)
n.SetType(r.typ())
// TypesOf converts a list of nodes to a list
// of types of those nodes.
-func TypesOf(x []ir.Node) []*types.Type {
+func TypesOf(x []ir.Ntype) []*types.Type {
r := make([]*types.Type, len(x))
for i, n := range x {
r[i] = n.Type()