1package reflect2
2
3import (
4	"reflect"
5	"unsafe"
6)
7
8type eface struct {
9	rtype unsafe.Pointer
10	data  unsafe.Pointer
11}
12
13func unpackEFace(obj interface{}) *eface {
14	return (*eface)(unsafe.Pointer(&obj))
15}
16
17func 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
25type UnsafeEFaceType struct {
26	unsafeType
27}
28
29func newUnsafeEFaceType(cfg *frozenConfig, type1 reflect.Type) *UnsafeEFaceType {
30	return &UnsafeEFaceType{
31		unsafeType: *newUnsafeType(cfg, type1),
32	}
33}
34
35func (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
44func (type2 *UnsafeEFaceType) UnsafeIsNil(ptr unsafe.Pointer) bool {
45	if ptr == nil {
46		return true
47	}
48	return unpackEFace(*(*interface{})(ptr)).data == nil
49}
50
51func (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
57func (type2 *UnsafeEFaceType) UnsafeIndirect(ptr unsafe.Pointer) interface{} {
58	return *(*interface{})(ptr)
59}
60