| // run | |
| // Copyright 2014 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| // issue 7690 - Stack and other routines did not back up initial PC | |
| // into CALL instruction, instead reporting line number of next instruction, | |
| // which might be on a different line. | |
| package main | |
| import ( | |
| "bytes" | |
| "regexp" | |
| "runtime" | |
| "strconv" | |
| ) | |
| func main() { | |
| buf1 := make([]byte, 1000) | |
| buf2 := make([]byte, 1000) | |
| runtime.Stack(buf1, false) // CALL is last instruction on this line | |
| n := runtime.Stack(buf2, false) // CALL is followed by load of result from stack | |
| buf1 = buf1[:bytes.IndexByte(buf1, 0)] | |
| buf2 = buf2[:n] | |
| re := regexp.MustCompile(`(?m)^main\.main\(\)\n.*/issue7690.go:([0-9]+)`) | |
| m1 := re.FindStringSubmatch(string(buf1)) | |
| if m1 == nil { | |
| println("BUG: cannot find main.main in first trace") | |
| return | |
| } | |
| m2 := re.FindStringSubmatch(string(buf2)) | |
| if m2 == nil { | |
| println("BUG: cannot find main.main in second trace") | |
| return | |
| } | |
| n1, _ := strconv.Atoi(m1[1]) | |
| n2, _ := strconv.Atoi(m2[1]) | |
| if n1+1 != n2 { | |
| println("BUG: expect runtime.Stack on back to back lines, have", n1, n2) | |
| println(string(buf1)) | |
| println(string(buf2)) | |
| } | |
| } |