1
0
mirror of https://github.com/golang/go synced 2024-11-21 16:34:42 -07:00

debug/gosym,cmd/compile/internal/ir: use hash to identify duplicate unexported function

This commit is contained in:
Zxilly 2024-07-02 04:38:29 +08:00
parent 707eba9b94
commit b36aefc95e
No known key found for this signature in database
GPG Key ID: 47AB1DEC841BC6A2
3 changed files with 37 additions and 4 deletions

View File

@ -13,6 +13,8 @@ import (
"fmt" "fmt"
"go/constant" "go/constant"
"go/token" "go/token"
"hash/fnv"
"strconv"
) )
// An Expr is a Node that can appear as an expression. // An Expr is a Node that can appear as an expression.
@ -1183,17 +1185,21 @@ func MethodSymSuffix(recv *types.Type, msym *types.Sym, suffix string) *types.Sy
fmt.Fprintf(&b, "%-S", recv) fmt.Fprintf(&b, "%-S", recv)
} }
b.WriteString(".")
b.WriteString(msym.Name)
// A particular receiver type may have multiple non-exported // A particular receiver type may have multiple non-exported
// methods with the same name. To disambiguate them, include a // methods with the same name. To disambiguate them, include a
// package qualifier for names that came from a different // package qualifier for names that came from a different
// package than the receiver type. // package than the receiver type.
if !types.IsExported(msym.Name) && msym.Pkg != rpkg { if !types.IsExported(msym.Name) && msym.Pkg != rpkg {
b.WriteString(".") b.WriteString("+")
b.WriteString(msym.Pkg.Prefix)
h := fnv.New32()
h.Write([]byte(msym.Pkg.Prefix))
b.WriteString(strconv.FormatUint(uint64(h.Sum32()), 16))
} }
b.WriteString(".")
b.WriteString(msym.Name)
b.WriteString(suffix) b.WriteString(suffix)
return rpkg.LookupBytes(b.Bytes()) return rpkg.LookupBytes(b.Bytes())
} }

View File

@ -60,6 +60,7 @@ func endtest() {
// skipIfNotELF skips the test if we are not running on an ELF system. // skipIfNotELF skips the test if we are not running on an ELF system.
// These tests open and examine the test binary, and use elf.Open to do so. // These tests open and examine the test binary, and use elf.Open to do so.
func skipIfNotELF(t *testing.T) { func skipIfNotELF(t *testing.T) {
t.Helper()
switch runtime.GOOS { switch runtime.GOOS {
case "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris", "illumos": case "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris", "illumos":
// OK. // OK.

View File

@ -10,6 +10,7 @@ import (
) )
func assertString(t *testing.T, dsc, out, tgt string) { func assertString(t *testing.T, dsc, out, tgt string) {
t.Helper()
if out != tgt { if out != tgt {
t.Fatalf("Expected: %q Actual: %q for %s", tgt, out, dsc) t.Fatalf("Expected: %q Actual: %q for %s", tgt, out, dsc)
} }
@ -85,3 +86,28 @@ func TestIssue29551(t *testing.T) {
assertString(t, fmt.Sprintf("package of %q", tc.sym.Name), tc.sym.PackageName(), tc.pkgName) assertString(t, fmt.Sprintf("package of %q", tc.sym.Name), tc.sym.PackageName(), tc.pkgName)
} }
} }
func TestIssue66313(t *testing.T) {
tests := []struct {
sym Sym
packageName string
receiverName string
baseName string
}{
{Sym{Name: "github.com/google/cel-go/parser/gen.(*CELLexer).reset+10c630b8"},
"github.com/google/cel-go/parser/gen",
"(*CELLexer)",
"reset+10c630b8",
},
{Sym{Name: "ariga.io/atlas/sql/sqlclient.(*Tx).grabConn+404a5a3"},
"ariga.io/atlas/sql/sqlclient",
"(*Tx)",
"grabConn+404a5a3"},
}
for _, tc := range tests {
assertString(t, fmt.Sprintf("package of %q", tc.sym.Name), tc.sym.PackageName(), tc.packageName)
assertString(t, fmt.Sprintf("receiver of %q", tc.sym.Name), tc.sym.ReceiverName(), tc.receiverName)
assertString(t, fmt.Sprintf("package of %q", tc.sym.Name), tc.sym.BaseName(), tc.baseName)
}
}