diff options
Diffstat (limited to 'vendor/gopkg.in/airbrake/gobrake.v2/util.go')
-rw-r--r-- | vendor/gopkg.in/airbrake/gobrake.v2/util.go | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/vendor/gopkg.in/airbrake/gobrake.v2/util.go b/vendor/gopkg.in/airbrake/gobrake.v2/util.go new file mode 100644 index 00000000..c05c0331 --- /dev/null +++ b/vendor/gopkg.in/airbrake/gobrake.v2/util.go @@ -0,0 +1,59 @@ +package gobrake + +import ( + "runtime" + "strings" +) + +func stackFilter(packageName, funcName string, file string, line int) bool { + return packageName == "runtime" && funcName == "panic" +} + +type StackFrame struct { + File string `json:"file"` + Line int `json:"line"` + Func string `json:"function"` +} + +func stack(depth int) []StackFrame { + stack := []StackFrame{} + for i := depth; ; i++ { + pc, file, line, ok := runtime.Caller(i) + if !ok { + break + } + packageName, funcName := packageFuncName(pc) + if stackFilter(packageName, funcName, file, line) { + stack = stack[:0] + continue + } + stack = append(stack, StackFrame{ + File: file, + Line: line, + Func: funcName, + }) + } + + return stack +} + +func packageFuncName(pc uintptr) (string, string) { + f := runtime.FuncForPC(pc) + if f == nil { + return "", "" + } + + packageName := "" + funcName := f.Name() + + if ind := strings.LastIndex(funcName, "/"); ind > 0 { + packageName += funcName[:ind+1] + funcName = funcName[ind+1:] + } + if ind := strings.Index(funcName, "."); ind > 0 { + packageName += funcName[:ind] + funcName = funcName[ind+1:] + } + + return packageName, funcName +} |