diff options
| author | 2025-08-10 15:05:54 +0200 | |
|---|---|---|
| committer | 2025-08-10 15:05:54 +0200 | |
| commit | 67100809b399b60e58490fa8b1c0a72be75ac820 (patch) | |
| tree | ae6df939bf9fe557a766120bee3363f89b47f961 /vendor/codeberg.org/gruf/go-xunsafe/abi.go | |
| parent | [feature + performance] add JSON logging format (#4355) (diff) | |
| download | gotosocial-67100809b399b60e58490fa8b1c0a72be75ac820.tar.xz | |
[chore] update dependencies (#4361)
- codeberg.org/gruf/go-kv/v2 v2.0.5 => v2.0.6
- github.com/coreos/go-oidc/v3 v3.14.1 => v3.15.0
- github.com/miekg/dns v1.1.67 => v1.1.68
- github.com/tdewolff/minify/v2 v2.23.9 => v2.23.11
- github.com/yuin/goldmark v1.7.12 => v1.7.13
- golang.org/x/crypto v0.40.0 => v0.41.0
- golang.org/x/image v0.29.0 => v0.30.0
- golang.org/x/net v0.42.0 => v0.43.0
- golang.org/x/sys v0.34.0 => v0.35.0
- golang.org/x/text v0.27.0 => v0.28.0
- modernc.org/sqlite v1.38.0 => v1.38.2
Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4361
Co-authored-by: kim <grufwub@gmail.com>
Co-committed-by: kim <grufwub@gmail.com>
Diffstat (limited to 'vendor/codeberg.org/gruf/go-xunsafe/abi.go')
| -rw-r--r-- | vendor/codeberg.org/gruf/go-xunsafe/abi.go | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/vendor/codeberg.org/gruf/go-xunsafe/abi.go b/vendor/codeberg.org/gruf/go-xunsafe/abi.go new file mode 100644 index 000000000..d492f5681 --- /dev/null +++ b/vendor/codeberg.org/gruf/go-xunsafe/abi.go @@ -0,0 +1,109 @@ +//go:build go1.24 && !go1.26 + +package xunsafe + +import ( + "reflect" + "unsafe" +) + +func init() { + // TypeOf(reflect.Type{}) == *struct{ abi.Type{} } + t := reflect.TypeOf(reflect.TypeOf(0)).Elem() + if t.Size() != unsafe.Sizeof(Abi_Type{}) { + panic("Abi_Type{} not in sync with abi.Type{}") + } +} + +const ( + // see: go/src/internal/abi/type.go + Abi_KindDirectIface uint8 = 1 << 5 + Abi_KindMask uint8 = (1 << 5) - 1 +) + +// Abi_Type is a copy of the memory layout of abi.Type{}. +// +// see: go/src/internal/abi/type.go +type Abi_Type struct { + _ uintptr + PtrBytes uintptr + _ uint32 + _ uint8 + _ uint8 + _ uint8 + Kind_ uint8 + _ func(unsafe.Pointer, unsafe.Pointer) bool + _ *byte + _ int32 + _ int32 +} + +// Abi_EmptyInterface is a copy of the memory layout of abi.EmptyInterface{}, +// which is to say also the memory layout of any method-less interface. +// +// see: go/src/internal/abi/iface.go +type Abi_EmptyInterface struct { + Type *Abi_Type + Data unsafe.Pointer +} + +// Abi_NonEmptyInterface is a copy of the memory layout of abi.NonEmptyInterface{}, +// which is to say also the memory layout of any interface containing method(s). +// +// see: go/src/internal/abi/iface.go on 1.25+ +// see: go/src/reflect/value.go on 1.24 +type Abi_NonEmptyInterface struct { + ITab uintptr + Data unsafe.Pointer +} + +// see: go/src/internal/abi/type.go Type.Kind() +func Abi_Type_Kind(t reflect.Type) uint8 { + iface := (*Abi_NonEmptyInterface)(unsafe.Pointer(&t)) + atype := (*Abi_Type)(unsafe.Pointer(iface.Data)) + return atype.Kind_ & Abi_KindMask +} + +// see: go/src/internal/abi/type.go Type.IfaceIndir() +func Abi_Type_IfaceIndir(t reflect.Type) bool { + iface := (*Abi_NonEmptyInterface)(unsafe.Pointer(&t)) + atype := (*Abi_Type)(unsafe.Pointer(iface.Data)) + return atype.Kind_&Abi_KindDirectIface == 0 +} + +// PackIface packs a new reflect.nonEmptyInterface{} using shielded +// itab and data pointer, returning a pointer for caller casting. +func PackIface(itab uintptr, word unsafe.Pointer) unsafe.Pointer { + return unsafe.Pointer(&Abi_NonEmptyInterface{ + ITab: itab, + Data: word, + }) +} + +// GetIfaceITab generates a new value of given type, +// casts it to the generic param interface type, and +// returns the .itab portion of the abi.NonEmptyInterface{}. +// this is useful for later calls to PackIface for known type. +func GetIfaceITab[I any](t reflect.Type) uintptr { + s := reflect.New(t).Elem().Interface().(I) + i := (*Abi_NonEmptyInterface)(unsafe.Pointer(&s)) + return i.ITab +} + +// UnpackEface returns the .Data portion of an abi.EmptyInterface{}. +func UnpackEface(a any) unsafe.Pointer { + return (*Abi_EmptyInterface)(unsafe.Pointer((&a))).Data +} + +// see: go/src/internal/unsafeheader/unsafeheader.go +type Unsafeheader_Slice struct { + Data unsafe.Pointer + Len int + Cap int +} + +// see: go/src/internal/unsafeheader/unsafeheader.go +type Unsafeheader_String struct { + Data unsafe.Pointer + Len int +} |
