Stop querying for stack frames multiple times on CallerInfo()

pull/1614/head
Mike Auclair 2024-06-24 16:39:18 +00:00
parent b074924938
commit 3ca01f4bc3
1 changed files with 16 additions and 8 deletions

View File

@ -212,19 +212,23 @@ the problem actually occurred in calling code.*/
func CallerInfo() []string {
var pc uintptr
var ok bool
var file string
var line int
var name string
callers := []string{}
for i := 0; ; i++ {
pc, file, line, ok = runtime.Caller(i)
if !ok {
// The breaks below failed to terminate the loop, and we ran off the
// end of the call stack.
break
}
pcs := []uintptr{}
n := runtime.Callers(0, pcs)
if n == 0 {
return []string{}
}
frames := runtime.CallersFrames(pcs[:n])
for {
frame, more := frames.Next()
pc = frame.PC
file = frame.File
line = frame.Line
// This is a huge edge case, but it will panic if this is the case, see #180
if file == "<autogenerated>" {
@ -263,6 +267,10 @@ func CallerInfo() []string {
isTest(name, "Example") {
break
}
if !more {
break
}
}
return callers