gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

unsafe_iface.go (1291B)


      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 }