1// Copyright 2017 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5// +build darwin,cgo,!internal
6
7package cgotest
8
9/*
10#cgo LDFLAGS: -framework CoreFoundation
11#include <CoreFoundation/CoreFoundation.h>
12*/
13import "C"
14import (
15	"runtime/debug"
16	"testing"
17	"unsafe"
18)
19
20func test21897(t *testing.T) {
21	// Please write barrier, kick in soon.
22	defer debug.SetGCPercent(debug.SetGCPercent(1))
23
24	for i := 0; i < 10000; i++ {
25		testCFNumberRef()
26		testCFDateRef()
27		testCFBooleanRef()
28		// Allocate some memory, so eventually the write barrier is enabled
29		// and it will see writes of bad pointers in the test* functions below.
30		byteSliceSink = make([]byte, 1024)
31	}
32}
33
34var byteSliceSink []byte
35
36func testCFNumberRef() {
37	var v int64 = 0
38	xCFNumberRef = C.CFNumberCreate(C.kCFAllocatorSystemDefault, C.kCFNumberSInt64Type, unsafe.Pointer(&v))
39	//fmt.Printf("CFNumberRef: %x\n", uintptr(unsafe.Pointer(xCFNumberRef)))
40}
41
42var xCFNumberRef C.CFNumberRef
43
44func testCFDateRef() {
45	xCFDateRef = C.CFDateCreate(C.kCFAllocatorSystemDefault, 0) // 0 value is 1 Jan 2001 00:00:00 GMT
46	//fmt.Printf("CFDateRef: %x\n", uintptr(unsafe.Pointer(xCFDateRef)))
47}
48
49var xCFDateRef C.CFDateRef
50
51func testCFBooleanRef() {
52	xCFBooleanRef = C.kCFBooleanFalse
53	//fmt.Printf("CFBooleanRef: %x\n", uintptr(unsafe.Pointer(xCFBooleanRef)))
54}
55
56var xCFBooleanRef C.CFBooleanRef
57