]> Cypherpunks.ru repositories - gostls13.git/blobdiff - test/closure.go
cmd/compile/internal/inline: score call sites exposed by inlines
[gostls13.git] / test / closure.go
index 97361a1dfdbc28283bd5b37b9dd3c07d67850043..c4a312464bcf4e130143941e67421b1a1615fa94 100644 (file)
-// $G $D/$F.go && $L $F.$A && ./$A.out
+// run
 
 // Copyright 2009 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.
 
+// Test the behavior of closures.
+
 package main
 
-var c = make(chan int);
+import "runtime"
+
+var c = make(chan int)
 
 func check(a []int) {
        for i := 0; i < len(a); i++ {
-               n := <-c;
+               n := <-c
                if n != a[i] {
-                       panicln("want", a[i], "got", n, "at", i);
+                       println("want", a[i], "got", n, "at", i)
+                       panic("fail")
                }
        }
 }
 
 func f() {
-       var i, j int;
+       var i, j int
 
-       i = 1;
-       j = 2;
+       i = 1
+       j = 2
        f := func() {
-               c <- i;
-               i = 4;
+               c <- i
+               i = 4
                g := func() {
-                       c <- i;
-                       c <- j;
-               };
-               g();
-               c <- i;
-       };
-       j = 5;
-       f();
+                       c <- i
+                       c <- j
+               }
+               g()
+               c <- i
+       }
+       j = 5
+       f()
 }
 
 // Accumulator generator
-func accum(n int) (func(int) int) {
+func accum(n int) func(int) int {
        return func(i int) int {
-               n += i;
-               return n;
+               n += i
+               return n
        }
 }
 
 func g(a, b func(int) int) {
-       c <- a(2);
-       c <- b(3);
-       c <- a(4);
-       c <- b(5);
+       c <- a(2)
+       c <- b(3)
+       c <- a(4)
+       c <- b(5)
 }
 
 func h() {
-       var x8 byte = 100;
-       var x64 int64 = 200;
+       var x8 byte = 100
+       var x64 int64 = 200
 
-       c <- int(x8);
-       c <- int(x64);
+       c <- int(x8)
+       c <- int(x64)
        f := func(z int) {
                g := func() {
-                       c <- int(x8);
-                       c <- int(x64);
-                       c <- z;
-               };
-               g();
-               c <- int(x8);
-               c <- int(x64);
-               c <- int(z);
-       };
-       x8 = 101;
-       x64 = 201;
-       f(500);
+                       c <- int(x8)
+                       c <- int(x64)
+                       c <- z
+               }
+               g()
+               c <- int(x8)
+               c <- int(x64)
+               c <- int(z)
+       }
+       x8 = 101
+       x64 = 201
+       f(500)
 }
 
+func newfunc() func(int) int { return func(x int) int { return x } }
 
 func main() {
-       go f();
-       check([]int{1,4,5,4});
+       runtime.GOMAXPROCS(1)
+       var fail bool
+
+       go f()
+       check([]int{1, 4, 5, 4})
+
+       a := accum(0)
+       b := accum(1)
+       go g(a, b)
+       check([]int{2, 4, 6, 9})
+
+       go h()
+       check([]int{100, 200, 101, 201, 500, 101, 201, 500})
+
+       memstats := new(runtime.MemStats)
+       runtime.ReadMemStats(memstats)
+       n0 := memstats.Mallocs
 
-       a := accum(0);
-       b := accum(1);
-       go g(a, b);
-       check([]int{2,4,6,9});
+       x, y := newfunc(), newfunc()
+       if x(1) != 1 || y(2) != 2 {
+               println("newfunc returned broken funcs")
+               fail = true
+       }
+
+       runtime.ReadMemStats(memstats)
+       if n0 != memstats.Mallocs {
+               println("newfunc allocated unexpectedly")
+               fail = true
+       }
+
+       ff(1)
+
+       if fail {
+               panic("fail")
+       }
+}
+
+func ff(x int) {
+       call(func() {
+               _ = x
+       })
+}
 
-       go h();
-       check([]int{100,200,101,201,500,101,201,500});
+func call(func()) {
 }