]> Cypherpunks repositories - gostls13.git/commitdiff
debug/gosym: simplify parsing symbol name rule
authorLE Manh Cuong <cuong.manhle.vn@gmail.com>
Fri, 4 Jan 2019 18:42:44 +0000 (01:42 +0700)
committerIan Lance Taylor <iant@golang.org>
Sat, 9 Mar 2019 00:24:42 +0000 (00:24 +0000)
Symbol name with linker prefix like "type." and "go." is not parsed
correctly and returns the prefix as parts of package name.

So just returns empty string for symbol name start with linker prefix.

Fixes #29551

Change-Id: Idb4ce872345e5781a5a5da2b2146faeeebd9e63b
Reviewed-on: https://go-review.googlesource.com/c/go/+/156397
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/debug/gosym/symtab.go
src/debug/gosym/symtab_test.go

index a84b7f6def1d9cdb14551c989bbca01e619cfe31..3be612e1df7ab0967847033fc7a96b4547f1e29c 100644 (file)
@@ -35,13 +35,21 @@ func (s *Sym) Static() bool { return s.Type >= 'a' }
 // PackageName returns the package part of the symbol name,
 // or the empty string if there is none.
 func (s *Sym) PackageName() string {
-       pathend := strings.LastIndex(s.Name, "/")
+       name := s.Name
+
+       // A prefix of "type." and "go." is a compiler-generated symbol that doesn't belong to any package.
+       // See variable reservedimports in cmd/compile/internal/gc/subr.go
+       if strings.HasPrefix(name, "go.") || strings.HasPrefix(name, "type.") {
+               return ""
+       }
+
+       pathend := strings.LastIndex(name, "/")
        if pathend < 0 {
                pathend = 0
        }
 
-       if i := strings.Index(s.Name[pathend:], "."); i != -1 {
-               return s.Name[:pathend+i]
+       if i := strings.Index(name[pathend:], "."); i != -1 {
+               return name[:pathend+i]
        }
        return ""
 }
index 08e86336b8eb67eef7e448b41e5ceee89c982772..b6ed8f554c517d8773b6fd439365556e10844de1 100644 (file)
@@ -41,3 +41,18 @@ func TestRemotePackage(t *testing.T) {
        assertString(t, fmt.Sprintf("receiver of %q", s1.Name), s1.ReceiverName(), "(*FlagSet)")
        assertString(t, fmt.Sprintf("receiver of %q", s2.Name), s2.ReceiverName(), "")
 }
+
+func TestIssue29551(t *testing.T) {
+       symNames := []string{
+               "type..eq.[9]debug/elf.intName",
+               "type..hash.debug/elf.ProgHeader",
+               "type..eq.runtime._panic",
+               "type..hash.struct { runtime.gList; runtime.n int32 }",
+               "go.(*struct { sync.Mutex; math/big.table [64]math/big",
+       }
+
+       for _, symName := range symNames {
+               s := Sym{Name: symName}
+               assertString(t, fmt.Sprintf("package of %q", s.Name), s.PackageName(), "")
+       }
+}