mirror of
https://github.com/golang/go
synced 2024-11-02 09:28:34 +00:00
cmd/gc: fix issue with method wrappers not having escape analysis run on them.
Escape analysis needs the right curfn value on a dclfunc node, otherwise it will not analyze the function. When generating method value wrappers, we forgot to set the curfn correctly. Fixes #5753. R=golang-dev, rsc CC=golang-dev https://golang.org/cl/10383048
This commit is contained in:
parent
428ea6865c
commit
7cfa8310c7
2 changed files with 35 additions and 1 deletions
|
@ -280,7 +280,7 @@ typecheckpartialcall(Node *fn, Node *sym)
|
|||
static Node*
|
||||
makepartialcall(Node *fn, Type *t0, Node *meth)
|
||||
{
|
||||
Node *ptr, *n, *fld, *call, *xtype, *xfunc, *cv;
|
||||
Node *ptr, *n, *fld, *call, *xtype, *xfunc, *cv, *savecurfn;
|
||||
Type *rcvrtype, *basetype, *t;
|
||||
NodeList *body, *l, *callargs, *retargs;
|
||||
char *p;
|
||||
|
@ -305,12 +305,16 @@ makepartialcall(Node *fn, Type *t0, Node *meth)
|
|||
return sym->def;
|
||||
sym->flags |= SymUniq;
|
||||
|
||||
savecurfn = curfn;
|
||||
curfn = N;
|
||||
|
||||
xtype = nod(OTFUNC, N, N);
|
||||
i = 0;
|
||||
l = nil;
|
||||
callargs = nil;
|
||||
ddd = 0;
|
||||
xfunc = nod(ODCLFUNC, N, N);
|
||||
curfn = xfunc;
|
||||
for(t = getinargx(t0)->type; t; t = t->down) {
|
||||
snprint(namebuf, sizeof namebuf, "a%d", i++);
|
||||
n = newname(lookup(namebuf));
|
||||
|
@ -385,6 +389,7 @@ makepartialcall(Node *fn, Type *t0, Node *meth)
|
|||
typecheck(&xfunc, Etop);
|
||||
sym->def = xfunc;
|
||||
xtop = list(xtop, xfunc);
|
||||
curfn = savecurfn;
|
||||
|
||||
return xfunc;
|
||||
}
|
||||
|
|
29
test/fixedbugs/issue5753.go
Normal file
29
test/fixedbugs/issue5753.go
Normal file
|
@ -0,0 +1,29 @@
|
|||
// run
|
||||
|
||||
// Copyright 2013 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 5753: bad typecheck info causes escape analysis to
|
||||
// not run on method thunks.
|
||||
|
||||
package main
|
||||
|
||||
type Thing struct{}
|
||||
|
||||
func (t *Thing) broken(s string) []string {
|
||||
foo := [1]string{s}
|
||||
return foo[:]
|
||||
}
|
||||
|
||||
func main() {
|
||||
t := &Thing{}
|
||||
|
||||
f := t.broken
|
||||
s := f("foo")
|
||||
_ = f("bar")
|
||||
if s[0] != "foo" {
|
||||
panic(`s[0] != "foo"`)
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in a new issue