1package reflect2 2 3import ( 4 "reflect" 5 "unsafe" 6) 7 8type iface struct { 9 itab *itab 10 data unsafe.Pointer 11} 12 13type itab struct { 14 ignore unsafe.Pointer 15 rtype unsafe.Pointer 16} 17 18func 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 26type UnsafeIFaceType struct { 27 unsafeType 28} 29 30func newUnsafeIFaceType(cfg *frozenConfig, type1 reflect.Type) *UnsafeIFaceType { 31 return &UnsafeIFaceType{ 32 unsafeType: *newUnsafeType(cfg, type1), 33 } 34} 35 36func (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 42func (type2 *UnsafeIFaceType) UnsafeIndirect(ptr unsafe.Pointer) interface{} { 43 return IFaceToEFace(ptr) 44} 45 46func (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 55func (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} 65