1
0
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:
Robert Griesemer 2021-11-10 13:36:23 -08:00
parent 96c94c2c83
commit 23f653df96
2 changed files with 20 additions and 25 deletions

View File

@ -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)

View File

@ -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)