...
Source file src/pkg/cmd/compile/internal/gc/bexport.go
1
2
3
4
5 package gc
6
7 import (
8 "cmd/compile/internal/types"
9 )
10
11 type exporter struct {
12 marked map[*types.Type]bool
13 }
14
15
16
17 func (p *exporter) markType(t *types.Type) {
18 if p.marked[t] {
19 return
20 }
21 p.marked[t] = true
22
23
24
25
26
27
28 if t.Sym != nil && t.Etype != TINTER {
29 for _, m := range t.Methods().Slice() {
30 if types.IsExported(m.Sym.Name) {
31 p.markType(m.Type)
32 }
33 }
34 }
35
36
37
38
39
40
41
42
43
44
45 switch t.Etype {
46 case TPTR, TARRAY, TSLICE, TCHAN:
47
48
49 p.markType(t.Elem())
50
51 case TMAP:
52 p.markType(t.Key())
53 p.markType(t.Elem())
54
55 case TSTRUCT:
56 for _, f := range t.FieldSlice() {
57 if types.IsExported(f.Sym.Name) || f.Embedded != 0 {
58 p.markType(f.Type)
59 }
60 }
61
62 case TFUNC:
63
64
65
66 inlFlood(asNode(t.Nname()))
67
68 for _, f := range t.Results().FieldSlice() {
69 p.markType(f.Type)
70 }
71
72 case TINTER:
73 for _, f := range t.FieldSlice() {
74 if types.IsExported(f.Sym.Name) {
75 p.markType(f.Type)
76 }
77 }
78 }
79 }
80
81
82
83
84 const deltaNewFile = -64
85
86
87
88
89
90 const (
91
92 packageTag = -(iota + 1)
93 constTag
94 typeTag
95 varTag
96 funcTag
97 endTag
98
99
100 namedTag
101 arrayTag
102 sliceTag
103 dddTag
104 structTag
105 pointerTag
106 signatureTag
107 interfaceTag
108 mapTag
109 chanTag
110
111
112 falseTag
113 trueTag
114 int64Tag
115 floatTag
116 fractionTag
117 complexTag
118 stringTag
119 nilTag
120 unknownTag
121
122
123 aliasTag
124 )
125
126
127
128
129 func untype(ctype Ctype) *types.Type {
130 switch ctype {
131 case CTINT:
132 return types.Idealint
133 case CTRUNE:
134 return types.Idealrune
135 case CTFLT:
136 return types.Idealfloat
137 case CTCPLX:
138 return types.Idealcomplex
139 case CTSTR:
140 return types.Idealstring
141 case CTBOOL:
142 return types.Idealbool
143 case CTNIL:
144 return types.Types[TNIL]
145 }
146 Fatalf("exporter: unknown Ctype")
147 return nil
148 }
149
150 var predecl []*types.Type
151
152 func predeclared() []*types.Type {
153 if predecl == nil {
154
155
156 predecl = []*types.Type{
157
158 types.Types[TBOOL],
159 types.Types[TINT],
160 types.Types[TINT8],
161 types.Types[TINT16],
162 types.Types[TINT32],
163 types.Types[TINT64],
164 types.Types[TUINT],
165 types.Types[TUINT8],
166 types.Types[TUINT16],
167 types.Types[TUINT32],
168 types.Types[TUINT64],
169 types.Types[TUINTPTR],
170 types.Types[TFLOAT32],
171 types.Types[TFLOAT64],
172 types.Types[TCOMPLEX64],
173 types.Types[TCOMPLEX128],
174 types.Types[TSTRING],
175
176
177 types.Bytetype,
178 types.Runetype,
179
180
181 types.Errortype,
182
183
184 untype(CTBOOL),
185 untype(CTINT),
186 untype(CTRUNE),
187 untype(CTFLT),
188 untype(CTCPLX),
189 untype(CTSTR),
190 untype(CTNIL),
191
192
193 types.Types[TUNSAFEPTR],
194
195
196 types.Types[Txxx],
197
198
199 types.Types[TANY],
200 }
201 }
202 return predecl
203 }
204
View as plain text