Russ Cox | 6ee6d6e | 2009-01-28 16:58:48 -0800 | [diff] [blame] | 1 | // $G $D/$F.go && $L $F.$A && ./$A.out |
| 2 | |
| 3 | // Copyright 2009 The Go Authors. All rights reserved. |
| 4 | // Use of this source code is governed by a BSD-style |
| 5 | // license that can be found in the LICENSE file. |
| 6 | |
| 7 | // Try to tickle stack splitting bugs by doing |
Russ Cox | 0f4f2a6 | 2009-02-06 13:46:56 -0800 | [diff] [blame] | 8 | // go, defer, and closure calls at different stack depths. |
Russ Cox | 6ee6d6e | 2009-01-28 16:58:48 -0800 | [diff] [blame] | 9 | |
| 10 | package main |
| 11 | |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 12 | type T [20]int |
Russ Cox | 6ee6d6e | 2009-01-28 16:58:48 -0800 | [diff] [blame] | 13 | |
| 14 | func g(c chan int, t T) { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 15 | s := 0 |
Russ Cox | 6ee6d6e | 2009-01-28 16:58:48 -0800 | [diff] [blame] | 16 | for i := 0; i < len(t); i++ { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 17 | s += t[i] |
Russ Cox | 6ee6d6e | 2009-01-28 16:58:48 -0800 | [diff] [blame] | 18 | } |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 19 | c <- s |
Russ Cox | 6ee6d6e | 2009-01-28 16:58:48 -0800 | [diff] [blame] | 20 | } |
| 21 | |
| 22 | func d(t T) { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 23 | s := 0 |
Russ Cox | 6ee6d6e | 2009-01-28 16:58:48 -0800 | [diff] [blame] | 24 | for i := 0; i < len(t); i++ { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 25 | s += t[i] |
Russ Cox | 6ee6d6e | 2009-01-28 16:58:48 -0800 | [diff] [blame] | 26 | } |
| 27 | if s != len(t) { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 28 | println("bad defer", s) |
| 29 | panic("fail") |
Russ Cox | 6ee6d6e | 2009-01-28 16:58:48 -0800 | [diff] [blame] | 30 | } |
| 31 | } |
| 32 | |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 33 | var c = make(chan int) |
| 34 | var t T |
| 35 | var b = []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} |
Russ Cox | 6ee6d6e | 2009-01-28 16:58:48 -0800 | [diff] [blame] | 36 | |
| 37 | func recur(n int) { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 38 | ss := string(b) |
Russ Cox | 78edbfd | 2009-04-10 06:22:41 -0700 | [diff] [blame] | 39 | if len(ss) != len(b) { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 40 | panic("bad []byte -> string") |
Russ Cox | 78edbfd | 2009-04-10 06:22:41 -0700 | [diff] [blame] | 41 | } |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 42 | go g(c, t) |
| 43 | s := <-c |
Russ Cox | 6ee6d6e | 2009-01-28 16:58:48 -0800 | [diff] [blame] | 44 | if s != len(t) { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 45 | println("bad go", s) |
| 46 | panic("fail") |
Russ Cox | 6ee6d6e | 2009-01-28 16:58:48 -0800 | [diff] [blame] | 47 | } |
Russ Cox | 0f4f2a6 | 2009-02-06 13:46:56 -0800 | [diff] [blame] | 48 | f := func(t T) int { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 49 | s := 0 |
Russ Cox | 0f4f2a6 | 2009-02-06 13:46:56 -0800 | [diff] [blame] | 50 | for i := 0; i < len(t); i++ { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 51 | s += t[i] |
Russ Cox | 0f4f2a6 | 2009-02-06 13:46:56 -0800 | [diff] [blame] | 52 | } |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 53 | s += n |
| 54 | return s |
| 55 | } |
| 56 | s = f(t) |
| 57 | if s != len(t)+n { |
| 58 | println("bad func", s, "at level", n) |
| 59 | panic("fail") |
Russ Cox | 0f4f2a6 | 2009-02-06 13:46:56 -0800 | [diff] [blame] | 60 | } |
Russ Cox | 6ee6d6e | 2009-01-28 16:58:48 -0800 | [diff] [blame] | 61 | if n > 0 { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 62 | recur(n - 1) |
Russ Cox | 6ee6d6e | 2009-01-28 16:58:48 -0800 | [diff] [blame] | 63 | } |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 64 | defer d(t) |
Russ Cox | 6ee6d6e | 2009-01-28 16:58:48 -0800 | [diff] [blame] | 65 | } |
| 66 | |
| 67 | func main() { |
| 68 | for i := 0; i < len(t); i++ { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 69 | t[i] = 1 |
Russ Cox | 6ee6d6e | 2009-01-28 16:58:48 -0800 | [diff] [blame] | 70 | } |
Russ Cox | c6138ef | 2010-04-22 17:52:22 -0700 | [diff] [blame] | 71 | recur(8000) |
Russ Cox | 6ee6d6e | 2009-01-28 16:58:48 -0800 | [diff] [blame] | 72 | } |