1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- 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")
- }
|