github.com/modern-go/reflect2@v1.0.2/unsafe_eface.go (about) 1 package reflect2 2 3 import ( 4 "reflect" 5 "unsafe" 6 ) 7 8 type eface struct { 9 rtype unsafe.Pointer 10 data unsafe.Pointer 11 } 12 13 func unpackEFace(obj interface{}) *eface { 14 return (*eface)(unsafe.Pointer(&obj)) 15 } 16 17 func packEFace(rtype unsafe.Pointer, data unsafe.Pointer) interface{} { 18 var i interface{} 19 e := (*eface)(unsafe.Pointer(&i)) 20 e.rtype = rtype 21 e.data = data 22 return i 23 } 24 25 type UnsafeEFaceType struct { 26 unsafeType 27 } 28 29 func newUnsafeEFaceType(cfg *frozenConfig, type1 reflect.Type) *UnsafeEFaceType { 30 return &UnsafeEFaceType{ 31 unsafeType: *newUnsafeType(cfg, type1), 32 } 33 } 34 35 func (type2 *UnsafeEFaceType) IsNil(obj interface{}) bool { 36 if obj == nil { 37 return true 38 } 39 objEFace := unpackEFace(obj) 40 assertType("Type.IsNil argument 1", type2.ptrRType, objEFace.rtype) 41 return type2.UnsafeIsNil(objEFace.data) 42 } 43 44 func (type2 *UnsafeEFaceType) UnsafeIsNil(ptr unsafe.Pointer) bool { 45 if ptr == nil { 46 return true 47 } 48 return unpackEFace(*(*interface{})(ptr)).data == nil 49 } 50 51 func (type2 *UnsafeEFaceType) Indirect(obj interface{}) interface{} { 52 objEFace := unpackEFace(obj) 53 assertType("Type.Indirect argument 1", type2.ptrRType, objEFace.rtype) 54 return type2.UnsafeIndirect(objEFace.data) 55 } 56 57 func (type2 *UnsafeEFaceType) UnsafeIndirect(ptr unsafe.Pointer) interface{} { 58 return *(*interface{})(ptr) 59 }