summaryrefslogtreecommitdiff
path: root/vendor/codeberg.org/gruf/go-structr/runtime.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/codeberg.org/gruf/go-structr/runtime.go')
-rw-r--r--vendor/codeberg.org/gruf/go-structr/runtime.go53
1 files changed, 22 insertions, 31 deletions
diff --git a/vendor/codeberg.org/gruf/go-structr/runtime.go b/vendor/codeberg.org/gruf/go-structr/runtime.go
index cc1bcd86d..7db1d7e7a 100644
--- a/vendor/codeberg.org/gruf/go-structr/runtime.go
+++ b/vendor/codeberg.org/gruf/go-structr/runtime.go
@@ -7,31 +7,38 @@ import (
"unicode/utf8"
"unsafe"
+ "codeberg.org/gruf/go-mangler"
"github.com/modern-go/reflect2"
- "github.com/zeebo/xxh3"
)
-type structfield struct {
- // _type is the runtime type pointer
+// struct_field contains pre-prepared type
+// information about a struct's field member,
+// including memory offset and hash function.
+type struct_field struct {
+
+ // type2 is the runtime type pointer
// underlying the struct field type.
// used for repacking our own erfaces.
- _type reflect2.Type
+ type2 reflect2.Type
// offset is the offset in memory
// of this struct field from the
// outer-most value ptr location.
offset uintptr
- // hasher is the relevant function
- // for hashing value of structfield
- // into the supplied hashbuf, where
- // return value indicates if zero.
- hasher func(*xxh3.Hasher, any) bool
+ // struct field type mangling
+ // (i.e. fast serializing) fn.
+ mangle mangler.Mangler
+
+ // mangled zero value string,
+ // if set this indicates zero
+ // values of field not allowed
+ zero string
}
// find_field will search for a struct field with given set of names,
// where names is a len > 0 slice of names account for struct nesting.
-func find_field(t reflect.Type, names []string) (sfield structfield) {
+func find_field(t reflect.Type, names []string) (sfield struct_field) {
var (
// is_exported returns whether name is exported
// from a package; can be func or struct field.
@@ -56,17 +63,6 @@ func find_field(t reflect.Type, names []string) (sfield structfield) {
field reflect.StructField
)
- switch {
- // The only 2 types we support are
- // structs, and ptrs to a struct.
- case t.Kind() == reflect.Struct:
- case t.Kind() == reflect.Pointer &&
- t.Elem().Kind() == reflect.Struct:
- t = t.Elem()
- default:
- panic("index only support struct{} and *struct{}")
- }
-
for len(names) > 0 {
var ok bool
@@ -92,17 +88,17 @@ func find_field(t reflect.Type, names []string) (sfield structfield) {
}
// Get field type as reflect2.
- sfield._type = reflect2.Type2(t)
+ sfield.type2 = reflect2.Type2(t)
- // Find hasher for type.
- sfield.hasher = hasher(t)
+ // Find mangler for field type.
+ sfield.mangle = mangler.Get(t)
return
}
// extract_fields extracts given structfields from the provided value type,
// this is done using predetermined struct field memory offset locations.
-func extract_fields[T any](value T, fields []structfield) []any {
+func extract_fields[T any](value T, fields []struct_field) []any {
// Get ptr to raw value data.
ptr := unsafe.Pointer(&value)
@@ -117,17 +113,12 @@ func extract_fields[T any](value T, fields []structfield) []any {
for i := 0; i < len(fields); i++ {
// Manually access field at memory offset and pack eface.
ptr := unsafe.Pointer(uintptr(ptr) + fields[i].offset)
- ifaces[i] = fields[i]._type.UnsafeIndirect(ptr)
+ ifaces[i] = fields[i].type2.UnsafeIndirect(ptr)
}
return ifaces
}
-// data_ptr returns the runtime data ptr associated with value.
-func data_ptr(a any) unsafe.Pointer {
- return (*struct{ t, v unsafe.Pointer })(unsafe.Pointer(&a)).v
-}
-
// panicf provides a panic with string formatting.
func panicf(format string, args ...any) {
panic(fmt.Sprintf(format, args...))