mirror of
https://github.com/superseriousbusiness/gotosocial.git
synced 2025-10-28 18:42:25 -05:00
[chore] bump go-structr to v0.9.9 (#4390)
this improves handling of zero value keys. not something we bump into often, but a useful fix to have in place. Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4390 Co-authored-by: kim <grufwub@gmail.com> Co-committed-by: kim <grufwub@gmail.com>
This commit is contained in:
parent
a79f83cbde
commit
383e41e3e5
6 changed files with 42 additions and 22 deletions
45
vendor/codeberg.org/gruf/go-structr/runtime.go
generated
vendored
45
vendor/codeberg.org/gruf/go-structr/runtime.go
generated
vendored
|
|
@ -18,7 +18,8 @@ import (
|
|||
// including memory offset and hash function.
|
||||
type struct_field struct {
|
||||
|
||||
// mangle ...
|
||||
// struct field type mangling
|
||||
// (i.e. fast serializing) fn.
|
||||
mangle mangler.Mangler
|
||||
|
||||
// zero value data, used when
|
||||
|
|
@ -81,6 +82,10 @@ func find_field(t xunsafe.TypeIter, names []string) (sfield struct_field, ftype
|
|||
field reflect.StructField
|
||||
)
|
||||
|
||||
// Take reference
|
||||
// of parent iter.
|
||||
o := t
|
||||
|
||||
for len(names) > 0 {
|
||||
// Pop next name.
|
||||
name := pop_name()
|
||||
|
|
@ -140,23 +145,41 @@ func find_field(t xunsafe.TypeIter, names []string) (sfield struct_field, ftype
|
|||
// Get mangler from type info.
|
||||
sfield.mangle = mangler.Get(t)
|
||||
|
||||
// Get field type as zero interface.
|
||||
v := reflect.New(t.Type).Elem()
|
||||
vi := v.Interface()
|
||||
|
||||
// Get argument mangler from iface.
|
||||
ti := xunsafe.TypeIterFrom(vi)
|
||||
mangleArg := mangler.Get(ti)
|
||||
|
||||
// Calculate zero value string.
|
||||
zptr := xunsafe.UnpackEface(vi)
|
||||
zstr := string(mangleArg(nil, zptr))
|
||||
zptr := zero_value_field(o, sfield.offsets)
|
||||
zstr := string(sfield.mangle(nil, zptr))
|
||||
sfield.zerostr = zstr
|
||||
sfield.zero = zptr
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// zero_value ...
|
||||
func zero_value(t xunsafe.TypeIter, offsets []next_offset) reflect.Value {
|
||||
v := reflect.New(t.Type).Elem()
|
||||
for _, offset := range offsets {
|
||||
for range offset.derefs {
|
||||
if v.IsNil() {
|
||||
new := reflect.New(v.Type().Elem())
|
||||
v.Set(new)
|
||||
}
|
||||
v = v.Elem()
|
||||
}
|
||||
for i := 0; i < v.NumField(); i++ {
|
||||
if v.Type().Field(i).Offset == offset.offset {
|
||||
v = v.Field(i)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
return v
|
||||
}
|
||||
|
||||
// zero_value_field ...
|
||||
func zero_value_field(t xunsafe.TypeIter, offsets []next_offset) unsafe.Pointer {
|
||||
return zero_value(t, offsets).Addr().UnsafePointer()
|
||||
}
|
||||
|
||||
// extract_fields extracts given structfields from the provided value type,
|
||||
// this is done using predetermined struct field memory offset locations.
|
||||
func extract_fields(ptr unsafe.Pointer, fields []struct_field) []unsafe.Pointer {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue