mirror of
https://github.com/golang/go
synced 2024-11-24 13:20:15 -07:00
55 lines
879 B
Go
55 lines
879 B
Go
|
// Copyright 2016 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.
|
||
|
|
||
|
package a
|
||
|
|
||
|
import (
|
||
|
"unsafe"
|
||
|
)
|
||
|
|
||
|
func recurse(i int, s []byte) byte {
|
||
|
s[0] = byte(i)
|
||
|
if i == 0 {
|
||
|
return s[i]
|
||
|
} else {
|
||
|
var a [1024]byte
|
||
|
r := recurse(i-1, a[:])
|
||
|
return r + a[0]
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//go:uintptrescapes
|
||
|
func F1(a uintptr) {
|
||
|
var s [16]byte
|
||
|
recurse(4096, s[:])
|
||
|
*(*int)(unsafe.Pointer(a)) = 42
|
||
|
}
|
||
|
|
||
|
//go:uintptrescapes
|
||
|
func F2(a ...uintptr) {
|
||
|
var s [16]byte
|
||
|
recurse(4096, s[:])
|
||
|
*(*int)(unsafe.Pointer(a[0])) = 42
|
||
|
}
|
||
|
|
||
|
type t struct{}
|
||
|
|
||
|
func GetT() *t {
|
||
|
return &t{}
|
||
|
}
|
||
|
|
||
|
//go:uintptrescapes
|
||
|
func (*t) M1(a uintptr) {
|
||
|
var s [16]byte
|
||
|
recurse(4096, s[:])
|
||
|
*(*int)(unsafe.Pointer(a)) = 42
|
||
|
}
|
||
|
|
||
|
//go:uintptrescapes
|
||
|
func (*t) M2(a ...uintptr) {
|
||
|
var s [16]byte
|
||
|
recurse(4096, s[:])
|
||
|
*(*int)(unsafe.Pointer(a[0])) = 42
|
||
|
}
|