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