This removes all access to Type.Bound
from outside type.go.
Update sinit to make a new type rather than
copy and mutate.
Update bimport to create a new slice type
instead of mutating TDDDFIELD.
These are rare, so the extra allocs are nominal.
I’m not happy about having a setter,
but it appears the most practical route
forward at the moment, and it only has a few uses.
Passes toolstash -cmp.
Change-Id: I174f07c8f336afc656904bde4bdbde4f3ef0db96
Reviewed-on: https://go-review.googlesource.com/21423
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
case arrayTag, sliceTag:
t = p.newtyp(TARRAY)
- t.Bound = sliceBound
if i == arrayTag {
- t.Bound = p.int64()
+ t.SetNumElem(p.int64())
+ } else {
+ t.SetNumElem(sliceBound)
}
t.Type = p.typ()
case dddTag:
t = p.newtyp(TDDDFIELD)
- t.Bound = sliceBound
t.Type = p.typ()
case structTag:
isddd := false
if typ.Etype == TDDDFIELD {
- // TDDDFIELD indicates ... type
- // TODO(mdempsky): Fix Type rekinding.
- typ.Etype = TARRAY
+ // TDDDFIELD indicates wrapped ... slice type
+ typ = typSlice(typ.Wrapped())
isddd = true
}
}
func slicelit(ctxt int, n *Node, var_ *Node, init *Nodes) {
- // make an array type
- t := n.Type.Copy()
- t.Bound = n.Right.Int()
- t.Width = 0
- t.Sym = nil
- t.Haspointers = 0
+ // make an array type corresponding the number of elements we have
+ t := typArray(n.Type.Elem(), n.Right.Int())
dowidth(t)
if ctxt != 0 {
return t.Bound
}
+// SetNumElem sets the number of elements in an array type.
+// It should not be used if at all possible.
+// Create a new array/slice/dddArray with typX instead.
+// TODO(josharian): figure out how to get rid of this.
+func (t *Type) SetNumElem(n int64) {
+ t.wantEtype(TARRAY)
+ t.Bound = n
+}
+
func (t *Type) IsMemory() bool { return false }
func (t *Type) IsFlags() bool { return false }
func (t *Type) IsVoid() bool { return false }
setlineno(l)
Yyerror("array index %d out of bounds [0:%d]", length-1, t.NumElem())
// suppress any further errors out of bounds errors for the same type by pretending it is a slice
- t.Bound = sliceBound
+ t.SetNumElem(sliceBound)
}
}
}
if t.isDDDArray() {
- t.Bound = length
+ t.SetNumElem(length)
}
if t.IsSlice() {
n.Right = Nodintconst(length)