...
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 }
65
View as plain text