Files
multus-cni/vendor/github.com/modern-go/reflect2/unsafe_iface.go
Tomofumi Hayashi ac21a96804 Revert vendor directory to support old golang (GOPATH mode)
gomodule is still in progress to migrate for now, hence multus
team decide to keep vendor directory to support build without
gomodule.
2019-06-24 16:50:30 +09:00

65 lines
1.3 KiB
Go

package reflect2
import (
"reflect"
"unsafe"
)
type iface struct {
itab *itab
data unsafe.Pointer
}
type itab struct {
ignore unsafe.Pointer
rtype unsafe.Pointer
}
func IFaceToEFace(ptr unsafe.Pointer) interface{} {
iface := (*iface)(ptr)
if iface.itab == nil {
return nil
}
return packEFace(iface.itab.rtype, iface.data)
}
type UnsafeIFaceType struct {
unsafeType
}
func newUnsafeIFaceType(cfg *frozenConfig, type1 reflect.Type) *UnsafeIFaceType {
return &UnsafeIFaceType{
unsafeType: *newUnsafeType(cfg, type1),
}
}
func (type2 *UnsafeIFaceType) Indirect(obj interface{}) interface{} {
objEFace := unpackEFace(obj)
assertType("Type.Indirect argument 1", type2.ptrRType, objEFace.rtype)
return type2.UnsafeIndirect(objEFace.data)
}
func (type2 *UnsafeIFaceType) UnsafeIndirect(ptr unsafe.Pointer) interface{} {
return IFaceToEFace(ptr)
}
func (type2 *UnsafeIFaceType) IsNil(obj interface{}) bool {
if obj == nil {
return true
}
objEFace := unpackEFace(obj)
assertType("Type.IsNil argument 1", type2.ptrRType, objEFace.rtype)
return type2.UnsafeIsNil(objEFace.data)
}
func (type2 *UnsafeIFaceType) UnsafeIsNil(ptr unsafe.Pointer) bool {
if ptr == nil {
return true
}
iface := (*iface)(ptr)
if iface.itab == nil {
return true
}
return false
}