Path: blob/main/vendor/github.com/pelletier/go-toml/v2/internal/danger/danger.go
2907 views
package danger12import (3"fmt"4"reflect"5"unsafe"6)78const maxInt = uintptr(int(^uint(0) >> 1))910func SubsliceOffset(data []byte, subslice []byte) int {11datap := (*reflect.SliceHeader)(unsafe.Pointer(&data))12hlp := (*reflect.SliceHeader)(unsafe.Pointer(&subslice))1314if hlp.Data < datap.Data {15panic(fmt.Errorf("subslice address (%d) is before data address (%d)", hlp.Data, datap.Data))16}17offset := hlp.Data - datap.Data1819if offset > maxInt {20panic(fmt.Errorf("slice offset larger than int (%d)", offset))21}2223intoffset := int(offset)2425if intoffset > datap.Len {26panic(fmt.Errorf("slice offset (%d) is farther than data length (%d)", intoffset, datap.Len))27}2829if intoffset+hlp.Len > datap.Len {30panic(fmt.Errorf("slice ends (%d+%d) is farther than data length (%d)", intoffset, hlp.Len, datap.Len))31}3233return intoffset34}3536func BytesRange(start []byte, end []byte) []byte {37if start == nil || end == nil {38panic("cannot call BytesRange with nil")39}40startp := (*reflect.SliceHeader)(unsafe.Pointer(&start))41endp := (*reflect.SliceHeader)(unsafe.Pointer(&end))4243if startp.Data > endp.Data {44panic(fmt.Errorf("start pointer address (%d) is after end pointer address (%d)", startp.Data, endp.Data))45}4647l := startp.Len48endLen := int(endp.Data-startp.Data) + endp.Len49if endLen > l {50l = endLen51}5253if l > startp.Cap {54panic(fmt.Errorf("range length is larger than capacity"))55}5657return start[:l]58}5960func Stride(ptr unsafe.Pointer, size uintptr, offset int) unsafe.Pointer {61// TODO: replace with unsafe.Add when Go 1.17 is released62// https://github.com/golang/go/issues/4048163return unsafe.Pointer(uintptr(ptr) + uintptr(int(size)*offset))64}656667