LEFT | RIGHT |
(no file at all) | |
1 // Copyright 2011 The Go Authors. All rights reserved. | 1 // Copyright 2011 The Go Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style | 2 // Use of this source code is governed by a BSD-style |
3 // license that can be found in the LICENSE file. | 3 // license that can be found in the LICENSE file. |
4 | 4 |
5 package cgotest | 5 package cgotest |
6 | 6 |
7 /* | 7 /* |
8 void callback(void *f); | 8 void callback(void *f); |
9 void callGoFoo(void); | 9 void callGoFoo(void); |
10 void callGoStackCheck(void); | 10 void callGoStackCheck(void); |
11 void callPanic(void); | 11 void callPanic(void); |
12 */ | 12 */ |
13 import "C" | 13 import "C" |
14 | 14 |
15 import ( | 15 import ( |
16 "./backdoor" | |
17 "path" | 16 "path" |
18 "runtime" | 17 "runtime" |
19 "strings" | 18 "strings" |
20 "testing" | 19 "testing" |
21 "unsafe" | 20 "unsafe" |
| 21 |
| 22 "./backdoor" |
22 ) | 23 ) |
23 | 24 |
24 // nestedCall calls into C, back into Go, and finally to f. | 25 // nestedCall calls into C, back into Go, and finally to f. |
25 func nestedCall(f func()) { | 26 func nestedCall(f func()) { |
26 // NOTE: Depends on representation of f. | 27 // NOTE: Depends on representation of f. |
27 // callback(x) calls goCallback(x) | 28 // callback(x) calls goCallback(x) |
28 C.callback(*(*unsafe.Pointer)(unsafe.Pointer(&f))) | 29 C.callback(*(*unsafe.Pointer)(unsafe.Pointer(&f))) |
29 } | 30 } |
30 | 31 |
31 //export goCallback | 32 //export goCallback |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
145 // into Go. | 146 // into Go. |
146 func testCallbackCallers(t *testing.T) { | 147 func testCallbackCallers(t *testing.T) { |
147 if runtime.Compiler != "gc" { | 148 if runtime.Compiler != "gc" { |
148 // The exact function names are not going to be the same. | 149 // The exact function names are not going to be the same. |
149 t.Skip("skipping for non-gc toolchain") | 150 t.Skip("skipping for non-gc toolchain") |
150 } | 151 } |
151 pc := make([]uintptr, 100) | 152 pc := make([]uintptr, 100) |
152 n := 0 | 153 n := 0 |
153 name := []string{ | 154 name := []string{ |
154 "test.goCallback", | 155 "test.goCallback", |
| 156 "runtime.call16", |
155 "runtime.cgocallbackg1", | 157 "runtime.cgocallbackg1", |
156 "runtime.cgocallbackg", | 158 "runtime.cgocallbackg", |
157 "runtime.cgocallback_gofunc", | 159 "runtime.cgocallback_gofunc", |
158 » » "runtime.asmcgocall", | 160 » » "asmcgocall", |
159 » » "runtime.cgocall", | 161 » » "runtime.asmcgocall_errno", |
| 162 » » "runtime.cgocall_errno", |
160 "test._Cfunc_callback", | 163 "test._Cfunc_callback", |
161 "test.nestedCall", | 164 "test.nestedCall", |
162 "test.testCallbackCallers", | 165 "test.testCallbackCallers", |
163 "test.TestCallbackCallers", | 166 "test.TestCallbackCallers", |
164 "testing.tRunner", | 167 "testing.tRunner", |
165 "runtime.goexit", | 168 "runtime.goexit", |
166 } | 169 } |
167 nestedCall(func() { | 170 nestedCall(func() { |
168 n = runtime.Callers(2, pc) | 171 n = runtime.Callers(2, pc) |
169 }) | 172 }) |
170 if n != len(name) { | 173 if n != len(name) { |
171 t.Errorf("expected %d frames, got %d", len(name), n) | 174 t.Errorf("expected %d frames, got %d", len(name), n) |
172 } | 175 } |
173 for i := 0; i < n; i++ { | 176 for i := 0; i < n; i++ { |
174 f := runtime.FuncForPC(pc[i]) | 177 f := runtime.FuncForPC(pc[i]) |
175 if f == nil { | 178 if f == nil { |
176 t.Fatalf("expected non-nil Func for pc %p", pc[i]) | 179 t.Fatalf("expected non-nil Func for pc %p", pc[i]) |
177 } | 180 } |
178 fname := f.Name() | 181 fname := f.Name() |
179 // Remove the prepended pathname from automatically | 182 // Remove the prepended pathname from automatically |
180 // generated cgo function names. | 183 // generated cgo function names. |
181 if strings.HasPrefix(fname, "_") { | 184 if strings.HasPrefix(fname, "_") { |
182 fname = path.Base(f.Name()[1:]) | 185 fname = path.Base(f.Name()[1:]) |
183 } | 186 } |
184 » » if fname != name[i] { | 187 » » namei := "" |
185 » » » t.Errorf("expected function name %s, got %s", name[i], f
name) | 188 » » if i < len(name) { |
| 189 » » » namei = name[i] |
| 190 » » } |
| 191 » » if fname != namei { |
| 192 » » » t.Errorf("stk[%d] = %q, want %q", i, fname, namei) |
186 } | 193 } |
187 } | 194 } |
188 } | 195 } |
189 | 196 |
190 func testPanicFromC(t *testing.T) { | 197 func testPanicFromC(t *testing.T) { |
191 defer func() { | 198 defer func() { |
192 r := recover() | 199 r := recover() |
193 if r == nil { | 200 if r == nil { |
194 t.Fatal("did not panic") | 201 t.Fatal("did not panic") |
195 } | 202 } |
(...skipping 1483 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1679 func stack4964() { var buf [4964]byte; use(buf[:]); C.callGoStackCheck() } | 1686 func stack4964() { var buf [4964]byte; use(buf[:]); C.callGoStackCheck() } |
1680 func stack4968() { var buf [4968]byte; use(buf[:]); C.callGoStackCheck() } | 1687 func stack4968() { var buf [4968]byte; use(buf[:]); C.callGoStackCheck() } |
1681 func stack4972() { var buf [4972]byte; use(buf[:]); C.callGoStackCheck() } | 1688 func stack4972() { var buf [4972]byte; use(buf[:]); C.callGoStackCheck() } |
1682 func stack4976() { var buf [4976]byte; use(buf[:]); C.callGoStackCheck() } | 1689 func stack4976() { var buf [4976]byte; use(buf[:]); C.callGoStackCheck() } |
1683 func stack4980() { var buf [4980]byte; use(buf[:]); C.callGoStackCheck() } | 1690 func stack4980() { var buf [4980]byte; use(buf[:]); C.callGoStackCheck() } |
1684 func stack4984() { var buf [4984]byte; use(buf[:]); C.callGoStackCheck() } | 1691 func stack4984() { var buf [4984]byte; use(buf[:]); C.callGoStackCheck() } |
1685 func stack4988() { var buf [4988]byte; use(buf[:]); C.callGoStackCheck() } | 1692 func stack4988() { var buf [4988]byte; use(buf[:]); C.callGoStackCheck() } |
1686 func stack4992() { var buf [4992]byte; use(buf[:]); C.callGoStackCheck() } | 1693 func stack4992() { var buf [4992]byte; use(buf[:]); C.callGoStackCheck() } |
1687 func stack4996() { var buf [4996]byte; use(buf[:]); C.callGoStackCheck() } | 1694 func stack4996() { var buf [4996]byte; use(buf[:]); C.callGoStackCheck() } |
1688 func stack5000() { var buf [5000]byte; use(buf[:]); C.callGoStackCheck() } | 1695 func stack5000() { var buf [5000]byte; use(buf[:]); C.callGoStackCheck() } |
LEFT | RIGHT |