]> Cypherpunks.ru repositories - gostls13.git/blobdiff - test/inline_callers.go
cmd/compile/internal/inline: score call sites exposed by inlines
[gostls13.git] / test / inline_callers.go
index c387362fa81da7a07a276422b0bbad9bf84e0980..ee7d6470728cb916c34f3c4e2f73cfa9a1edb31c 100644 (file)
@@ -1,4 +1,4 @@
-// run -gcflags -l=4
+// run -gcflags=-l=4
 
 // Copyright 2017 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
@@ -7,7 +7,7 @@
 package main
 
 import (
-       "log"
+       "fmt"
        "runtime"
 )
 
@@ -31,7 +31,7 @@ func testCallers(skp int) (frames []string) {
        skip = skp
        f()
        for i := 0; i < npcs; i++ {
-               fn := runtime.FuncForPC(pcs[i])
+               fn := runtime.FuncForPC(pcs[i] - 1)
                frames = append(frames, fn.Name())
                if fn.Name() == "main.main" {
                        break
@@ -40,15 +40,32 @@ func testCallers(skp int) (frames []string) {
        return
 }
 
+func testCallersFrames(skp int) (frames []string) {
+       skip = skp
+       f()
+       callers := pcs[:npcs]
+       ci := runtime.CallersFrames(callers)
+       for {
+               frame, more := ci.Next()
+               frames = append(frames, frame.Function)
+               if !more || frame.Function == "main.main" {
+                       break
+               }
+       }
+       return
+}
+
 var expectedFrames [][]string = [][]string{
-       0: {"runtime.Callers", "main.testCallers", "main.main"},
-       1: {"main.testCallers", "main.main"},
-       2: {"main.testCallers", "runtime.skipPleaseUseCallersFrames", "main.main"},
-       3: {"main.testCallers", "runtime.skipPleaseUseCallersFrames", "main.main"},
-       4: {"main.testCallers", "runtime.skipPleaseUseCallersFrames", "main.main"},
+       0: {"runtime.Callers", "main.h", "main.g", "main.f", "main.testCallers", "main.main"},
+       1: {"main.h", "main.g", "main.f", "main.testCallers", "main.main"},
+       2: {"main.g", "main.f", "main.testCallers", "main.main"},
+       3: {"main.f", "main.testCallers", "main.main"},
+       4: {"main.testCallers", "main.main"},
        5: {"main.main"},
 }
 
+var allFrames = []string{"runtime.Callers", "main.h", "main.g", "main.f", "main.testCallersFrames", "main.main"}
+
 func same(xs, ys []string) bool {
        if len(xs) != len(ys) {
                return false
@@ -66,7 +83,13 @@ func main() {
                frames := testCallers(i)
                expected := expectedFrames[i]
                if !same(frames, expected) {
-                       log.Fatalf("testCallers(%d):\n got %v\n want %v", i, frames, expected)
+                       fmt.Printf("testCallers(%d):\n got %v\n want %v\n", i, frames, expected)
+               }
+
+               frames = testCallersFrames(i)
+               expected = allFrames[i:]
+               if !same(frames, expected) {
+                       fmt.Printf("testCallersFrames(%d):\n got %v\n want %v\n", i, frames, expected)
                }
        }
 }