You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
879 B
55 lines
879 B
4 months ago
|
// 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
|
||
|
}
|