Russ Cox | 0b477ef | 2012-02-16 23:48:57 -0500 | [diff] [blame] | 1 | // run |
Rob Pike | 797cc49 | 2009-11-18 15:31:22 -0800 | [diff] [blame] | 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 | |
Rob Pike | fc0dc04 | 2012-02-19 13:19:43 +1100 | [diff] [blame] | 7 | // Semi-exhaustive test for the copy predeclared function. |
Rob Pike | 797cc49 | 2009-11-18 15:31:22 -0800 | [diff] [blame] | 8 | |
| 9 | package main |
| 10 | |
| 11 | import ( |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 12 | "fmt" |
| 13 | "os" |
Rob Pike | 797cc49 | 2009-11-18 15:31:22 -0800 | [diff] [blame] | 14 | ) |
| 15 | |
| 16 | const N = 40 |
| 17 | |
| 18 | var input8 = make([]uint8, N) |
| 19 | var output8 = make([]uint8, N) |
| 20 | var input16 = make([]uint16, N) |
| 21 | var output16 = make([]uint16, N) |
| 22 | var input32 = make([]uint32, N) |
| 23 | var output32 = make([]uint32, N) |
| 24 | var input64 = make([]uint64, N) |
| 25 | var output64 = make([]uint64, N) |
Russ Cox | 0f28983 | 2010-10-26 08:36:23 -0700 | [diff] [blame] | 26 | var inputS string |
| 27 | var outputS = make([]uint8, N) |
| 28 | |
| 29 | type my8 []uint8 |
| 30 | type my16 []uint16 |
| 31 | type my32 []uint32 |
| 32 | type my32b []uint32 |
| 33 | type my64 []uint64 |
| 34 | type myS string |
Rob Pike | 797cc49 | 2009-11-18 15:31:22 -0800 | [diff] [blame] | 35 | |
| 36 | func u8(i int) uint8 { |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 37 | i = 'a' + i%26 |
| 38 | return uint8(i) |
Rob Pike | 797cc49 | 2009-11-18 15:31:22 -0800 | [diff] [blame] | 39 | } |
| 40 | |
| 41 | func u16(ii int) uint16 { |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 42 | var i = uint16(ii) |
| 43 | i = 'a' + i%26 |
| 44 | i |= i << 8 |
| 45 | return i |
Rob Pike | 797cc49 | 2009-11-18 15:31:22 -0800 | [diff] [blame] | 46 | } |
| 47 | |
| 48 | func u32(ii int) uint32 { |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 49 | var i = uint32(ii) |
| 50 | i = 'a' + i%26 |
| 51 | i |= i << 8 |
| 52 | i |= i << 16 |
| 53 | return i |
Rob Pike | 797cc49 | 2009-11-18 15:31:22 -0800 | [diff] [blame] | 54 | } |
| 55 | |
| 56 | func u64(ii int) uint64 { |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 57 | var i = uint64(ii) |
| 58 | i = 'a' + i%26 |
| 59 | i |= i << 8 |
| 60 | i |= i << 16 |
| 61 | i |= i << 32 |
| 62 | return i |
Rob Pike | 797cc49 | 2009-11-18 15:31:22 -0800 | [diff] [blame] | 63 | } |
| 64 | |
| 65 | func reset() { |
Rob Pike | 9682ee4 | 2009-11-18 22:26:36 -0800 | [diff] [blame] | 66 | // swap in and out to exercise copy-up and copy-down |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 67 | input8, output8 = output8, input8 |
| 68 | input16, output16 = output16, input16 |
| 69 | input32, output32 = output32, input32 |
| 70 | input64, output64 = output64, input64 |
| 71 | in := 0 |
| 72 | out := 13 |
Rob Pike | 797cc49 | 2009-11-18 15:31:22 -0800 | [diff] [blame] | 73 | for i := range input8 { |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 74 | input8[i] = u8(in) |
| 75 | output8[i] = u8(out) |
Russ Cox | 0f28983 | 2010-10-26 08:36:23 -0700 | [diff] [blame] | 76 | outputS[i] = u8(out) |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 77 | input16[i] = u16(in) |
| 78 | output16[i] = u16(out) |
| 79 | input32[i] = u32(in) |
| 80 | output32[i] = u32(out) |
| 81 | input64[i] = u64(in) |
| 82 | output64[i] = u64(out) |
| 83 | in++ |
| 84 | out++ |
Rob Pike | 797cc49 | 2009-11-18 15:31:22 -0800 | [diff] [blame] | 85 | } |
Russ Cox | 0f28983 | 2010-10-26 08:36:23 -0700 | [diff] [blame] | 86 | inputS = string(input8) |
Rob Pike | 797cc49 | 2009-11-18 15:31:22 -0800 | [diff] [blame] | 87 | } |
| 88 | |
| 89 | func clamp(n int) int { |
| 90 | if n > N { |
| 91 | return N |
| 92 | } |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 93 | return n |
Rob Pike | 797cc49 | 2009-11-18 15:31:22 -0800 | [diff] [blame] | 94 | } |
| 95 | |
Rob Pike | 9682ee4 | 2009-11-18 22:26:36 -0800 | [diff] [blame] | 96 | func ncopied(length, in, out int) int { |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 97 | n := length |
Rob Pike | 9682ee4 | 2009-11-18 22:26:36 -0800 | [diff] [blame] | 98 | if in+n > N { |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 99 | n = N - in |
Rob Pike | 9682ee4 | 2009-11-18 22:26:36 -0800 | [diff] [blame] | 100 | } |
| 101 | if out+n > N { |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 102 | n = N - out |
Rob Pike | 9682ee4 | 2009-11-18 22:26:36 -0800 | [diff] [blame] | 103 | } |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 104 | return n |
Rob Pike | 9682ee4 | 2009-11-18 22:26:36 -0800 | [diff] [blame] | 105 | } |
| 106 | |
Rob Pike | 797cc49 | 2009-11-18 15:31:22 -0800 | [diff] [blame] | 107 | func doAllSlices(length, in, out int) { |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 108 | reset() |
Russ Cox | 0f28983 | 2010-10-26 08:36:23 -0700 | [diff] [blame] | 109 | n := copy(my8(output8[out:clamp(out+length)]), input8[in:clamp(in+length)]) |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 110 | verify8(length, in, out, n) |
Russ Cox | 0f28983 | 2010-10-26 08:36:23 -0700 | [diff] [blame] | 111 | n = copy(my8(outputS[out:clamp(out+length)]), myS(inputS[in:clamp(in+length)])) |
| 112 | verifyS(length, in, out, n) |
| 113 | n = copy(my16(output16[out:clamp(out+length)]), input16[in:clamp(in+length)]) |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 114 | verify16(length, in, out, n) |
Russ Cox | 0f28983 | 2010-10-26 08:36:23 -0700 | [diff] [blame] | 115 | n = copy(my32(output32[out:clamp(out+length)]), my32b(input32[in:clamp(in+length)])) |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 116 | verify32(length, in, out, n) |
Russ Cox | 0f28983 | 2010-10-26 08:36:23 -0700 | [diff] [blame] | 117 | n = copy(my64(output64[out:clamp(out+length)]), input64[in:clamp(in+length)]) |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 118 | verify64(length, in, out, n) |
Rob Pike | 797cc49 | 2009-11-18 15:31:22 -0800 | [diff] [blame] | 119 | } |
| 120 | |
| 121 | func bad8(state string, i, length, in, out int) { |
| 122 | fmt.Printf("%s bad(%d %d %d): %c not %c:\n\t%s\n\t%s\n", |
| 123 | state, |
| 124 | length, in, out, |
| 125 | output8[i], |
| 126 | uint8(i+13), |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 127 | input8, output8) |
| 128 | os.Exit(1) |
Rob Pike | 797cc49 | 2009-11-18 15:31:22 -0800 | [diff] [blame] | 129 | } |
| 130 | |
Rob Pike | 9682ee4 | 2009-11-18 22:26:36 -0800 | [diff] [blame] | 131 | func verify8(length, in, out, m int) { |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 132 | n := ncopied(length, in, out) |
Rob Pike | 9682ee4 | 2009-11-18 22:26:36 -0800 | [diff] [blame] | 133 | if m != n { |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 134 | fmt.Printf("count bad(%d %d %d): %d not %d\n", length, in, out, m, n) |
| 135 | return |
Rob Pike | 9682ee4 | 2009-11-18 22:26:36 -0800 | [diff] [blame] | 136 | } |
| 137 | // before |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 138 | var i int |
Rob Pike | 9682ee4 | 2009-11-18 22:26:36 -0800 | [diff] [blame] | 139 | for i = 0; i < out; i++ { |
Rob Pike | 797cc49 | 2009-11-18 15:31:22 -0800 | [diff] [blame] | 140 | if output8[i] != u8(i+13) { |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 141 | bad8("before8", i, length, in, out) |
| 142 | return |
Rob Pike | 9682ee4 | 2009-11-18 22:26:36 -0800 | [diff] [blame] | 143 | } |
| 144 | } |
| 145 | // copied part |
| 146 | for ; i < out+n; i++ { |
| 147 | if output8[i] != u8(i+in-out) { |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 148 | bad8("copied8", i, length, in, out) |
| 149 | return |
Rob Pike | 9682ee4 | 2009-11-18 22:26:36 -0800 | [diff] [blame] | 150 | } |
| 151 | } |
| 152 | // after |
| 153 | for ; i < len(output8); i++ { |
| 154 | if output8[i] != u8(i+13) { |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 155 | bad8("after8", i, length, in, out) |
| 156 | return |
Rob Pike | 797cc49 | 2009-11-18 15:31:22 -0800 | [diff] [blame] | 157 | } |
| 158 | } |
| 159 | } |
| 160 | |
Russ Cox | 0f28983 | 2010-10-26 08:36:23 -0700 | [diff] [blame] | 161 | func badS(state string, i, length, in, out int) { |
| 162 | fmt.Printf("%s bad(%d %d %d): %c not %c:\n\t%s\n\t%s\n", |
| 163 | state, |
| 164 | length, in, out, |
| 165 | outputS[i], |
| 166 | uint8(i+13), |
| 167 | inputS, outputS) |
| 168 | os.Exit(1) |
| 169 | } |
| 170 | |
| 171 | func verifyS(length, in, out, m int) { |
| 172 | n := ncopied(length, in, out) |
| 173 | if m != n { |
| 174 | fmt.Printf("count bad(%d %d %d): %d not %d\n", length, in, out, m, n) |
| 175 | return |
| 176 | } |
| 177 | // before |
| 178 | var i int |
| 179 | for i = 0; i < out; i++ { |
| 180 | if outputS[i] != u8(i+13) { |
| 181 | badS("beforeS", i, length, in, out) |
| 182 | return |
| 183 | } |
| 184 | } |
| 185 | // copied part |
| 186 | for ; i < out+n; i++ { |
| 187 | if outputS[i] != u8(i+in-out) { |
| 188 | badS("copiedS", i, length, in, out) |
| 189 | return |
| 190 | } |
| 191 | } |
| 192 | // after |
| 193 | for ; i < len(outputS); i++ { |
| 194 | if outputS[i] != u8(i+13) { |
| 195 | badS("afterS", i, length, in, out) |
| 196 | return |
| 197 | } |
| 198 | } |
| 199 | } |
| 200 | |
Rob Pike | 797cc49 | 2009-11-18 15:31:22 -0800 | [diff] [blame] | 201 | func bad16(state string, i, length, in, out int) { |
| 202 | fmt.Printf("%s bad(%d %d %d): %x not %x:\n\t%v\n\t%v\n", |
| 203 | state, |
| 204 | length, in, out, |
| 205 | output16[i], |
| 206 | uint16(i+13), |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 207 | input16, output16) |
| 208 | os.Exit(1) |
Rob Pike | 797cc49 | 2009-11-18 15:31:22 -0800 | [diff] [blame] | 209 | } |
| 210 | |
Rob Pike | 9682ee4 | 2009-11-18 22:26:36 -0800 | [diff] [blame] | 211 | func verify16(length, in, out, m int) { |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 212 | n := ncopied(length, in, out) |
Rob Pike | 9682ee4 | 2009-11-18 22:26:36 -0800 | [diff] [blame] | 213 | if m != n { |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 214 | fmt.Printf("count bad(%d %d %d): %d not %d\n", length, in, out, m, n) |
| 215 | return |
Rob Pike | 9682ee4 | 2009-11-18 22:26:36 -0800 | [diff] [blame] | 216 | } |
| 217 | // before |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 218 | var i int |
Rob Pike | 9682ee4 | 2009-11-18 22:26:36 -0800 | [diff] [blame] | 219 | for i = 0; i < out; i++ { |
Rob Pike | 797cc49 | 2009-11-18 15:31:22 -0800 | [diff] [blame] | 220 | if output16[i] != u16(i+13) { |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 221 | bad16("before16", i, length, in, out) |
| 222 | return |
Rob Pike | 9682ee4 | 2009-11-18 22:26:36 -0800 | [diff] [blame] | 223 | } |
| 224 | } |
| 225 | // copied part |
| 226 | for ; i < out+n; i++ { |
| 227 | if output16[i] != u16(i+in-out) { |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 228 | bad16("copied16", i, length, in, out) |
| 229 | return |
Rob Pike | 9682ee4 | 2009-11-18 22:26:36 -0800 | [diff] [blame] | 230 | } |
| 231 | } |
| 232 | // after |
| 233 | for ; i < len(output16); i++ { |
| 234 | if output16[i] != u16(i+13) { |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 235 | bad16("after16", i, length, in, out) |
| 236 | return |
Rob Pike | 797cc49 | 2009-11-18 15:31:22 -0800 | [diff] [blame] | 237 | } |
| 238 | } |
| 239 | } |
| 240 | |
| 241 | func bad32(state string, i, length, in, out int) { |
| 242 | fmt.Printf("%s bad(%d %d %d): %x not %x:\n\t%v\n\t%v\n", |
| 243 | state, |
| 244 | length, in, out, |
| 245 | output32[i], |
| 246 | uint32(i+13), |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 247 | input32, output32) |
| 248 | os.Exit(1) |
Rob Pike | 797cc49 | 2009-11-18 15:31:22 -0800 | [diff] [blame] | 249 | } |
| 250 | |
Rob Pike | 9682ee4 | 2009-11-18 22:26:36 -0800 | [diff] [blame] | 251 | func verify32(length, in, out, m int) { |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 252 | n := ncopied(length, in, out) |
Rob Pike | 9682ee4 | 2009-11-18 22:26:36 -0800 | [diff] [blame] | 253 | if m != n { |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 254 | fmt.Printf("count bad(%d %d %d): %d not %d\n", length, in, out, m, n) |
| 255 | return |
Rob Pike | 9682ee4 | 2009-11-18 22:26:36 -0800 | [diff] [blame] | 256 | } |
| 257 | // before |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 258 | var i int |
Rob Pike | 9682ee4 | 2009-11-18 22:26:36 -0800 | [diff] [blame] | 259 | for i = 0; i < out; i++ { |
Rob Pike | 797cc49 | 2009-11-18 15:31:22 -0800 | [diff] [blame] | 260 | if output32[i] != u32(i+13) { |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 261 | bad32("before32", i, length, in, out) |
| 262 | return |
Rob Pike | 9682ee4 | 2009-11-18 22:26:36 -0800 | [diff] [blame] | 263 | } |
| 264 | } |
| 265 | // copied part |
| 266 | for ; i < out+n; i++ { |
| 267 | if output32[i] != u32(i+in-out) { |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 268 | bad32("copied32", i, length, in, out) |
| 269 | return |
Rob Pike | 9682ee4 | 2009-11-18 22:26:36 -0800 | [diff] [blame] | 270 | } |
| 271 | } |
| 272 | // after |
| 273 | for ; i < len(output32); i++ { |
| 274 | if output32[i] != u32(i+13) { |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 275 | bad32("after32", i, length, in, out) |
| 276 | return |
Rob Pike | 797cc49 | 2009-11-18 15:31:22 -0800 | [diff] [blame] | 277 | } |
| 278 | } |
| 279 | } |
| 280 | |
| 281 | func bad64(state string, i, length, in, out int) { |
| 282 | fmt.Printf("%s bad(%d %d %d): %x not %x:\n\t%v\n\t%v\n", |
| 283 | state, |
| 284 | length, in, out, |
| 285 | output64[i], |
| 286 | uint64(i+13), |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 287 | input64, output64) |
| 288 | os.Exit(1) |
Rob Pike | 797cc49 | 2009-11-18 15:31:22 -0800 | [diff] [blame] | 289 | } |
| 290 | |
Rob Pike | 9682ee4 | 2009-11-18 22:26:36 -0800 | [diff] [blame] | 291 | func verify64(length, in, out, m int) { |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 292 | n := ncopied(length, in, out) |
Rob Pike | 9682ee4 | 2009-11-18 22:26:36 -0800 | [diff] [blame] | 293 | if m != n { |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 294 | fmt.Printf("count bad(%d %d %d): %d not %d\n", length, in, out, m, n) |
| 295 | return |
Rob Pike | 9682ee4 | 2009-11-18 22:26:36 -0800 | [diff] [blame] | 296 | } |
| 297 | // before |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 298 | var i int |
Rob Pike | 9682ee4 | 2009-11-18 22:26:36 -0800 | [diff] [blame] | 299 | for i = 0; i < out; i++ { |
Rob Pike | 797cc49 | 2009-11-18 15:31:22 -0800 | [diff] [blame] | 300 | if output64[i] != u64(i+13) { |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 301 | bad64("before64", i, length, in, out) |
| 302 | return |
Rob Pike | 9682ee4 | 2009-11-18 22:26:36 -0800 | [diff] [blame] | 303 | } |
| 304 | } |
| 305 | // copied part |
| 306 | for ; i < out+n; i++ { |
| 307 | if output64[i] != u64(i+in-out) { |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 308 | bad64("copied64", i, length, in, out) |
| 309 | return |
Rob Pike | 9682ee4 | 2009-11-18 22:26:36 -0800 | [diff] [blame] | 310 | } |
| 311 | } |
| 312 | // after |
| 313 | for ; i < len(output64); i++ { |
| 314 | if output64[i] != u64(i+13) { |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 315 | bad64("after64", i, length, in, out) |
| 316 | return |
Rob Pike | 797cc49 | 2009-11-18 15:31:22 -0800 | [diff] [blame] | 317 | } |
| 318 | } |
| 319 | } |
| 320 | |
| 321 | func slice() { |
| 322 | for length := 0; length < N; length++ { |
| 323 | for in := 0; in <= 32; in++ { |
| 324 | for out := 0; out <= 32; out++ { |
| 325 | doAllSlices(length, in, out) |
| 326 | } |
| 327 | } |
| 328 | } |
| 329 | } |
| 330 | |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 331 | // Array test. Can be much simpler. It's only checking for correct handling of [0:]. |
Rob Pike | 797cc49 | 2009-11-18 15:31:22 -0800 | [diff] [blame] | 332 | func array() { |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 333 | var array [N]uint8 |
| 334 | reset() |
| 335 | copy(array[0:], input8) |
Rob Pike | 797cc49 | 2009-11-18 15:31:22 -0800 | [diff] [blame] | 336 | for i := 0; i < N; i++ { |
| 337 | output8[i] = 0 |
| 338 | } |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 339 | copy(output8, array[0:]) |
| 340 | verify8(N, 0, 0, N) |
Rob Pike | 797cc49 | 2009-11-18 15:31:22 -0800 | [diff] [blame] | 341 | } |
| 342 | |
| 343 | func main() { |
Russ Cox | 6aaef04 | 2010-06-08 17:51:57 -0700 | [diff] [blame] | 344 | slice() |
| 345 | array() |
Rob Pike | 797cc49 | 2009-11-18 15:31:22 -0800 | [diff] [blame] | 346 | } |