From efcc50dfdc94c82ee0292bf71992ecb7c0123061 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Tue, 14 May 2013 18:39:35 +0200 Subject: Imported Upstream version 1.1 --- misc/cgo/test/callback.go | 43 +++++++++++++++++++++++++++++++++++++++++++ misc/cgo/test/cflags.go | 32 ++++++++++++++++++++++++++++++++ misc/cgo/test/cgo_test.go | 3 +++ misc/cgo/test/cthread.go | 6 +----- misc/cgo/test/issue4029.go | 9 +++++---- misc/cgo/test/issue5227.go | 38 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 122 insertions(+), 9 deletions(-) create mode 100644 misc/cgo/test/cflags.go create mode 100644 misc/cgo/test/issue5227.go (limited to 'misc/cgo/test') diff --git a/misc/cgo/test/callback.go b/misc/cgo/test/callback.go index 4f5d3f855..b6e2e3c1c 100644 --- a/misc/cgo/test/callback.go +++ b/misc/cgo/test/callback.go @@ -12,7 +12,9 @@ import "C" import ( "./backdoor" + "path" "runtime" + "strings" "testing" "unsafe" ) @@ -136,3 +138,44 @@ func testBlocking(t *testing.T) { } }) } + +// Test that the stack can be unwound through a call out and call back +// into Go. +func testCallbackCallers(t *testing.T) { + pc := make([]uintptr, 100) + n := 0 + name := []string{ + "test.goCallback", + "runtime.cgocallbackg", + "runtime.cgocallback_gofunc", + "return", + "runtime.cgocall", + "test._Cfunc_callback", + "test.nestedCall", + "test.testCallbackCallers", + "test.TestCallbackCallers", + "testing.tRunner", + "runtime.goexit", + } + nestedCall(func() { + n = runtime.Callers(2, pc) + }) + if n != len(name) { + t.Errorf("expected %d frames, got %d", len(name), n) + } + for i := 0; i < n; i++ { + f := runtime.FuncForPC(pc[i]) + if f == nil { + t.Fatalf("expected non-nil Func for pc %p", pc[i]) + } + fname := f.Name() + // Remove the prepended pathname from automatically + // generated cgo function names. + if strings.HasPrefix(fname, "_") { + fname = path.Base(f.Name()[1:]) + } + if fname != name[i] { + t.Errorf("expected function name %s, got %s", name[i], fname) + } + } +} diff --git a/misc/cgo/test/cflags.go b/misc/cgo/test/cflags.go new file mode 100644 index 000000000..24caab471 --- /dev/null +++ b/misc/cgo/test/cflags.go @@ -0,0 +1,32 @@ +// 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. + +// Test that the #cgo CFLAGS directive works, +// with and without platform filters. +// See http://code.google.com/p/go/issues/detail?id=5224 for details. +package cgotest + +/* +#cgo CFLAGS: -DCOMMON_VALUE=123 +#cgo windows CFLAGS: -DIS_WINDOWS=1 +#cgo !windows CFLAGS: -DIS_WINDOWS=0 +int common = COMMON_VALUE; +int is_windows = IS_WINDOWS; +*/ +import "C" + +import ( + "runtime" + "testing" +) + +func testCflags(t *testing.T) { + is_windows := C.is_windows == 1 + if is_windows != (runtime.GOOS == "windows") { + t.Errorf("is_windows: %v, runtime.GOOS: %s", is_windows, runtime.GOOS) + } + if C.common != 123 { + t.Errorf("common: %v (expected 123)", C.common) + } +} diff --git a/misc/cgo/test/cgo_test.go b/misc/cgo/test/cgo_test.go index 536fa507a..56e1a0625 100644 --- a/misc/cgo/test/cgo_test.go +++ b/misc/cgo/test/cgo_test.go @@ -36,5 +36,8 @@ func TestBoolAlign(t *testing.T) { testBoolAlign(t) } func Test3729(t *testing.T) { test3729(t) } func Test3775(t *testing.T) { test3775(t) } func TestCthread(t *testing.T) { testCthread(t) } +func TestCallbackCallers(t *testing.T) { testCallbackCallers(t) } +func Test5227(t *testing.T) { test5227(t) } +func TestCflags(t *testing.T) { testCflags(t) } func BenchmarkCgoCall(b *testing.B) { benchCgoCall(b) } diff --git a/misc/cgo/test/cthread.go b/misc/cgo/test/cthread.go index d918d033f..68d4a03ea 100644 --- a/misc/cgo/test/cthread.go +++ b/misc/cgo/test/cthread.go @@ -8,7 +8,6 @@ package cgotest import "C" import ( - "runtime" "sync" "testing" ) @@ -31,10 +30,7 @@ func Add(x int) { } func testCthread(t *testing.T) { - if runtime.GOARCH == "arm" { - t.Skip("testCthread disabled on arm") - } - + sum.i = 0 C.doAdd(10, 6) want := 10 * (10 - 1) / 2 * 6 diff --git a/misc/cgo/test/issue4029.go b/misc/cgo/test/issue4029.go index 7495d38fe..b0385eb85 100644 --- a/misc/cgo/test/issue4029.go +++ b/misc/cgo/test/issue4029.go @@ -47,14 +47,15 @@ func test4029(t *testing.T) { func loadThySelf(t *testing.T, symbol string) { this_process := C.dlopen(nil, C.RTLD_NOW) if this_process == nil { - t.Fatal("dlopen:", C.GoString(C.dlerror())) + t.Error("dlopen:", C.GoString(C.dlerror())) + return } defer C.dlclose(this_process) symbol_address := C.dlsym(this_process, C.CString(symbol)) if symbol_address == nil { - t.Fatal("dlsym:", C.GoString(C.dlerror())) - } else { - t.Log(symbol, symbol_address) + t.Error("dlsym:", C.GoString(C.dlerror())) + return } + t.Log(symbol, symbol_address) } diff --git a/misc/cgo/test/issue5227.go b/misc/cgo/test/issue5227.go new file mode 100644 index 000000000..336c4c609 --- /dev/null +++ b/misc/cgo/test/issue5227.go @@ -0,0 +1,38 @@ +// 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 5227: linker incorrectly treats common symbols and +// leaves them undefined. + +package cgotest + +/* +typedef struct { + int Count; +} Fontinfo; + +Fontinfo SansTypeface; + +extern void init(); + +Fontinfo loadfont() { + Fontinfo f = {0}; + return f; +} + +void init() { + SansTypeface = loadfont(); +} +*/ +import "C" + +import "testing" + +func test5227(t *testing.T) { + C.init() +} + +func selectfont() C.Fontinfo { + return C.SansTypeface +} -- cgit v1.2.3