aboutsummaryrefslogtreecommitdiff
path: root/vendor/github.com/Xe/ln/stack.go
blob: 1cf1e7a405f2f0b7d01b4f9e8e2ab7c3f0cf1337 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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)]
}