]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gc: fix issue with method wrappers not having escape analysis run on them.
authorDaniel Morsing <daniel.morsing@gmail.com>
Tue, 2 Jul 2013 15:12:08 +0000 (17:12 +0200)
committerDaniel Morsing <daniel.morsing@gmail.com>
Tue, 2 Jul 2013 15:12:08 +0000 (17:12 +0200)
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

src/cmd/gc/closure.c
test/fixedbugs/issue5753.go [new file with mode: 0644]

index d81c5281ddf688e06978223d4c3f4492721ed804..996504a114a62536df18274553860222eaee4502 100644 (file)
@@ -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;
@@ -304,6 +304,9 @@ 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;
@@ -311,6 +314,7 @@ makepartialcall(Node *fn, Type *t0, Node *meth)
        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;
 }
diff --git a/test/fixedbugs/issue5753.go b/test/fixedbugs/issue5753.go
new file mode 100644 (file)
index 0000000..230a1e8
--- /dev/null
@@ -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"`)
+       }
+       
+}