mirror of
https://github.com/golang/go
synced 2024-09-04 23:44:16 +00:00
![Matthew Dempsky](/assets/img/avatar_default.png)
Previously, after inlining a call, we made a second pass to rewrite the AST's position information to record the inlined stack frame. The call arguments were part of this AST, but it would be incorrect to rewrite them too, so extra effort was made to temporarily remove them while the position rewriting was done. However, this extra logic was only done for regular arguments: it was not done for receiver arguments. Consequently if m was inlined in "f().m(g(), h())", g and h would have correct call frames, but f would appear to be called by m. The fix taken by this CL is to merge setpos into inlsubst and only rewrite position information for nodes that were actually copied from the original function AST body. As a side benefit, this eliminates an extra AST pass and some AST walking code. Fixes #21879. Change-Id: I22b25c208313fc25c358d3a2eebfc9b012400084 Reviewed-on: https://go-review.googlesource.com/64470 Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org>
38 lines
658 B
Go
38 lines
658 B
Go
// run
|
|
|
|
// Copyright 2017 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.
|
|
|
|
package main
|
|
|
|
import (
|
|
"runtime"
|
|
)
|
|
|
|
func main() {
|
|
println(caller().frame.Function)
|
|
|
|
// Used to erroneously print "main.call.name" instead of
|
|
// "main.main".
|
|
println(caller().name())
|
|
}
|
|
|
|
func caller() call {
|
|
var pcs [3]uintptr
|
|
n := runtime.Callers(1, pcs[:])
|
|
frames := runtime.CallersFrames(pcs[:n])
|
|
frame, _ := frames.Next()
|
|
frame, _ = frames.Next()
|
|
|
|
return call{frame: frame}
|
|
}
|
|
|
|
type call struct {
|
|
frame runtime.Frame
|
|
}
|
|
|
|
func (c call) name() string {
|
|
return c.frame.Function
|
|
}
|