1
0
mirror of https://github.com/golang/go synced 2024-11-18 03:54:50 -07:00

cmd/compile: canonicalize empty interface types

Mapping all empty interfaces onto the same Type
allows better reuse of the ptrTo and sliceOf
Type caches for *interface{} and []interface{}.

This has little compiler performance impact now,
but it will be helpful in the future,
when we will eagerly populate some of those caches.

Passes toolstash-check.

Change-Id: I17daee599a129b0b2f5f3025c1be43d569d6782c
Reviewed-on: https://go-review.googlesource.com/38344
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
Josh Bleecher Snyder 2017-03-18 14:39:48 -07:00
parent 872db79989
commit 62947bedd2
2 changed files with 9 additions and 2 deletions

View File

@ -526,11 +526,15 @@ func (p *importer) typ() *Type {
functypefield0(t, nil, params, result)
case interfaceTag:
t = p.newtyp(TINTER)
if p.int() != 0 {
formatErrorf("unexpected embedded interface")
}
t.SetFields(p.methodList())
if ml := p.methodList(); len(ml) == 0 {
t = Types[TINTER]
} else {
t = p.newtyp(TINTER)
t.SetFields(ml)
}
checkwidth(t)
case mapTag:

View File

@ -860,6 +860,9 @@ func interfacefield(n *Node) *Field {
}
func tointerface(l []*Node) *Type {
if len(l) == 0 {
return Types[TINTER]
}
t := typ(TINTER)
tointerface0(t, l)
return t