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 { func CallerInfo() []string {
var pc uintptr var pc uintptr
var ok bool
var file string var file string
var line int var line int
var name string var name string
callers := []string{} callers := []string{}
for i := 0; ; i++ { pcs := []uintptr{}
pc, file, line, ok = runtime.Caller(i) n := runtime.Callers(0, pcs)
if !ok { if n == 0 {
// The breaks below failed to terminate the loop, and we ran off the return []string{}
// end of the call stack. }
break 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 // This is a huge edge case, but it will panic if this is the case, see #180
if file == "<autogenerated>" { if file == "<autogenerated>" {
@ -263,6 +267,10 @@ func CallerInfo() []string {
isTest(name, "Example") { isTest(name, "Example") {
break break
} }
if !more {
break
}
} }
return callers return callers