45 lines
805 B
Go
45 lines
805 B
Go
|
package ln
|
||
|
|
||
|
import (
|
||
|
"os"
|
||
|
"runtime"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
type frame struct {
|
||
|
filename string
|
||
|
function string
|
||
|
lineno int
|
||
|
}
|
||
|
|
||
|
// skips 2 frames, since Caller returns the current frame, and we need
|
||
|
// the caller's caller.
|
||
|
func callersFrame() frame {
|
||
|
var out frame
|
||
|
pc, file, line, ok := runtime.Caller(3)
|
||
|
if !ok {
|
||
|
return out
|
||
|
}
|
||
|
srcLoc := strings.LastIndex(file, "/src/")
|
||
|
if srcLoc >= 0 {
|
||
|
file = file[srcLoc+5:]
|
||
|
}
|
||
|
out.filename = file
|
||
|
out.function = functionName(pc)
|
||
|
out.lineno = line
|
||
|
|
||
|
return out
|
||
|
}
|
||
|
|
||
|
func functionName(pc uintptr) string {
|
||
|
fn := runtime.FuncForPC(pc)
|
||
|
if fn == nil {
|
||
|
return "???"
|
||
|
}
|
||
|
name := fn.Name()
|
||
|
beg := strings.LastIndex(name, string(os.PathSeparator))
|
||
|
return name[beg+1:]
|
||
|
// end := strings.LastIndex(name, string(os.PathSeparator))
|
||
|
// return name[end+1 : len(name)]
|
||
|
}
|