3 // Copyright 2017 The Go Authors. All rights reserved.
4 // Use of this source code is governed by a BSD-style
5 // license that can be found in the LICENSE file.
16 var pcs = make([]uintptr, 32)
27 npcs = runtime.Callers(skip, pcs)
30 func testCallers(skp int) (frames []string) {
33 for i := 0; i < npcs; i++ {
34 fn := runtime.FuncForPC(pcs[i] - 1)
35 frames = append(frames, fn.Name())
36 if fn.Name() == "main.main" {
43 func testCallersFrames(skp int) (frames []string) {
47 ci := runtime.CallersFrames(callers)
49 frame, more := ci.Next()
50 frames = append(frames, frame.Function)
51 if !more || frame.Function == "main.main" {
58 var expectedFrames [][]string = [][]string{
59 0: {"runtime.Callers", "main.h", "main.g", "main.f", "main.testCallers", "main.main"},
60 1: {"main.h", "main.g", "main.f", "main.testCallers", "main.main"},
61 2: {"main.g", "main.f", "main.testCallers", "main.main"},
62 3: {"main.f", "main.testCallers", "main.main"},
63 4: {"main.testCallers", "main.main"},
67 var allFrames = []string{"runtime.Callers", "main.h", "main.g", "main.f", "main.testCallersFrames", "main.main"}
69 func same(xs, ys []string) bool {
70 if len(xs) != len(ys) {
82 for i := 0; i <= 5; i++ {
83 frames := testCallers(i)
84 expected := expectedFrames[i]
85 if !same(frames, expected) {
86 fmt.Printf("testCallers(%d):\n got %v\n want %v\n", i, frames, expected)
89 frames = testCallersFrames(i)
90 expected = allFrames[i:]
91 if !same(frames, expected) {
92 fmt.Printf("testCallersFrames(%d):\n got %v\n want %v\n", i, frames, expected)