structuralString was used only in one place (for built-in copy).
Remove it in favor of custom and more efficient inlined code.
Follow-up on feedback received for CL 363075.
Change-Id: Ic5857c47255c5c712be7971aae4542fef9960fe6
Reviewed-on: https://go-review.googlesource.com/c/go/+/363154
Trust: Robert Griesemer <gri@golang.org>
Run-TryBot: Robert Griesemer <gri@golang.org>
Reviewed-by: Robert Findley <rfindley@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
if y.mode == invalid {
return
}
- src, _ := structuralString(y.typ).(*Slice)
+ // src, _ := structuralType(y.typ).(*Slice); but also accepts strings
+ var src *Slice
+ var elem Type // == src.elem if valid
+ if underIs(y.typ, func(u Type) bool {
+ switch u := u.(type) {
+ case *Basic:
+ if isString(u) && (elem == nil || Identical(elem, universeByte)) {
+ elem = universeByte
+ return true
+ }
+ case *Slice:
+ if elem == nil || Identical(elem, u.elem) {
+ elem = u.elem
+ return true
+ }
+ }
+ return false
+ }) {
+ src = NewSlice(elem)
+ }
if dst == nil || src == nil {
check.errorf(x, invalidArg+"copy expects slice arguments; found %s and %s", x, &y)
return nil
}
-// structuralString is like structuralType but also considers []byte
-// and string as "identical". In this case, if successful, the result
-// is always []byte.
-func structuralString(typ Type) Type {
- var su Type
- if underIs(typ, func(u Type) bool {
- if isString(u) {
- u = NewSlice(universeByte)
- }
- if su != nil {
- u = match(su, u)
- if u == nil {
- return false
- }
- }
- // su == nil || match(su, u) != nil
- su = u
- return true
- }) {
- return su
- }
- return nil
-}
-
// If t is a defined type, asNamed returns that type (possibly after resolving it), otherwise it returns nil.
func asNamed(t Type) *Named {
e, _ := t.(*Named)