|
1 | 1 | package sentry
|
2 | 2 |
|
3 | 3 | import (
|
| 4 | + "errors" |
| 5 | + "fmt" |
4 | 6 | "go/build"
|
5 | 7 | "reflect"
|
6 | 8 | "runtime"
|
@@ -350,14 +352,44 @@ func callerFunctionName() string {
|
350 | 352 | return baseName(callerFrame.Function)
|
351 | 353 | }
|
352 | 354 |
|
| 355 | +func goMajorMinorVersion() (major, minor int, err error) { |
| 356 | + releaseTags := build.Default.ReleaseTags |
| 357 | + if len(releaseTags) == 0 { |
| 358 | + return -1, -1, errors.New("no release tags") |
| 359 | + } |
| 360 | + |
| 361 | + // The last release tag is presumed to be the current release. The current |
| 362 | + // release will be in the form 'go1.2.3'. |
| 363 | + // |
| 364 | + // See https://pkg.go.dev/go/build#Context |
| 365 | + if _, err := fmt.Sscanf(releaseTags[len(releaseTags)-1], "go%d.%d", &major, &minor); err != nil { |
| 366 | + return -1, -1, fmt.Errorf("sscanf: %w", err) |
| 367 | + } |
| 368 | + |
| 369 | + return major, minor, nil |
| 370 | +} |
| 371 | + |
353 | 372 | // packageName returns the package part of the symbol name, or the empty string
|
354 | 373 | // if there is none.
|
355 | 374 | // It replicates https://golang.org/pkg/debug/gosym/#Sym.PackageName, avoiding a
|
356 | 375 | // dependency on debug/gosym.
|
357 | 376 | func packageName(name string) string {
|
358 |
| - // A prefix of "type." and "go." is a compiler-generated symbol that doesn't belong to any package. |
359 |
| - // See variable reservedimports in cmd/compile/internal/gc/subr.go |
360 |
| - if strings.HasPrefix(name, "go.") || strings.HasPrefix(name, "type.") { |
| 377 | + // Since go1.20, a prefix of "type:" and "go:" is a compiler-generated symbol, |
| 378 | + // they do not belong to any package. |
| 379 | + // |
| 380 | + // See cmd/compile/internal/base/link.go:ReservedImports variable. |
| 381 | + major, minor, err := goMajorMinorVersion() |
| 382 | + if err != nil { |
| 383 | + return "" |
| 384 | + } |
| 385 | + goVersionGreaterThanOrEqualTo120 := major > 1 || (major == 1 && minor >= 20) |
| 386 | + |
| 387 | + if goVersionGreaterThanOrEqualTo120 && (strings.HasPrefix(name, "go:") || strings.HasPrefix(name, "type:")) { |
| 388 | + return "" |
| 389 | + } |
| 390 | + |
| 391 | + // For go1.18 and below, the prefix are "type." and "go." instead. |
| 392 | + if !goVersionGreaterThanOrEqualTo120 && (strings.HasPrefix(name, "go.") || strings.HasPrefix(name, "type.")) { |
361 | 393 | return ""
|
362 | 394 | }
|
363 | 395 |
|
|
0 commit comments