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  }