forked from github/multus-cni
gomodule is still in progress to migrate for now, hence multus team decide to keep vendor directory to support build without gomodule.
75 lines
2.1 KiB
Go
75 lines
2.1 KiB
Go
package reflect2
|
|
|
|
import (
|
|
"reflect"
|
|
"unsafe"
|
|
)
|
|
|
|
type UnsafeStructField struct {
|
|
reflect.StructField
|
|
structType *UnsafeStructType
|
|
rtype unsafe.Pointer
|
|
ptrRType unsafe.Pointer
|
|
}
|
|
|
|
func newUnsafeStructField(structType *UnsafeStructType, structField reflect.StructField) *UnsafeStructField {
|
|
return &UnsafeStructField{
|
|
StructField: structField,
|
|
rtype: unpackEFace(structField.Type).data,
|
|
ptrRType: unpackEFace(reflect.PtrTo(structField.Type)).data,
|
|
structType: structType,
|
|
}
|
|
}
|
|
|
|
func (field *UnsafeStructField) Offset() uintptr {
|
|
return field.StructField.Offset
|
|
}
|
|
|
|
func (field *UnsafeStructField) Name() string {
|
|
return field.StructField.Name
|
|
}
|
|
|
|
func (field *UnsafeStructField) PkgPath() string {
|
|
return field.StructField.PkgPath
|
|
}
|
|
|
|
func (field *UnsafeStructField) Type() Type {
|
|
return field.structType.cfg.Type2(field.StructField.Type)
|
|
}
|
|
|
|
func (field *UnsafeStructField) Tag() reflect.StructTag {
|
|
return field.StructField.Tag
|
|
}
|
|
|
|
func (field *UnsafeStructField) Index() []int {
|
|
return field.StructField.Index
|
|
}
|
|
|
|
func (field *UnsafeStructField) Anonymous() bool {
|
|
return field.StructField.Anonymous
|
|
}
|
|
|
|
func (field *UnsafeStructField) Set(obj interface{}, value interface{}) {
|
|
objEFace := unpackEFace(obj)
|
|
assertType("StructField.SetIndex argument 1", field.structType.ptrRType, objEFace.rtype)
|
|
valueEFace := unpackEFace(value)
|
|
assertType("StructField.SetIndex argument 2", field.ptrRType, valueEFace.rtype)
|
|
field.UnsafeSet(objEFace.data, valueEFace.data)
|
|
}
|
|
|
|
func (field *UnsafeStructField) UnsafeSet(obj unsafe.Pointer, value unsafe.Pointer) {
|
|
fieldPtr := add(obj, field.StructField.Offset, "same as non-reflect &v.field")
|
|
typedmemmove(field.rtype, fieldPtr, value)
|
|
}
|
|
|
|
func (field *UnsafeStructField) Get(obj interface{}) interface{} {
|
|
objEFace := unpackEFace(obj)
|
|
assertType("StructField.GetIndex argument 1", field.structType.ptrRType, objEFace.rtype)
|
|
value := field.UnsafeGet(objEFace.data)
|
|
return packEFace(field.ptrRType, value)
|
|
}
|
|
|
|
func (field *UnsafeStructField) UnsafeGet(obj unsafe.Pointer) unsafe.Pointer {
|
|
return add(obj, field.StructField.Offset, "same as non-reflect &v.field")
|
|
}
|