mirror of
https://github.com/golang/go
synced 2024-09-29 16:24:28 -06:00
cmd/compile/internal/types2: remove structuralString in favor of inlined code
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>
This commit is contained in:
parent
96c94c2c83
commit
23f653df96
@ -334,7 +334,26 @@ func (check *Checker) builtin(x *operand, call *syntax.CallExpr, id builtinId) (
|
||||
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)
|
||||
|
@ -80,30 +80,6 @@ func structuralType(typ Type) Type {
|
||||
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)
|
||||
|
Loading…
Reference in New Issue
Block a user