import (
"internal/goarch"
+ "internal/goexperiment"
"unsafe"
)
}
// src must be in the regular heap.
-
- hbits := heapBitsForAddr(uintptr(src), size)
- for {
- var addr uintptr
- if hbits, addr = hbits.next(); addr == 0 {
- break
+ if goexperiment.AllocHeaders {
+ tp := s.typePointersOf(uintptr(src), size)
+ for {
+ var addr uintptr
+ if tp, addr = tp.next(uintptr(src) + size); addr == 0 {
+ break
+ }
+ v := *(*unsafe.Pointer)(unsafe.Pointer(addr))
+ if cgoIsGoPointer(v) && !isPinned(v) {
+ throw(cgoWriteBarrierFail)
+ }
}
- v := *(*unsafe.Pointer)(unsafe.Pointer(addr))
- if cgoIsGoPointer(v) && !isPinned(v) {
- throw(cgoWriteBarrierFail)
+ } else {
+ hbits := heapBitsForAddr(uintptr(src), size)
+ for {
+ var addr uintptr
+ if hbits, addr = hbits.next(); addr == 0 {
+ break
+ }
+ v := *(*unsafe.Pointer)(unsafe.Pointer(addr))
+ if cgoIsGoPointer(v) && !isPinned(v) {
+ throw(cgoWriteBarrierFail)
+ }
}
}
}