Passes toolstash -cmp.
Change-Id: I83af544974e1e91e0810e13321afb3e665dcdf12
Reviewed-on: https://go-review.googlesource.com/21248
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
case TMAP: // implemented as pointer
w = int64(Widthptr)
-
- checkwidth(t.Type)
+ checkwidth(t.Val())
checkwidth(t.Key())
case TFORW: // should have been filled in
case TMAP:
p.tag(mapTag)
- p.typ(t.Key()) // key
- p.typ(t.Type) // val
+ p.typ(t.Key())
+ p.typ(t.Val())
case TCHAN:
p.tag(chanTag)
return "chan " + t.Type.String()
case TMAP:
- return "map[" + t.Key().String() + "]" + t.Type.String()
+ return "map[" + t.Key().String() + "]" + t.Val().String()
case TINTER:
var buf bytes.Buffer
// Format the bucket struct for map[x]y as map.bucket[x]y.
// This avoids a recursive print that generates very long names.
if t.Map.Bucket == t {
- return "map.bucket[" + t.Map.Key().String() + "]" + t.Map.Type.String()
+ return "map.bucket[" + t.Map.Key().String() + "]" + t.Map.Val().String()
}
if t.Map.Hmap == t {
- return "map.hdr[" + t.Map.Key().String() + "]" + t.Map.Type.String()
+ return "map.hdr[" + t.Map.Key().String() + "]" + t.Map.Val().String()
}
if t.Map.Hiter == t {
- return "map.iter[" + t.Map.Key().String() + "]" + t.Map.Type.String()
+ return "map.iter[" + t.Map.Key().String() + "]" + t.Map.Val().String()
}
Yyerror("unknown internal map type")
case TMAP:
t1 = t.Key()
- t2 = t.Type
+ t2 = t.Val()
case TCHAN:
if t.Chan&Crecv == 0 {
fn := syslook("mapiterinit")
- fn = substArgTypes(fn, t.Key(), t.Type, th)
+ fn = substArgTypes(fn, t.Key(), t.Val(), th)
init = append(init, mkcall1(fn, nil, nil, typename(t), ha, Nod(OADDR, hit, nil)))
n.Left = Nod(ONE, NodSym(ODOT, hit, keysym), nodnil())
bucket := typ(TSTRUCT)
keytype := t.Key()
- valtype := t.Type
+ valtype := t.Val()
dowidth(keytype)
dowidth(valtype)
if keytype.Width > MAXKEYSIZE {
// so if the struct needs 64-bit padding (because a key or value does)
// then it would end with an extra 32-bit padding field.
// Preempt that by emitting the padding here.
- if int(t.Type.Align) > Widthptr || int(t.Key().Align) > Widthptr {
+ if int(t.Val().Align) > Widthptr || int(t.Key().Align) > Widthptr {
field = append(field, makefield("pad", Types[TUINTPTR]))
}
// the type of the overflow field to uintptr in this case.
// See comment on hmap.overflow in ../../../../runtime/hashmap.go.
otyp := Ptrto(bucket)
- if !haspointers(t.Type) && !haspointers(t.Key()) && t.Type.Width <= MAXVALSIZE && t.Key().Width <= MAXKEYSIZE {
+ if !haspointers(t.Val()) && !haspointers(t.Key()) && t.Val().Width <= MAXVALSIZE && t.Key().Width <= MAXKEYSIZE {
otyp = Types[TUINTPTR]
}
ovf := makefield("overflow", otyp)
// must match ../../../../runtime/hashmap.go:hiter.
var field [12]*Field
field[0] = makefield("key", Ptrto(t.Key()))
- field[1] = makefield("val", Ptrto(t.Type))
+ field[1] = makefield("val", Ptrto(t.Val()))
field[2] = makefield("t", Ptrto(Types[TUINT8]))
field[3] = makefield("h", Ptrto(hmap(t)))
field[4] = makefield("buckets", Ptrto(mapbucket(t)))
// ../../../../runtime/type.go:/mapType
case TMAP:
s1 := dtypesym(t.Key())
- s2 := dtypesym(t.Type)
+ s2 := dtypesym(t.Val())
s3 := dtypesym(mapbucket(t))
s4 := dtypesym(hmap(t))
ot = dcommontype(s, ot, t)
ot = duint8(s, ot, 0) // not indirect
}
- if t.Type.Width > MAXVALSIZE {
+ if t.Val().Width > MAXVALSIZE {
ot = duint8(s, ot, uint8(Widthptr))
ot = duint8(s, ot, 1) // indirect
} else {
- ot = duint8(s, ot, uint8(t.Type.Width))
+ ot = duint8(s, ot, uint8(t.Val().Width))
ot = duint8(s, ot, 0) // not indirect
}
// build type [count]struct { a Tindex, b Tvalue }
t := n.Type
tk := t.Key()
- tv := t.Type
+ tv := t.Val()
syma := Lookup("a")
symb := Lookup("b")
// use temporary so that mapassign1 can have addressable key, val.
if key == nil {
key = temp(var_.Type.Key())
- val = temp(var_.Type.Type)
+ val = temp(var_.Type.Val())
}
setlineno(r.Left)
if !eqtype1(t1.Key(), t2.Key(), assumedEqual) {
return false
}
+ return eqtype1(t1.Val(), t2.Val(), assumedEqual)
}
return eqtype1(t1.Type, t2.Type, assumedEqual)
return t.Down
}
+// Val returns the value type of map type t.
+func (t *Type) Val() *Type {
+ t.wantEtype(TMAP)
+ return t.Type
+}
+
func (t *Type) Methods() *Fields {
// TODO(mdempsky): Validate t?
return &t.methods
switch t.Etype {
case TMAP:
- if c := t.Down.cmp(x.Down); c != ssa.CMPeq {
+ if c := t.Key().cmp(x.Key()); c != ssa.CMPeq {
return c
}
+ return t.Val().cmp(x.Val())
case TPTR32, TPTR64:
// No special cases for these two, they are handled
panic(e)
}
- // Common element type comparison for TARRAY, TCHAN, TMAP, TPTR32, and TPTR64.
+ // Common element type comparison for TARRAY, TCHAN, TPTR32, and TPTR64.
return t.Type.cmp(x.Type)
}
if n.Right.Type != nil {
n.Right = assignconv(n.Right, t.Key(), "map index")
}
- n.Type = t.Type
+ n.Type = t.Val()
n.Op = OINDEXMAP
}
}
r = l.Right
- pushtype(r, t.Type)
+ pushtype(r, t.Val())
r = typecheck(r, Erv)
- r = defaultlit(r, t.Type)
- l.Right = assignconv(r, t.Type, "map value")
+ r = defaultlit(r, t.Val())
+ l.Right = assignconv(r, t.Val(), "map value")
}
n.Op = OMAPLIT
r.Right = walkexpr(r.Right, init)
t := r.Left.Type
p := ""
- if t.Type.Width <= 128 { // Check ../../runtime/hashmap.go:maxValueSize before changing.
+ if t.Val().Width <= 128 { // Check ../../runtime/hashmap.go:maxValueSize before changing.
switch algtype(t.Key()) {
case AMEM32:
p = "mapaccess2_fast32"
// don't generate a = *var if a is _
if !isblank(a) {
- var_ := temp(Ptrto(t.Type))
+ var_ := temp(Ptrto(t.Val()))
var_.Typecheck = 1
n.List.SetIndex(0, var_)
n = walkexpr(n, init)
t := n.Left.Type
p := ""
- if t.Type.Width <= 128 { // Check ../../runtime/hashmap.go:maxValueSize before changing.
+ if t.Val().Width <= 128 { // Check ../../runtime/hashmap.go:maxValueSize before changing.
switch algtype(t.Key()) {
case AMEM32:
p = "mapaccess1_fast32"
p = "mapaccess1"
}
- n = mkcall1(mapfn(p, t), Ptrto(t.Type), init, typename(t), n.Left, key)
+ n = mkcall1(mapfn(p, t), Ptrto(t.Val()), init, typename(t), n.Left, key)
n = Nod(OIND, n, nil)
- n.Type = t.Type
+ n.Type = t.Val()
n.Typecheck = 1
case ORECV:
}
fn := syslook("makemap")
- fn = substArgTypes(fn, hmap(t), mapbucket(t), t.Key(), t.Type)
+ fn = substArgTypes(fn, hmap(t), mapbucket(t), t.Key(), t.Val())
n = mkcall1(fn, n.Type, init, typename(n.Type), conv(n.Left, Types[TINT64]), a, r)
case OMAKESLICE:
Fatalf("mapfn %v", t)
}
fn := syslook(name)
- fn = substArgTypes(fn, t.Key(), t.Type, t.Key(), t.Type)
+ fn = substArgTypes(fn, t.Key(), t.Val(), t.Key(), t.Val())
return fn
}
Fatalf("mapfn %v", t)
}
fn := syslook(name)
- fn = substArgTypes(fn, t.Key(), t.Type, t.Key())
+ fn = substArgTypes(fn, t.Key(), t.Val(), t.Key())
return fn
}