From: Robert Griesemer Date: Sat, 13 Nov 2021 19:02:51 +0000 (-0800) Subject: cmd/compile/internal/types2: optimize common case in structuralType X-Git-Tag: go1.18beta1~318 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=0a39e4a89d26d8375bb5877f736dcc0047894060;p=gostls13.git cmd/compile/internal/types2: optimize common case in structuralType Most of the time we don't have a type parameter. Avoid using a closure in that case. While at it, rename argument from typ to t (to match style in that file), and clarify the doc string. Change-Id: Ie62821073f60f353526263f8b380bad9f72d842e Reviewed-on: https://go-review.googlesource.com/c/go/+/363668 Trust: Robert Griesemer Run-TryBot: Robert Griesemer TryBot-Result: Go Bot Reviewed-by: Robert Findley --- diff --git a/src/cmd/compile/internal/types2/type.go b/src/cmd/compile/internal/types2/type.go index af195c08a4..39737d47a7 100644 --- a/src/cmd/compile/internal/types2/type.go +++ b/src/cmd/compile/internal/types2/type.go @@ -56,15 +56,20 @@ func match(x, y Type) Type { return nil } -// If typ is a type parameter, structuralType returns the single underlying -// type of all types in the corresponding type constraint if it exists, or -// nil otherwise. If the type set contains only unrestricted and restricted -// channel types (with identical element types), the single underlying type -// is the restricted channel type if the restrictions are always the same. -// If typ is not a type parameter, structuralType returns the underlying type. -func structuralType(typ Type) Type { +// If t is not a type parameter, structuralType returns the underlying type. +// If t is a type parameter, structuralType returns the single underlying +// type of all types in its type set if it exists, or nil otherwise. If the +// type set contains only unrestricted and restricted channel types (with +// identical element types), the single underlying type is the restricted +// channel type if the restrictions are always the same, or nil otherwise. +func structuralType(t Type) Type { + tpar, _ := t.(*TypeParam) + if tpar == nil { + return under(t) + } + var su Type - if underIs(typ, func(u Type) bool { + if tpar.underIs(func(u Type) bool { if u == nil { return false }