Skip to content

Commit

Permalink
cmd/gc: fix issue with method wrappers not having escape analysis run…
Browse files Browse the repository at this point in the history
… 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 golang#5753.

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/10383048
  • Loading branch information
DanielMorsing committed Jul 2, 2013
1 parent 428ea68 commit 7cfa831
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 1 deletion.
7 changes: 6 additions & 1 deletion src/cmd/gc/closure.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -304,13 +304,17 @@ makepartialcall(Node *fn, Type *t0, Node *meth)
if(sym->flags & SymUniq)
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));
Expand Down Expand Up @@ -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;
}
Expand Down
29 changes: 29 additions & 0 deletions test/fixedbugs/issue5753.go
Original file line number Diff line number Diff line change
@@ -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"`)
}

}

0 comments on commit 7cfa831

Please sign in to comment.