package runtime
import (
)
type slice struct {
array unsafe.Pointer
len int
cap int
}
type notInHeapSlice struct {
array *notInHeap
len int
cap int
}
func () {
panic(errorString("makeslice: len out of range"))
}
func () {
panic(errorString("makeslice: cap out of range"))
}
func ( *_type, int, int, unsafe.Pointer) unsafe.Pointer {
var , uintptr
if uintptr() > uintptr() {
var bool
, = math.MulUintptr(.size, uintptr())
if || > maxAlloc || < 0 {
panicmakeslicelen()
}
= .size * uintptr()
} else {
= .size * uintptr()
=
}
var unsafe.Pointer
if .ptrdata == 0 {
= mallocgc(, nil, false)
if < {
memclrNoHeapPointers(add(, ), -)
}
} else {
= mallocgc(, , true)
if > 0 && writeBarrier.enabled {
bulkBarrierPreWriteSrcOnly(uintptr(), uintptr(), )
}
}
if raceenabled {
:= getcallerpc()
:= abi.FuncPCABIInternal()
racereadrangepc(, , , )
}
if msanenabled {
msanread(, )
}
if asanenabled {
asanread(, )
}
memmove(, , )
return
}
func ( *_type, , int) unsafe.Pointer {
, := math.MulUintptr(.size, uintptr())
if || > maxAlloc || < 0 || > {
, := math.MulUintptr(.size, uintptr())
if || > maxAlloc || < 0 {
panicmakeslicelen()
}
panicmakeslicecap()
}
return mallocgc(, , true)
}
func ( *_type, , int64) unsafe.Pointer {
:= int()
if int64() != {
panicmakeslicelen()
}
:= int()
if int64() != {
panicmakeslicecap()
}
return makeslice(, , )
}
func ( *_type, unsafe.Pointer, int) {
if < 0 {
panicunsafeslicelen()
}
, := math.MulUintptr(.size, uintptr())
if || > -uintptr() {
if == nil {
panic(errorString("unsafe.Slice: ptr is nil and len is not zero"))
}
panicunsafeslicelen()
}
}
func ( *_type, unsafe.Pointer, int64) {
:= int()
if int64() != {
panicunsafeslicelen()
}
unsafeslice(, , )
}
func ( *_type, unsafe.Pointer, int64) {
unsafeslice64(, , )
if checkptrStraddles(, uintptr()*.size) {
throw("checkptr: unsafe.Slice result straddles multiple allocations")
}
}
func () {
panic(errorString("unsafe.Slice: len out of range"))
}
func ( *_type, slice, int) slice {
if raceenabled {
:= getcallerpc()
racereadrangepc(.array, uintptr(.len*int(.size)), , abi.FuncPCABIInternal())
}
if msanenabled {
msanread(.array, uintptr(.len*int(.size)))
}
if asanenabled {
asanread(.array, uintptr(.len*int(.size)))
}
if < .cap {
panic(errorString("growslice: cap out of range"))
}
if .size == 0 {
return slice{unsafe.Pointer(&zerobase), .len, }
}
:= .cap
:= +
if > {
=
} else {
const = 256
if .cap < {
=
} else {
for 0 < && < {
+= ( + 3*) / 4
}
if <= 0 {
=
}
}
}
var bool
var , , uintptr
switch {
case .size == 1:
= uintptr(.len)
= uintptr()
= roundupsize(uintptr())
= uintptr() > maxAlloc
= int()
case .size == goarch.PtrSize:
= uintptr(.len) * goarch.PtrSize
= uintptr() * goarch.PtrSize
= roundupsize(uintptr() * goarch.PtrSize)
= uintptr() > maxAlloc/goarch.PtrSize
= int( / goarch.PtrSize)
case isPowerOfTwo(.size):
var uintptr
if goarch.PtrSize == 8 {
= uintptr(sys.Ctz64(uint64(.size))) & 63
} else {
= uintptr(sys.Ctz32(uint32(.size))) & 31
}
= uintptr(.len) <<
= uintptr() <<
= roundupsize(uintptr() << )
= uintptr() > (maxAlloc >> )
= int( >> )
default:
= uintptr(.len) * .size
= uintptr() * .size
, = math.MulUintptr(.size, uintptr())
= roundupsize()
= int( / .size)
}
if || > maxAlloc {
panic(errorString("growslice: cap out of range"))
}
var unsafe.Pointer
if .ptrdata == 0 {
= mallocgc(, nil, false)
memclrNoHeapPointers(add(, ), -)
} else {
= mallocgc(, , true)
if > 0 && writeBarrier.enabled {
bulkBarrierPreWriteSrcOnly(uintptr(), uintptr(.array), -.size+.ptrdata)
}
}
memmove(, .array, )
return slice{, .len, }
}
func ( uintptr) bool {
return &(-1) == 0
}
func ( unsafe.Pointer, int, unsafe.Pointer, int, uintptr) int {
if == 0 || == 0 {
return 0
}
:=
if < {
=
}
if == 0 {
return
}
:= uintptr() *
if raceenabled {
:= getcallerpc()
:= abi.FuncPCABIInternal()
racereadrangepc(, , , )
racewriterangepc(, , , )
}
if msanenabled {
msanread(, )
msanwrite(, )
}
if asanenabled {
asanread(, )
asanwrite(, )
}
if == 1 {
*(*byte)() = *(*byte)()
} else {
memmove(, , )
}
return
}