forked from go-llvm/llgo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
types.go
176 lines (156 loc) · 2.68 KB
/
types.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
// Copyright 2011 The llgo Authors.
// Use of this source code is governed by an MIT-style
// license that can be found in the LICENSE file.
package runtime
import "unsafe"
// This is a runtime-internal representation of runtimeType.
type rtype struct {
size uintptr
hash uint32
_ uint8
align uint8
fieldAlign uint8
kind uint8
alg *uintptr
gc unsafe.Pointer
string *string
*uncommonType
ptrToThis *rtype
}
type uncommonType struct {
name *string
pkgPath *string
methods []method
}
type method struct {
name *string
pkgPath *string
mtyp *rtype
typ *rtype
ifn unsafe.Pointer
tfn unsafe.Pointer
}
type sliceType struct {
rtype
elem *rtype
}
type mapType struct {
rtype
key *rtype
elem *rtype
}
type imethod struct {
name *string
pkgPath *string
typ *rtype
}
type interfaceType struct {
rtype
methods []imethod
}
type ptrType struct {
rtype
elem *rtype
}
type arrayType struct {
rtype
elem *rtype
slice *rtype
len uintptr
}
type chanType struct {
rtype
elem *rtype
dir uintptr
}
type funcType struct {
rtype
dotdotdot bool
in []*rtype
out []*rtype
}
type structField struct {
name *string
pkgPath *string
typ *rtype
tag *string
offset uintptr
}
type structType struct {
rtype
fields []structField
}
const (
invalidKind uint8 = iota
boolKind
intKind
int8Kind
int16Kind
int32Kind
int64Kind
uintKind
uint8Kind
uint16Kind
uint32Kind
uint64Kind
uintptrKind
float32Kind
float64Kind
complex64Kind
complex128Kind
arrayKind
chanKind
funcKind
interfaceKind
mapKind
ptrKind
sliceKind
stringKind
structKind
unsafePointerKind
)
// eqtyp takes two runtime types and returns true
// iff they are equal.
func eqtyp(t1, t2 *rtype) bool {
if t1 == t2 {
return true
} else if t1 == nil || t2 == nil {
return false
}
if t1.kind == t2.kind {
// TODO check rules for type equality.
//
// Named type equality is covered in the trivial
// case, since there is only one definition for
// each named type.
//
// Basic types are not checked for explicitly,
// as we should never be comparing unnamed basic
// types.
switch t1.kind {
case arrayKind:
case chanKind:
case funcKind:
case interfaceKind:
case mapKind:
case ptrKind:
t1 := (*ptrType)(unsafe.Pointer(t1))
t2 := (*ptrType)(unsafe.Pointer(t2))
return eqtyp(t1.elem, t2.elem)
case sliceKind:
case structKind:
}
}
return false
}
///////////////////////////////////////////////////////////////////////////////
// Types used in runtime function signatures.
type _string struct {
str *uint8
len int
}
type slice struct {
array *uint8
len uint
cap uint
}